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.