我上一個javascript模塊/庫工作應在3個環境中工作:在模塊定義與node.js的,require.js與普通scripttags工作太
-
在node.js中
- requirejs
- 只需將標籤包含在網頁中即可。在這種情況下,整個模塊應該window.myModule 下迷上了
你有任何建議,如何寫庫的結構,使之適用於所有這些環境?
編輯:基本上我的意思是某種形式的圖書館圍繞包裝代碼,這樣我可以調用該文件形成任何這三個方法和我很好...
我上一個javascript模塊/庫工作應在3個環境中工作:在模塊定義與node.js的,require.js與普通scripttags工作太
你有任何建議,如何寫庫的結構,使之適用於所有這些環境?
編輯:基本上我的意思是某種形式的圖書館圍繞包裝代碼,這樣我可以調用該文件形成任何這三個方法和我很好...
該要求被導出爲舊的js lib和其解決方案被稱爲通用模塊定義(UMD)。目前它是一項提案草案。背景和當前狀態在Addy Osmani - Writing Modular JavaScript With AMD, CommonJS & ES Harmony文章中描述。尋找指向您可以使用的各種模板的「UMD」鏈接。
很多其他模板可以在網上找到 - UMD是搜索關鍵字。
(自己還沒有找到最終的鏈接:)
我們正在開發同樣的事情, 我認爲。
而且我們取得了一些成功。我們有庫(我們稱之爲'slib'),編譯成AMD js文件。它不依賴於npm模塊或瀏覽器,因此可以從節點和瀏覽器調用它。
1)從節點調用它,我們使用requirejs:
文件require.conf.js
module.exports = function(nodeRequire){
global.requirejs = require('requirejs');
requirejs.config({
baseUrl: __dirname+"/../web/slib/",
paths: {
slib: "."
},
nodeRequire: nodeRequire
});
}
在任何其他的服務器端(的NodeJS)文件中,我們在一開始加入這一行
require("./require.conf")(require);
則稱SLIB的代碼是:
var Computation = requirejs("slib/Computation");
2)要從瀏覽器調用slib,我們只需要使用requirejs。它處理一切正常。
3)我們不需要直接從<腳本調用slib。 對於製作,我們使用r.js製作一個包含大部分依賴關係的js文件,並使用它在頁面上使用一個<腳本>。而且這個腳本下載了所有其他的代碼,如果它們沒有被包含,使用標準的requirejs,並且它不需要requirejs(據我所知),它只是單獨運行。這對於大型項目非常靈活:在開發時使用requirejs,使用r.js將核心文件捆綁到生產中以加快頁面加載,如果只需要一個<腳本而不需要任何其他請求,則使用整個捆綁包。 r.js正確捆綁了所有的依賴關係,包括舊的js庫,它們通常只使用<腳本>加載,並且可以通過window.myOldLibrary使用配置上的shim param進行訪問。
看來你可以使用browserfy來從slib的代碼中訪問一些npm模塊,但我們還沒有嘗試過。 另外,在節點一側使用requirejs,我認爲可以更簡單(爲什麼我們需要第二個'requirejs'函數以及節點的函數?)我們還沒有很好地調查過它,但是這是有效的。
在任何SLIB模塊可以寫
if (window)
window.module1 = this // or whatever
,它會在負載
改用webpack,並開心 – AlataR