Как я могу экспортировать из пакета Meteor в пространство имен моего приложения?

Я знаю как писать Пакеты Meteor, но я не могу понять, как разместить все экспорты в пространстве имен моего приложения, как описано в этой презентации.

Этот конкретный пакет специфичен для приложения, которое я создаю, и он экспортирует только один метод, который можно рассматривать как декоратор для синглтона приложения. Я пробовал api.export('MyApp.myMethod'), но это дает ошибку native: Bad exported symbol: MyApp.myMethod.

Если я просто api.export('myMethod'), то в коде приложения я должен вызвать myMethod(), и это не пространство имен.

Есть ли у Meteor механизм, аналогичный Node var http = require('http');? Или как пакеты могут экспортировать символы в заданное пространство имен?


person Dan Dascalescu    schedule 14.03.2014    source источник


Ответы (3)


Метод api.export поддерживается только для top- переменные уровня прямо сейчас. Это не работает для вложенных переменных, потому что «оказалось, что использование глубокого экспорта очень запутанно», и что вы ожидаете от MyApp.myMethod в глобальном пространстве имен, если вы также экспортируете MyApp.myOtherMethod?

Вы должны просто экспортировать MyPackage, а затем вызвать MyPackage.myMethod(). Общий подход состоит в том, чтобы сделать что-то вроде

MyPackage = { 
    myMethod: someSecretMethodName,
    myOtherMethod: otherMethodName
}

А затем позвоните api.export("MyPackage"). Это означает, что экспортируемые имена переменных не обязательно должны быть такими, какими вы их назвали. Это часто используется в основных метеорных пакетах; вы также можете увидеть пример для MongoInternals в mongo_driver.js.

person Andrew Mao    schedule 14.03.2014
comment
По сути, я не могу иметь MyApp.MyPackage.method(), потому что это будет глубокий экспорт? - person Dan Dascalescu; 18.03.2014
comment
@DanDascalescu у вас может быть это, если вы экспортируете переменную MyApp верхнего уровня с вложенными MyPackage и myMethod. - person Andrew Mao; 18.03.2014
comment
Но это означает, что пакет должен будет экспортировать MyApp, что семантически сомнительно. MyApp будет глобальным пространством имен приложения, а презентация @sewdn предполагает, что MyPackage должно стать член MyApp. - person Dan Dascalescu; 18.03.2014
comment
Я думаю, вы, возможно, путаете себя с номенклатурой. Пакет должен экспортировать MyPackage, который затем станет доступным в пространстве имен вашего приложения, но не станет членом пространства имен приложения. - person Andrew Mao; 18.03.2014
comment
Давайте продолжим обсуждение в чате. - person ; 27.07.2015

Все свойства, которые вы регистрируете в пространстве имен вашего приложения, становятся доступными для пакетов, которые зависят (используют) ваш пакет приложения. Таким образом, когда вы хотите зарегистрировать пространство имен пакета в пространстве имен приложений, вы объявляете зависимость от пакета приложений внутри вашего пакета и регистрируете все методы/объекты, которые хотите экспортировать в пространстве имен приложений. Пример:

файл: пакеты/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']);
});
person Sewdn    schedule 18.03.2014

В вашем пакете вы должны определить все методы и символы в пространстве имен, которое вы хотите, чтобы они имели, а затем экспортировать это пространство имен. Итак, если в вашем пакете есть:

MyApp = {
   myMethod: ...
};

Затем вы экспортируете его с помощью api.export('MyApp').

К сожалению, в Node нет метода, подобного упомянутому вами, поскольку все пакеты загружаются глобально при запуске.

person Hubert OG    schedule 14.03.2014
comment
Извините, я накосячил, вам нужно экспортировать MyApp, а не myMethod. Отредактировал ответ сейчас. Также не забудьте добавить файл myPackageCode.js, используя api.add_files(). - person Hubert OG; 18.03.2014