CoffeeScript namespace exports in Meteor custom pa

2020-03-25 14:43发布

问题:

For a few hours, I couldn't get my Meteor package to export variables defined in CoffeeScript files.

In foo.coffee, for example, I tried using @Foo = {foo: 1}, Foo = {foo: 1}, exports.Foo = {foo: 1}, and so on and so forth, but nothing would work.

Finally, after looking at the Meteor coffeescript test package on github, I placed the api.export(); call before the api.on_use() call for that package and it worked.

Any idea why?

My package is set up as follows:

Directory

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");

});

回答1:

Coffeescript compiles

@Foo =
  FooBar: FooBar

to

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

You need to remove the this. before Foo, take a look at namespace, but it's not a good idea since you might need to compile it once you modify the original coffee files.

Here's my trick:

Add a file, named global_variables.js:

Foo = this.Foo;

Then add it in your package.js:

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

Then it just works!



回答2:

Another plain & simple solution:

lib/namespace.coffee

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

package.js

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