【问题标题】:Creating Meteor package library?创建 Meteor 包库?
【发布时间】:2016-08-09 12:44:58
【问题描述】:

我想创建一个“核心”包和“模块/插件”包,就像 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;
  });
}());

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

包/项目: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 错误。

我做错了什么?

谢谢!

【问题讨论】:

    标签: javascript node.js meteor module packages


    【解决方案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 声明的所有变量都将作用于该文件。

    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;
    };
    

    包/项目:facebook/lib/facebook.js:

    Facebook = {};
    var moduleName = 'Facebook';
    
    Facebook.getShareCount = function (url) {
      return 22;
    };
    
    HBModule.register('facebook');
    

    【讨论】:

    • 这太棒了!谢谢!还有一个问题,如果没有设置,我将如何让模块使用默认功能?例如,如果我没有创建“Facebook.getShareCount”函数,它会在调用第一个函数时使用“HBModule.getShareCount”函数吗?
    • 谢谢!有多种方法可以做到这一点;我建议使用“类”(原型继承),因为我认为它增强了可读性。我不知道您使用的是哪个版本的 Meteor,所以我将为 Meteor 1.3+ 编写示例:(您可以在早期版本的 Meteor 中执行等效操作,但编写方式会有所不同)。 gist.github.com/nathantreid/8ef9e734d52b179bee12123ef81b3065
    猜你喜欢
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 2013-04-09
    相关资源
    最近更新 更多