如何将 Meteor 包中的内容导出到我的应用程序命名空间中?

11

我知道如何编写 Meteor packages,但是我似乎无法弄清楚如何让所有的导出项都落在我的应用程序命名空间中,就像在这个演示中所描述的那样。

这个特定的包是针对我正在构建的一个应用程序的,它只导出一个可以视为应用程序单例上的修饰符的方法。我尝试了api.export('MyApp.myMethod'),但是它会产生一个错误native: Bad exported symbol: MyApp.myMethod

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

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

3个回答

8
api.export 方法目前仅支持顶层变量。它不适用于嵌套变量,因为“使用深度导出非常令人困惑”,如果您还导出了 MyApp.myOtherMethod,那么您期望 MyApp.myMethod 在全局命名空间中显示为什么?
您应该只导出 MyPackage,然后调用 MyPackage.myMethod()。一个常见的方法是这样做:
MyPackage = { 
    myMethod: someSecretMethodName,
    myOtherMethod: otherMethodName
}

然后调用api.export("MyPackage")。这意味着导出的变量名不一定是您所称呼的名称。在Meteor核心包中经常使用此功能;您还可以在mongo_driver.js文件中的MongoInternals看到一个示例。

1
所以基本上我不能有 MyApp.MyPackage.method(),因为那将是深度导出? - Dan Dascalescu
@DanDascalescu,只要您导出顶层的 MyApp 变量,其中包含嵌套的 MyPackagemyMethod,那么您就可以拥有它。 - Andrew Mao
1
但这意味着包需要导出 MyApp,这在语义上是可疑的。MyApp 将成为应用程序的全局命名空间,@sewdn 的 演示文稿 表明 MyPackage 应成为 MyApp 的成员。 - Dan Dascalescu
2
我认为你可能在混淆术语。该包应该导出MyPackage,然后将在您的应用程序命名空间中变得可访问,但它不会成为应用程序命名空间的成员。 - Andrew Mao
让我们在聊天中继续这个讨论 - user950658

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']);
});

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;

file: packages/myapp-module1/package.js

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

3

在你的包中,你应该在你想要的命名空间中定义所有方法和符号,然后导出该命名空间。因此,如果在你的包中有:

MyApp = {
   myMethod: ...
};

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

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


抱歉,我搞错了,你需要导出 MyApp 而不是 myMethod。现在已经编辑好答案了。另外,请确保使用 api.add_files() 添加 myPackageCode.js 文件。 - Hubert OG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接