我想创建一个“核心”软件包和“模块/插件”软件包,就像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
错误。
我做错了什么?
谢谢!
答案 0 :(得分:1)
IIFE(立即调用的函数表达式)不返回任何内容,因此HBModule
和Facebook
都未定义。创建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');