创建Meteor包库?

时间:2016-08-08 18:18:16

标签: javascript node.js meteor module packages

我想创建一个“核心”软件包和“模块/插件”软件包,就像accounts-facebook在Meteor中使用accounts-base一样。

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

包/项目:模块芯/ 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');
    }
});

包/项目:模块芯/ LIB / core.js

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

  var getShareCount = (function (url) {

  });

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

包/项目:实/ 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']);
});

包/项目:实/ LIB / facebook.js

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

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

HBModule.register('facebook');

由此我得到TypeError: Cannot read property 'register' of undefined错误。

我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

IIFE(立即调用的函数表达式)不返回任何内容,因此HBModuleFacebook都未定义。创建HBModule时,需要将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声明的所有变量都将作用于该文件。

包/项目:模块芯/ 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;
};

包/项目:实/ LIB / facebook.js:

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

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

HBModule.register('facebook');