使用coffeescript将变量导出到meteor中的应用程序范围,但仍然可以在包范围内使用它

时间:2014-04-21 19:00:38

标签: javascript coffeescript meteor meteorite

我正在处理一个用coffeescript编写的包,它最终会使用api.export将变量导出到应用程序范围(IE我希望这个变量可以在安装此包的任何应用程序中访问) 。 This site发表以下声明(引用):

  
      
  • 普通根级别符号是文件范围的,即在包的其他文件中不可见
  •   
  • 以@开头的符号是包全局变量,即在包的所有文件中都可见。
  •   
  • 导出的符号在包的所有文件和应用程序代码中都可见。但不能以@ -character开头。
  •   

但是,在将此变量导出到应用程序范围之前,我想在此变量中添加一些内容,并且这些操作需要在单独的文件中进行。为了解决这个问题,我试图创建一个包范围变量,修改它,然后在文件范围上创建一个变量,该变量是同一个对象的别名,并导出该变量。这样,我可以在包范围内进行编辑,但我仍然在应用程序范围内拥有导出的变量。

为了模拟这一点,我创建了this small git repository三个类:Base,ClientDeriv和ServerDeriv。 Base位于lib目录中,ClientDerivServerDeriv分别位于clientserver目录中。

lib / Base.coffee (参见编辑:此文件已略有更新)

class @CoffeePackageHandle.Base #this should create a package level variable with this class attatched
 constructor: (@isBase) ->
   return true

CoffeePackageHandle = @CoffeePackageHandle #this is a file scope variable, but we'll use api.export
                                           #make this available in the final app

的客户机/ client-deriv.coffee

class @CoffeePackageHandle.ClientDeriv extends @CoffeePackageHandle.Base
  constructor: (@catchPhrase) ->
    return "I'm on the client, I'm a giant!"

服务器/ server-deriv.coffee

class ServerDeriv extends CoffeePackageHandle.Base
  constructor: (@catchprhase) ->
    return "I'm on the server, I like hamburgers!"

package.js

Package.describe({
  summary: "Test of making packages with coffeescript!"
});

Package.on_use(function(api, where) {
  api.use('coffeescript', ['client', 'server']);
  api.add_files([
    'lib/base.coffee',
    'client/client-deriv.coffee',
    'server/server-deriv.coffee'],
    ['client', 'server']);
  api.export('Coffee-Package-Handle', ['client', 'server']);
});

应用程序几乎开始,但后来我收到以下错误(不再获取此信息,请参阅下面的编辑):

W20140421-14:56:29.607(-4)? (STDERR)
W20140421-14:56:29.611(-4)? (STDERR) /home/AD/arst238/coffee-package/.meteor/local/build/programs/server/boot.js:186
W20140421-14:56:29.613(-4)? (STDERR) }).run();
W20140421-14:56:29.613(-4)? (STDERR)    ^
W20140421-14:56:29.622(-4)? (STDERR) TypeError: Cannot set property 'Base' of undefined
W20140421-14:56:29.623(-4)? (STDERR)     at lib/base.coffee:1:27
W20140421-14:56:29.623(-4)? (STDERR)     at app/lib/base.coffee.js:16:3
W20140421-14:56:29.623(-4)? (STDERR)     at /home/AD/arst238/coffee-package/.meteor/local/build/programs/server/boot.js:155:10
W20140421-14:56:29.624(-4)? (STDERR)     at Array.forEach (native)
W20140421-14:56:29.625(-4)? (STDERR)     at Function._.each._.forEach (/home/AD/arst238/.meteor/tools/c2a0453c51/lib/node_modules/underscore/underscore.js:79:11)
W20140421-14:56:29.625(-4)? (STDERR)     at /home/AD/arst238/coffee-package/.meteor/local/build/programs/server/boot.js:82:5

这是一个简单的测试包,但在我的实际包中我经常会遇到这个错误(这个简单的测试包中也出现了一段时间):

W20140421-14:28:48.330(-4)? (STDERR) /home/AD/arst238/coffee-package/.meteor/local/build/programs/server/boot.js:186
W20140421-14:28:48.331(-4)? (STDERR) }).run();
W20140421-14:28:48.332(-4)? (STDERR)    ^
W20140421-14:28:48.332(-4)? (STDERR) TypeError: Object #<Object> has no method 'describe'
W20140421-14:28:48.333(-4)? (STDERR)     at app/package.js:1:44
W20140421-14:28:48.335(-4)? (STDERR)     at app/package.js:14:3
W20140421-14:28:48.336(-4)? (STDERR)     at /home/AD/arst238/coffee-package/.meteor/local/build/programs/server/boot.js:155:10
W20140421-14:28:48.336(-4)? (STDERR)     at Array.forEach (native)
W20140421-14:28:48.336(-4)? (STDERR)     at Function._.each._.forEach (/home/AD/arst238/.meteor/tools/c2a0453c51/lib/node_modules/underscore/underscore.js:79:11)
W20140421-14:28:48.337(-4)? (STDERR)     at /home/AD/arst238/coffee-package/.meteor/local/build/programs/server/boot.js:82:5

我不确定我做了什么导致这些错误,或者为什么有时我会得到一个而不是另一个。任何帮助将不胜感激!

修改

我可能已经解决了第一个错误,但该解决方案让我仍然遇到第二个错误(TypeError: Object #<Object> has no method 'describe')错误。解决方案是添加生产线 @CoffeePackageHandle = {}lib/base的开头。然后,如果从项目中删除package.js,则应用程序将正确编译并启动。使用package.js,我仍然遇到第二个错误。将更改存储库以反映这些更改。

0 个答案:

没有答案