使用 RequireJS。
在一个名为“my-classes.coffee”的文件中,定义命名空间。
define [], ->
# You need this if you want it to work in multiple environments.
# Otherwise just use `window` to work in the browser.
root = exports ? this
root.MyClasses = {}
您可以在另一个名为“aa.coffee”的文件中定义您的课程。
define ['my-classes'], (MyClasses) ->
class MyClasses.Aa
@someProp: true
另一个文件:
define ['my-classes'], (MyClasses) ->
class MyClasses.Bb
@someProp2: false
现在,当您需要时,它应该导出MyClasses
包括MyClasses.Aa
.
require ['my-classes', 'aa'], (MyClasses, _) ->
console.log MyClasses.Aa.someProp
这样做的一个问题是,您不能只依赖require
语句中的“my-classes”。如果你这样做,MyClasses.Aa
将是未定义的。但是你也不能只依赖“aa”,因为“aa”除了添加到 MyClasses 之外不会导出任何东西。在上面的代码片段中,MyClasses.Bb
是未定义的,因为我没有明确依赖它。这就是为什么许多人要么使用一个巨大的文件,要么复制重新导出命名空间的样板。
如果有人知道如何解决这个问题,请告诉我。
我个人觉得 RequireJS 使用起来很复杂,并且有很多不同的方法来设置它。我将它与 jasmine 一起使用的一种方法是使用蛋糕任务将我的 CoffeeScript 预编译为 JavaScript,然后拥有这样的规范文件。
requirejs = require('requirejs')
# Set the baseURL to your compiled JS dir.
requirejs.config { baseUrl: __dirname + '/../lib' }
requirejs ['my-classes', 'aa'], (MyClasses, _) ->
describe "someProp", ->
it "should be true", ->
expect(MyClasses.Aa.someProp).toEqual true
这可能不是最好的方法,但我能够使用它在浏览器、Node 服务器和 jasmine-node 测试中运行模块。我还看到有些人使用自定义运行器来避免其规范文件中的样板。
如果您不想使用 RequireJS,您可能会发现这个问题很有帮助。它通过使用CoffeeScript 常见问题解答namespace
中定义的函数来工作。