11

Meteor パッケージの書き方 は知っていますが、このプレゼンテーションで説明されているように、すべてのエクスポートをアプリの名前空間に配置する方法がわかりません。

この特定のパッケージは、私が構築しているアプリに固有のものであり、アプリのシングルトンでデコレーターと見なすことができるメソッドを 1 つだけエクスポートします。試してみ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.myMethodMyApp.myOtherMethod

をエクスポートMyPackageしてから呼び出す必要がありますMyPackage.myMethod()。一般的なアプローチは、次のようなことをすることです

MyPackage = { 
    myMethod: someSecretMethodName,
    myOtherMethod: otherMethodName
}

そして、呼び出しますapi.export("MyPackage")。つまり、変数のエクスポートされた名前は、必ずしもあなたが呼んだものである必要はありません。これはコア meteor パッケージでよく使われます。mongo_driver.js の MongoInternalsの例も参照できます。

于 2014-03-14T14:12:53.120 に答える
6

アプリの名前空間に登録するすべてのプロパティは、アプリ パッケージに依存する (使用する) パッケージで使用できるようになります。そのため、パッケージの名前空間を app-namespace に登録する場合は、パッケージ内で app-package への依存関係を宣言し、エクスポートするすべてのメソッド/オブジェクトを app-namespace に登録します。例:

ファイル: 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 に答える