我知道如何编写流星包,但我似乎不知道如何让所有的出口降落在我的应用程序的命名空间,在这个演示中描述的
这个特殊的包是特定于我正在构建的应用程序的,它只导出一个可以被视为应用程序单例中的装饰器的方法。我尝试了api.export('MyApp.myMethod')
,但这给出了错误native: Bad exported symbol: MyApp.myMethod
。
如果我只是api.export('myMethod')
,那么在应用程序代码中我必须调用myMethod()
,并且这不是命名空间。
流星是否有类似于Node的var http = require('http');
的机制?或者包如何将符号导出到给定的名称空间?
api.export
方法目前只支持顶级变量。它不适用于嵌套变量,因为""证明使用深度导出是错误的非常混乱",如果您还导出MyApp.myOtherMethod
,您希望MyApp.myMethod
在全局命名空间中显示为什么?
您应该只导出MyPackage
,然后调用MyPackage.myMethod()
。一种常见的方法是执行类似
MyPackage = {
myMethod: someSecretMethodName,
myOtherMethod: otherMethodName
}
然后调用api.export("MyPackage")
。这意味着导出的变量名不一定是您所称呼的名称。这在核心流星包中使用得很多;你也可以在mongo_driver.js中看到一个关于MongoInternals的例子。
你在应用命名空间中注册的所有属性对于依赖(使用)你的app-package的包都是可用的。所以,当你想在app-namespace中注册一个包命名空间时,你需要在包中声明对app-package的依赖,并在app-namespace中注册你想要导出的所有方法/对象。一个例子:
文件:包/myapp namespace.js
MyApp = {};
文件:包/myapp package.js
Package.on_use(function (api, where) {
api.add_files([
"namespace.js"
], ['client', 'server']);
api.export("MyApp", ['client', 'server']);
});
文件:包/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;
文件:包/myapp-module1 package.js
Package.on_use(function (api, where) {
api.use([
'myapp'
], ['client', 'server']);
api.add_files([
"logic.js"
], ['client', 'server']);
});
在您的包中,您应该在您希望它们拥有的名称空间中定义所有方法和符号,然后导出该名称空间。如果你的包中有:
MyApp = {
myMethod: ...
};
然后用api.export('MyApp')
导出。
不幸的是,Node中没有类似的方法,因为所有的包都是在启动时全局加载的。