如何为用 CoffeeScript 编写的类创建命名空间?
例如,我有树类Aa、Bb 和Cc。我希望它们插入全局可访问的命名空间 - MyClasses,允许跨它们进行通信并在 jasmine-node 中使用它们。
class MyClasses.Aa
@someProp: true
class MyClasses.Bb
@someProp2: false
class MyClasses.Cc
@doSomeStuff: -> MyClasses.Aa.someProp = false
我知道,我可以将它们注入(inject)一个文件并编译,但我想要一个类 = 一个文件。
请问我该怎么做? 谢谢!
编辑:我试过这种方式,但我认为它不好,但它在浏览器和 jasmine-node 中有效
root = exports ? this
root.MyClasses = root.MyClasses ? {}
root.MyClasses.Aa =
class Aa
最佳答案
使用 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 一起使用的一种方法是使用 cake 任务将我的 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 测试中运行模块。我还看到有些人使用 custom runners避免在他们的规范文件中使用样板文件。
如果您不想使用 RequireJS,您可能会发现 this question有帮助。它通过使用定义在 CoffeeScript FAQs 上的 namespace
函数来工作。 .
关于coffeescript - 为 CoffeeScript 类创建命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13574352/