11

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

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

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

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

4

3 回答 3

8

api.export方法目前仅支持顶级变量。它不适用于嵌套变量,因为“事实证明,使用深度导出非常令人困惑”,如果您还导出了,您希望MyApp.myMethod在全局命名空间中出现MyApp.myOtherMethod什么?

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

MyPackage = { 
    myMethod: someSecretMethodName,
    myOtherMethod: otherMethodName
}

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

于 2014-03-14T14:12:53.120 回答
6

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

文件:packages/myapp/namespace.js

MyApp = {};

文件:packages/myapp/package.js

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

文件: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;

文件:packages/myapp-module1/package.js

Package.on_use(function (api, where) {
  api.use([
    'myapp'
  ], ['client', 'server']);
  api.add_files([
    "logic.js"
  ], ['client', 'server']);
});
于 2014-03-18T08:29:32.433 回答
3

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

MyApp = {
   myMethod: ...
};

然后你用api.export('MyApp').

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

于 2014-03-14T14:12:21.233 回答