如何从Meteor包导出到我的应用程序命名空间?

时间:2014-03-14 13:03:06

标签: javascript meteor javascript-namespaces global-namespace namespace-organisation

我知道how to write Meteor packages但我似乎无法弄清楚如何让所有导出都落在我应用的名称空间中,如in this presentation所述。

这个特定的包特定于我正在构建的应用程序,它只导出一个可以被视为应用程序单例的装饰器的方法。我尝试了api.export('MyApp.myMethod'),但错误native: Bad exported symbol: MyApp.myMethod

如果我只是api.export('myMethod'),那么在应用代码中我必须调用myMethod(),而这不是命名空间。

Meteor是否有类似于Node var http = require('http');的机制?或者如何将包导出到给定的命名空间?

3 个答案:

答案 0 :(得分:8)

top-level variables right now支持api.export方法。它不适用于嵌套变量,因为" 结果证明使用深度导出是 非常混乱",如果您还导出MyApp.myMethod,您希望MyApp.myOtherMethod在全局命名空间中显示什么?

您应该导出MyPackage,然后致电MyPackage.myMethod()。一种常见的方法是执行类似

的操作
MyPackage = { 
    myMethod: someSecretMethodName,
    myOtherMethod: otherMethodName
}

然后拨打api.export("MyPackage")。这意味着变量的导出名称不一定必须是您所称的变量名称。这在核心流星包中经常使用;您还可以查看MongoInternals in mongo_driver.js的示例。

答案 1 :(得分:6)

您在应用程序命名空间中注册的所有属性都可用于依赖(使用)您的app-package的软件包。 因此,当您想在app-namespace中注册一个包命名空间时,您可以在包中声明app-package的依赖关系,并在app-namespace中注册要导出的所有方法/对象。一个例子:

file:packages / myapp / namespace.js

MyApp = {};

file:packages / myapp / package.js

Package.on_use(function (api, where) {
  api.add_files([
    "namespace.js"
  ], ['client', 'server']);
  api.export("MyApp", ['client', 'server']);
});

file:packages / myapp-module1 / logic.js

packageSpecificMethod = function(){}
moduleOne = {};
//you can export an module-specific namespace by registering it in the app-namespace
MyApp.module1 = moduleOne;
//or you can (if you dont want package-namespaces) register you private methods in the app-namespace directly
MyApp.exportedMethod = packageSpecificMethod;

file:packages / myapp-module1 / package.js

Package.on_use(function (api, where) {
  api.use([
    'myapp'
  ], ['client', 'server']);
  api.add_files([
    "logic.js"
  ], ['client', 'server']);
});

答案 2 :(得分:3)

在您的包中,您应该在您希望它们拥有的命名空间中定义所有方法和符号,然后导出该命名空间。所以,如果在你的包中你有:

MyApp = {
   myMethod: ...
};

然后使用api.export('MyApp')导出它。

不幸的是,没有类似于你提到的Node的方法,因为所有包都是在启动时全局加载的。