2014-04-13 42 views
18

我有一個庫,我想在客戶端和服務器端使用。然而,由於request不與browserify兼容,編譯使用browserify的時候,我需要使用一個名爲​​如何檢測browserify何時運行?

if (inNodejsRuntime) { 
    var request = require('request'); 
} else if (isBrowserifyRuntime) { 
    var request = require('browser-request'); 
} 

如何去檢測不同的庫browserifying運行VS時,它是內部節點時

+1

只是用戶superagent而已。 :-) –

回答

30

如果您只是使用兼容的API進行簡單模塊交換,則應使用package.json中的browser field。因此,對於你的例子,只是做

var request = require('request') 

像以前一樣,然後在放的package.json:

{ 
    "browser": { 
    "request": "browser-request" 
    } 
} 

這樣在瀏覽器中,您將獲得瀏覽器的請求,而不是請求你require('request')時。

不應該做的是要求兩個模塊運行時檢查是否存在window或某些類似的屬性。這是因爲即使您僅實際使用瀏覽器請求,您也會將瀏覽器請求和請求捆綁到您的前端代碼中,導致無用的虛增文件大小。

+0

謝謝@substack這是一個更好的解決方案 – samol

3

我找到了答案:

if (typeof window === 'undefined') { 
    var request = require('request'); 
} else { 
    var request = require('browser-request'); 
} 

Superagent也看起來像一個很好的選擇!

+0

正如substack指出的那樣,這將包括瀏覽器代碼中的兩個模塊。 – cyanbeam

42

接受的答案是正確的。但是,如果您通過Google搜索「detect browserify」來到這裏,並希望獲得更爲一般的答案,那麼browserify會自動轉換節點提供的全局process。您可以使用:

process.browser 

這將是true在瀏覽器中,在undefined節點。

+2

謝謝。太難找到這個。 – maligree