如果生成的javascript文件最终需要连接在一起以便在客户端使用,那么在CoffeeScript文件中执行依赖关系管理的最佳方法是什么?
对于服务器端CoffeeScript,我可以使用'require'关键字来要求其他javascript。当这是为客户端应用程序编译以具有依赖关系树时,基于需求,计算和生成的连接的独立javascript文件。无论如何以通用的方式做到这一点?
答案 0 :(得分:3)
另一个选择是使用CoffeeToaster,它使用另一种方法而不是实现AMD / CJS模块模式。
答案 1 :(得分:2)
通常,对于JavaScript(和CSS)的客户端打包,您需要某种资产打包插件。我们使用Jammit,但还有许多其他选项:Sprockets,Django-Compress ...等等。
答案 2 :(得分:2)
Villain(一个用于浏览器的CoffeeScript游戏引擎)定义了这样做的函数(依赖关系管理和js连接)。
这个代码在这两个文件中:
determineDependencies()
,wrapModule()
和bundleSources()
wrapModule()
我使用它here(参见'bundle'
Cake任务)。
注意:我只是声明'main'
模块的构建目录,而Villain扫描我编译的JS文件以构建依赖树(从index.js
开始),然后创建一个包含Villain {{}的JavaScript包文件1}}替换和我的所有相关代码已排序并正确包装。
Villain的作者在orona中使用它,这是一个用恶棍制作的CoffeeScript游戏。
答案 3 :(得分:1)
对于客户端的依赖关系管理,我使用requirejs来获取javascript和coffeescript源代码。可以使用requirejs插件加载本机咖啡文件,但我更喜欢“编译”成js。
requirejs还提供/使用r.js optimizer。它可以用来将一组js文件聚合成一个并缩小它。您不必指定要聚合的文件,它是“main.js”所需的每个模块的依赖关系定义。 (符合您要求的功能)
我非常喜欢requirejs,它“promots”创建模块并声明显式依赖。
# 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())
)
答案 4 :(得分:1)
我已经使用过了(我猜我还在使用)requirejs但我已经开始发现它相当笨拙。我的很多文件最终在顶部有大约10-12个进口,只占用了大量空间并且看起来不太好。
对于一个新项目,我尝试了browserify。这很棒!如果您使用grunt(您应该),您可以执行监视任务以在更改时浏览您的代码。 grunt-browserify
还提供了进行咖啡因转换的能力。
https://github.com/jmreidy/grunt-browserify
因此,Gruntfile.coffee
中的观看任务看起来像是:
watch:
files: [
"app/**/*.coffee"
]
tasks: "browserify"
browserify:
'build/app.js': ['app/**/*.coffee']
options:
transform: ['coffeeify']