2013-04-23 39 views
36

我正在考慮採取browserify我的一些項目,但是想以確保他人無法使用browserify,如果他們想使用(捆綁)代碼。最明顯的方式做到這一點是既通過module.exports以及通過window.全球露出模塊的出口。但是,我寧願不污染對於那些誰require荷蘭國際集團腳本中的全局命名空間。Browserify:使用module.exports如果需要的話,否則暴露全球

是否可以檢測一個腳本是require d?如果是的話,我可以這樣做:

var mymodule = (function() { ... })(); 
if (isRequired()) { 
    module.exports = mymodule; 
} else { 
    window.mymodule = mymodule; 
} 

需要注意的是,無論怎樣,這將事先綁定,所以var mymodule不會露出一個全球性的。另外,我目前使用的revealing module pattern,但願意切換到更適合browserify東西。

什麼使一個模塊都能夠require<script src=能的最佳方式?在這兩種情況下最好只展示一個全球?

回答

2

假設另一個庫並沒有創造一個全球性的module.exports對象,你可以簡單地檢查module.exports

var mymodule = (function() { ... })(); 
if (module && module.exports) { 
    module.exports = mymodule; 
} else { 
    window.mymodule = mymodule; 
} 
+0

Browserify使'module','module.exports'和'require'可用於所有捆綁文件。所以,只是我的捆綁使這些可用。感謝您的迴應。 – 2013-04-28 16:28:08

18

我處理同樣的問題,建立一個圖書館,這裏是存在提出意見。我認爲,我們需要先分開觀衆在幾類庫:

  1. 那些誰使用browserify和NPM
  2. 那些誰只會下載一個mylib.min.js和使用的一種方式或者其他
  3. AMD(帶涼亭?),可能是第三類。

因此,對於很容易,你將有你的index.js模塊:

module.exports = function() { /* code */ } 

和你的package.json將有一個主

「主」: 「index.js」

注意我沒有添加任何window.xx代碼到index.js。

對於我認爲最好的辦法是創建一個standalone.js

var mylib = require('./index.js'); 
global.window.mylib = mylib; 

這是browserify應該建立。

對於(如果你關心),你可以調整獨立。JS如下:

var mylib = require('./index.js'); 
if (typeof global.window.define == 'function' && global.window.define.amd) { 
    global.window.define('mylib', function() { return mylib; }); 
} else { 
    global.window.mylib = mylib; 
} 
0

爲什麼不只是用閉包包裹整個東西,並通過exports作爲參數?

(function (exports) { 
    // code here 
    // ... 
    exports.foo = bar; 
})(exports || this); 

這樣它也會將它導出到WebWorker範圍和其他「無窗口」環境中。