如果最终需要将生成的 javascript 文件连接在一起以供客户端使用,那么在 CoffeeScript 文件中进行依赖管理的最佳方法是什么?
对于服务器端 CoffeeScript,我可以只使用 'require' 关键字来要求其他 javascript 片段。当为客户端应用程序编译它以具有依赖关系树时,根据需要,计算并生成连接的独立 javascript 文件。反正有没有以通用的方式做到这一点?
如果最终需要将生成的 javascript 文件连接在一起以供客户端使用,那么在 CoffeeScript 文件中进行依赖管理的最佳方法是什么?
对于服务器端 CoffeeScript,我可以只使用 'require' 关键字来要求其他 javascript 片段。当为客户端应用程序编译它以具有依赖关系树时,根据需要,计算并生成连接的独立 javascript 文件。反正有没有以通用的方式做到这一点?
另一种选择是使用 CoffeeToaster,它使用了不同于实现 AMD / CJS 模块模式的另一种方法。
Villain(浏览器的 CoffeeScript 游戏引擎)定义了执行此操作的函数(依赖管理和 js 连接)。
代码在这两个文件中:
determineDependencies()
, wrapModule()
, 和bundleSources()
wrapModule()
我在这里使用它(参见'bundle'
Cake 任务)。
注意:我只是声明了'main'
模块的构建目录,Villain 扫描我编译的 JS 文件以构建依赖关系树(以 开头index.js
),然后创建一个 JavaScript 包文件,其中包含 Villain 的require
替换以及我所有相关代码的排序和正确包装。
Villain 的作者在使用Villain 制作的 CoffeeScript 游戏orona中使用了它。
通常,对于 JavaScript(和 CSS)的客户端打包,您需要某种资产打包插件。我们使用Jammit,但还有许多其他选项:Sprockets、Django-Compress ……等等。
对于客户端的依赖管理,我将requirejs用于 javascript 和 coffeescript 源。可以使用 requirejs 插件来加载原生的咖啡文件,但我更喜欢“编译”成 js。
requirejs还提供/使用r.js 优化器。它可用于将一组 js 文件聚合为一个并缩小它。您不必指定要聚合的文件,它是“main.js”所需的每个模块的依赖项定义。(符合您要求的功能)
我非常喜欢 requirejs 的东西,它“促进”创建模块并声明显式依赖项。
# 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 个导入,它们占用了大量空间并且看起来不太好。
对于一个新项目,我尝试了 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']