browserify – 排除代码块?

我在浏览器和服务器端Node上构build了一个包含共享React组件的应用程序。

现在,我正在使用Marty.js来做到这一点:

function getUser() { if (Marty.isBrowser) { /* Get user using some client method */ } else { /* otherwise, use some secret server code */ } } 

我通过Browserify捆绑了这些function,因此它们可以在客户端以及服务器上运行。

我想要做的是从包中完全删除else块,所以我没有泄漏敏感的服务器端代码。

有没有办法从软件包中排除代码块?

我会创build单独的模块,一个用于浏览器,一个用于服务器。 然后在你的package.json ,你告诉browserify使用浏览器模块:

 "browser": { "./path/to/node-module.js": "./path/to/browser-module.js" } 

现在,无论您调用require('path/to/node-module') ,browserify都会加载另一个模块。


来自文档的更多信息:

浏览器领域

有一个特殊的“浏览器”字段,可以在每个模块的package.json中设置,以覆盖浏览器特定版本的文件的文件parsing。

例如,如果你想为你的“main”字段设置一个浏览器特定的模块入口点,你可以将“browser”字段设置为一个string:

 "browser": "./browser.js" 

或者你可以在每个文件的基础上覆盖:

 "browser": { "fs": "level-fs", "./lib/ops.js": "./browser/opts.js" } 

请注意,浏览器字段仅适用于本地模块中的文件,并且与转换一样,不适用于node_modules目录。

虽然我不确定是否可以使用Browserify,但是可以使用Webpack使用它的DefinePlugin来完成

从文档 (很less修改):

例:

 new webpack.DefinePlugin({ DEBUG: false, PRODUCTION: true, ... }) 

例:

 if(DEBUG) console.log('Debug info') if(PRODUCTION) console.log('Production log') 

通过webpack没有缩小的结果在:

 if(false) console.log('Debug info') if(true) console.log('Production log') 

然后在缩小之后通过结果:

 console.log('Production log') 

你可以使用一个环境variablesenvify和uglify来做到这一点。

 if ('browser' === process.env.ENVIRONMENT) { ... } else { ... } 

设置process.env.ENVIRONMENT = 'browser'时,做你的浏览器构build,使用envify变换来replace引用process.env与他们的当前值和uglify将执行死代码消除,以删除将永远不会被击中的分支。

更明确地expression你的意图,并把你的代码放在他们自己的文件中:

 function getUser(options, callback) { var fn; if (Marty.isBrowser) { fn = require("./lib/users/get.browser"); } else { fn = require("./lib/users/get.server"); } fn(options, callback); } 

然后作为一个browserify选项,你可以用这个variables来代替require("./lib/users/get.server") ,当你看到它的时候:…“这样你就不会在那个服务器文件当你为浏览器build立。

然而,如果getUser可以根据它运行的地方做不同的事情,那么你在这里做错了事情的可能性就更大了:或许getUser应该是从浏览器到服务器的REST调用,而不是更多的信息,那就是总是很难确定。

把代码放在一个模块(例如UserServer ,然后在编译客户端时排除该模块呢? 你的代码变成:

 function getUser() { if (Marty.isBrowser) { /* Get user using some client method */ } else { require('UserServer').getUser(); } } 

Browserify提供以下选项来从软件包中排除文件:

 --exclude, -u Omit a file from the output bundle. Files can be globs.