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

Posted

技术标签:

【中文标题】如何从 Meteor 包导出到我的应用程序的命名空间?【英文标题】:How can I export from a Meteor package into my app's namespace? 【发布时间】:2014-04-19 18:59:58 【问题描述】:

我知道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'); 的机制吗?或者如何打包导出符号到给定的命名空间?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

MyApp = 
   myMethod: ...
;

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

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

【讨论】:

对不起,我搞砸了,你需要导出MyApp,而不是myMethod。现在编辑答案。另外,请确保使用api.add_files() 添加myPackageCode.js 文件。【参考方案3】:

api.export 方法仅支持 top-level variables right now。它不适用于嵌套变量,因为“原来使用深度导出是 非常令人困惑”,如果您还导出了MyApp.myOtherMethod,您希望MyApp.myMethod 在全局命名空间中出现什么?

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

MyPackage =  
    myMethod: someSecretMethodName,
    myOtherMethod: otherMethodName

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

【讨论】:

所以基本上我不能拥有MyApp.MyPackage.method(),因为那将是一个深度导出? @DanDascalescu 只要您导出顶层MyApp 变量,嵌套MyPackagemyMethod,就可以拥有它。 但这意味着包需要导出MyApp,这在语义上是可疑的。 MyApp 将是应用程序的全局命名空间,@sewdn 的 presentation 建议 MyPackage 应该成为 MyApp 的成员。 我认为您可能对命名法感到困惑。该包应该导出MyPackage,然后它将可以在您的应用程序的命名空间中访问,但它不会成为应用程序命名空间的成员。 让我们continue this discussion in chat。

以上是关于如何从 Meteor 包导出到我的应用程序的命名空间?的主要内容,如果未能解决你的问题,请参考以下文章

在 Meteor 1.0 中加载 NPM 包?

如何在 Meteor 1.3 中通过 NPM 使用引导程序?

如何将meteor.js db 导入远程mongo

Meteor 在哪里存储它的数据?

从 .gql 文件中命名导出多个 graphql 操作

如何在 Meteor 中为全局变量创建自己的命名空间?