创建流星包库?

Creating Meteor package library?

我想创建一个 "core" 包和 "module/plugin" 包,就像 accounts-facebook 在 Meteor 中使用 accounts-base 一样。

这是我目前拥有的,但它不起作用:

packages/project:modules-core/package.js:

Package.describe({
  name: 'project:modules-core',
    summary: 'Core package for Modules.',
    version: '1.0.0'
});

Package.onUse(function (api) {
    api.versionsFrom('METEOR@0.9.1.1');

    api.addFiles('lib/core.js', ['client', 'server']);

    if (api.export) {
        api.export('HBModule');
    }
});

packages/project:modules-core/lib/core.js:

HBModule = (function () {
  var moduleName = "";

  var getShareCount = (function (url) {

  });

  var register = (function (name) {
    HBModule[name] = name;
  });
}());

packages/project:facebook/package.js:

Package.describe({
  name: 'project:facebook',
    summary: 'Facebook Module.',
    version: '1.0.0'
});

Package.onUse(function(api) {
    api.versionsFrom('METEOR@0.9.1.1');

    api.use('project:modules-core', ['client', 'server']);

    api.imply('project:modules-core', ['client', 'server']);

    api.addFiles('lib/facebook.js', ['client', 'server']);
});

packages/project:facebook/lib/facebook.js:

Facebook = (function () {
  var moduleName = "Facebook";

  var getShareCount = (function (url) {
     return 22;
  });
}());

HBModule.register('facebook');

我遇到了 TypeError: Cannot read property 'register' of undefined 错误。

我做错了什么?

谢谢!

IIFE(立即调用的函数表达式)没有 returning 任何东西,所以 HBModuleFacebook 都是未定义的。创建 HBModule 时,您需要 return 一个带有 register 属性 的对象设置为您的 register 函数。

HBModule = (function () {
  var moduleName = "";

  var getShareCount = (function (url) {

  });

  var register = (function (name) {
    HBModule[name] = name;
  });

  // return an object that will be assigned to HBModule
  return { register: register };
}());

这里也不需要 IIFE,因为 Meteor 无论如何都会包装每个文件,并且只公开您使用的变量而不声明(例如 HBModule);用 var 声明的所有变量都将限定在该文件中。

packages/project:modules-core/lib/core.js:

HBModule = {};
var moduleName = '';

// assuming you want to expose the getShareCount method as well?
HBModule.getShareCount = function (url) {

};

HBModule.register = function (name) {
  HBModule[name] = name;
};

packages/project:facebook/lib/facebook.js:

Facebook = {};
var moduleName = 'Facebook';

Facebook.getShareCount = function (url) {
  return 22;
};

HBModule.register('facebook');