CoffeeScript中的客户端依赖关系管理

时间:2010-11-10 19:16:09

标签: javascript node.js coffeescript

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

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

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

通常,对于JavaScript(和CSS)的客户端打包,您需要某种资产打包插件。我们使用Jammit,但还有许多其他选项:SprocketsDjango-Compress ...等等。

答案 2 :(得分:2)

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

这个代码在这两个文件中:

  • cake.coffee,请参阅determineDependencies()wrapModule()bundleSources()
  • brequire.coffee,要求替换浏览器,以便与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']