2014-04-07 42 views
1

我上一個javascript模塊/庫工作應在3個環境中工作:在模塊定義與node.js的,require.js與普通scripttags工作太

    在node.js中
  1. requirejs
  2. 只需將標籤包含在網頁中即可。在這種情況下,整個模塊應該window.myModule
  3. 下迷上了

你有任何建議,如何寫庫的結構,使之適用於所有這些環境?

編輯:基本上我的意思是某種形式的圖書館圍繞包裝代碼,這樣我可以調用該文件形成任何這三個方法和我很好...

回答

1

該要求被導出爲舊的js lib和其解決方案被稱爲通用模塊定義(UMD)。目前它是一項提案草案。背景和當前狀態在Addy Osmani - Writing Modular JavaScript With AMD, CommonJS & ES Harmony文章中描述。尋找指向您可以使用的各種模板的「UMD」鏈接。

很多其他模板可以在網上找到 - UMD是搜索關鍵字。

(自己還沒有找到最終的鏈接:)

1

我們正在開發同樣的事情, 我認爲。

而且我們取得了一些成功。我們有庫(我們稱之爲'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 

,它會在負載

+0

改用webpack,並開心 – AlataR