2016-08-08 53 views
0

我想創建一個「核心」軟件包和「模塊/插件」包,很像accounts-facebook在流星中使用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('[email protected]'); 

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

包/項目:Facebook的/ package.j小號

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

Package.onUse(function(api) { 
    api.versionsFrom('[email protected]'); 

    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錯誤。

我在做什麼錯?

謝謝!

回答

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的是不必要在這裏,因爲流星無論如何都會包裹每個文件,只公開使用的變量沒有聲明(如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; 
}; 

包/項目:Facebook的/ lib目錄/ facebook.js:

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

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

HBModule.register('facebook'); 
+0

這是真棒!謝謝!還有一個問題,如果沒有設置模塊,我將如何使模塊使用默認功能?例如,如果我沒有創建「Facebook.getShareCount」函數,那麼在調用第一個函數時,它只會使用「HBModule.getShareCount」函數? –

+0

謝謝!有很多方法可以做到這一點;我建議使用「類」(原型繼承),因爲我認爲它提高了可讀性。我不知道你正在使用什麼版本的Meteor,所以我要爲Meteor 1.3+編寫一個例子:(你可以在Meteor的早期版本中做相同的處理,但它會寫得有些不同)。 https://gist.github.com/nathantreid/8ef9e734d52b179bee12123ef81b3065 –

+0

哦,這人是完美的。非常感謝! –