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



我知道如何编写流星包,但我似乎不知道如何让所有的出口降落在我的应用程序的命名空间,在这个演示中描述的

这个特殊的包是特定于我正在构建的应用程序的,它只导出一个可以被视为应用程序单例中的装饰器的方法。我尝试了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中没有类似的方法,因为所有的包都是在启动时全局加载的。

相关内容

  • 没有找到相关文章

最新更新