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 require
replace的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']