创建流星包库?
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 任何东西,所以 HBModule
和 Facebook
都是未定义的。创建 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');
我想创建一个 "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 任何东西,所以 HBModule
和 Facebook
都是未定义的。创建 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');