Meteor自定义包中的CoffeeScript命名空间导出

3
几个小时内,我无法让我的Meteor包导出在CoffeeScript文件中定义的变量。
例如,在foo.coffee中,我尝试使用@Foo = {foo: 1}Foo = {foo: 1}exports.Foo = {foo: 1}等等,但是什么都不起作用。
最终,在查看Meteor github上的coffeescript测试包之后,我将api.export();调用放在了该包的api.on_use()调用之前,然后它就正常工作了。
有任何想法为什么会这样吗?
我的包设置如下:
foo/
    .meteor/
    .build/
    foo.coffee
    package.js

foo.coffee

class FooBar
  constructor: ->

Foo =
  FooBar: FooBar

package.js

Package.describe({
    summary: "A package that makes foo with foobar"
});

Package.on_use(function(api) {
    api.use("coffeescript", "client");
    api.export("Foo", "client"); // <-- Moved this to *before* the on_use declaration

    api.add_files("foo.coffee", "client");

});
2个回答

10

CoffeeScript 编译

@Foo =
  FooBar: FooBar
(function() {
  this.Foo = { 
    FooBar: FooBar
  };  
}).call(this);

Foo之前需要删除this.,请参考命名空间,但这不是一个好主意,因为一旦修改了原始的coffee文件,您可能需要重新编译它。

以下是我的技巧:

添加一个名为global_variables.js的文件:

Foo = this.Foo;

然后将它添加到您的package.js文件中:

api.add_files('xxx', 'xxx', 'global_variables.js');

然后它就可以正常工作了!


+1 给全局定义文件。我同意,我想避免在编译后编辑 coffeescript 文件。我想知道是否有一种干净的方法来 monkeypatch Meteor 的内置 coffeescript 包... - Joel Cornett
顺便提一下,我非常满意使用api.export调用在api.add_files之前声明变量(如我的问题所述)。我只是好奇为什么这样可以运行。 - Joel Cornett
我更喜欢在 package.js 的顶部添加 Foo = this.Foo; - Sinetheta

1
另一个简单明了的解决方案:

lib/namespace.coffee

Users = {} # This is a local variable
@Users = Users # Globalize your variable

package.js

api.addFiles('lib/namespace.coffee');
api.export('Users');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接