我知道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');
的机制?或者如何将包导出到给定的命名空间?
答案 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的方法,因为所有包都是在启动时全局加载的。