【问题标题】:CoffeeScript namespace exports in Meteor custom packages流星自定义包中的 CoffeeScript 命名空间导出
【发布时间】:2014-06-10 11:11:46
【问题描述】:

有几个小时,我无法让我的 Meteor 包导出在 CoffeeScript 文件中定义的变量。

例如,在foo.coffee 中,我尝试使用@Foo = {foo: 1}Foo = {foo: 1}exports.Foo = {foo: 1} 等等,但没有任何效果

最后,在查看 Meteor coffeescript test package on github 之后,我将 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");

});

【问题讨论】:

    标签: coffeescript meteor


    【解决方案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');
    

    【讨论】:

      【解决方案2】:

      Coffeescript 编译

      @Foo =
        FooBar: FooBar
      

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

      您需要在Foo 之前删除this.,看看namespace,但这不是一个好主意,因为您可能需要在修改原始咖啡文件后对其进行编译。

      这是我的诀窍:

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

      Foo = this.Foo;
      

      然后将它添加到你的 package.js 中:

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

      然后它就可以工作了!

      【讨论】:

      • +1 表示全局定义文件。我同意,我想避免在编译后编辑咖啡脚本文件。我想知道是否有一种干净的方法来monkeypatch Meteor 的内置coffeescript 包...
      • 顺便说一句,我很高兴使用api.export 调用来声明变量之前 api.add_files(如我的问题中所述)。我真的很好奇为什么会这样。
      • 我更喜欢将 Foo = this.Foo; 添加到 package.js 的顶部
      猜你喜欢
      • 2013-02-22
      • 2012-11-27
      • 2020-07-13
      • 1970-01-01
      • 2011-09-07
      • 2021-02-26
      • 1970-01-01
      • 2017-08-20
      • 1970-01-01
      相关资源
      最近更新 更多