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

Dan*_*scu 11 javascript namespace-organisation global-namespace javascript-namespaces meteor

我知道如何编写 Meteor包,但我似乎无法弄清楚如何让所有导出都落在我的应用程序的命名空间中,如本演示文稿中所述.

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

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

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

And*_*Mao 8

api.export方法目前仅支持顶级变量.它不适用于嵌套变量,因为" 事实证明使用深度导出非常容易混淆 ",MyApp.myMethod如果你也导出了,你会期望在全局命名空间中出现MyApp.myOtherMethod什么?

你应该导出MyPackage,然后调用MyPackage.myMethod().一种常见的方法是做类似的事情

MyPackage = { 
    myMethod: someSecretMethodName,
    myOtherMethod: otherMethodName
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我想你可能会把自己与命名混淆.包应该导出`MyPackage`,然后可以在应用程序的命名空间中访问它,但它不会成为应用程序命名空间的成员. (2认同)

小智 6

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

file:packages/myapp/namespace.js

MyApp = {};
Run Code Online (Sandbox Code Playgroud)

file:packages/myapp/package.js

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

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;
Run Code Online (Sandbox Code Playgroud)

file:packages/myapp-module1/package.js

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


Hub*_* OG 3

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

MyApp = {
   myMethod: ...
};
Run Code Online (Sandbox Code Playgroud)

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

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