2014-04-13 43 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