CoffeeScript中的客户端依赖pipe理

如果最终需要将生成的JavaScript文件连接在一起以便在客户端使用,那么在CoffeeScript文件中进行依赖pipe理的最佳方法是什么?

对于服务器端的CoffeeScript,我可以使用'require'关键字来要求其他的javascript。 当这是为客户端应用程序编译具有依赖关系树,根据需要,计算和一个串联的独立JavaScript文件生成。 无论如何,以通用的方式做到这一点?

另一个select是使用CoffeeToaster,它使用另一种方法,而不是实现AMD / CJS模块模式。

看看: http : //github.com/serpentem/coffee-toaster

通常,对于JavaScript(和CSS)的客户端打包,您需要某种资产打包插件。 我们使用Jammit ,但是还有很多其他的select: Sprockets , Django-Compress …等等。

Villain (一个适用于浏览器的CoffeeScript游戏引擎)定义了这样做的函数(依赖pipe理和js连接)。

代码是在这两个文件中:

  • cake.coffee ,请参阅determineDependencies()wrapModule()bundleSources()
  • brequire.coffee ,一个需要replace浏览器,使用wrapModule()

我在这里使用它(请参阅'bundle' bundle'Cake任务)。

注意:我只声明'main'模块的构build目录,Villain扫描我编译的JS文件以构build依赖树(从index.js开始),然后创build一个包含Villain requirereplace的JavaScript包文件,并将所有相关的代码sorting正确包装。

Villain的作者在orona中使用它, 这是一个与Villain合作的CoffeeScript游戏。

对于客户端的依赖pipe理,我使用requirejs作为javascript和coffeescript源代码。 可以使用requirejs插件来加载原生的咖啡文件,但我更愿意“编译”成js。

requirejs还提供/使用r.js优化器 。 它可以用来将一组js文件聚合成一个,并将其缩小。 你不必指定文件来进行聚合,而是你的“main.js”所要求的每个模块的依赖性定义。 (function符合您的要求)

我喜欢requirejs的东西,它“promots”创build模块和声明显式依赖。

 # A.coffee define(() -> class A constructor: (@c1, @c2) -> @c2 ?= 1 m1 : () -> "hello" toString : () -> "#{@c1}#{@c2}" ) # B.coffee define(['A'], (A) -> a = new A(33) console.log(a, a.m1()) ) 

我已经使用(我想我仍然在使用)requirejs,但我已经开始发现它相当笨拙。 我的很多文件最终都有10-12个import,只占用很多空间,看起来不太好。

对于一个新项目,我尝试了浏览。 这很棒! 如果你使用grunt(你应该),你可以做一个监视任务来改变你的代码。 grunt-browserify还提供了执行coffeescript转换的function。

https://github.com/jmreidy/grunt-browserify

所以你的Gruntfile.coffee watch任务看起来像这样:

 watch: files: [ "app/**/*.coffee" ] tasks: "browserify" browserify: 'build/app.js': ['app/**/*.coffee'] options: transform: ['coffeeify']