【问题标题】:With webpack, can I put Node.js and browser code in the same file, but prevent the Node.js code making it to the browser?使用 webpack,我可以将 Node.js 和浏览器代码放在同一个文件中,但阻止 Node.js 代码进入浏览器吗?
【发布时间】:2015-07-30 13:19:09
【问题描述】:

我有一个文件想要同时包含 Node.js 和浏览器代码。

Node.js 代码不应在浏览器中可见。

webpack 能否根据环境从文件中排除代码?

有点像 C 预处理指令。 #if #else, etc.

我知道 Webpack 非常密集地解析代码,这让我认为它可以。

约束

  • Node.js 代码无法进入浏览器,因为它可能包含敏感的配置选项。

  • 我希望浏览器和节点代码在同一个文件中。我知道我可以使用webpack.IgnorePlugin 忽略基于文件的要求,或者将共享代码放在浏览器文件中并要求来自服务器(我现在正在这样做),但我想知道它是否可能将代码并排放在同一个文件中。


编辑:这是我正在尝试做的一个例子。

export class FooPlugin {

  $name = 'foo-plugin'

  register(app) {

    const app = koa()
    app.get('/foo', () => { this.send('foo') })
    app.set('SECRET STUFF!')
    app.start()
    this.shared()

  }

  shared(app) {

      // browser things - isomorphic react router routes, etc.

  }

  registerBrowser(app) {

      this.shared()

  }

}

// This is called in another file depending on the environment.

if (!isBrowser) {
  (new FooPlugin).register(app)
} else {
  (new FooPlugin).registerBrowser(app)
}

【问题讨论】:

    标签: javascript node.js webpack isomorphic-javascript


    【解决方案1】:

    您可以使用Define Plugin 设置NODE_ENV 并以这种方式控制您的代码:

    var define  = new webpack.DefinePlugin({'process.env': {NODE_ENV: JSON.stringify('production')}})
    

    DefinePlugin 将用提供的字符串替换代码中的process.env.NODE_ENV 实例,因此在编译后的代码中您最终会得到类似if ('production' !== 'production') 的内容。当您进行生产构建时,Webpack 运行 uglify 并带有死代码消除,这将去除这些无法访问的块。 (见webpack howto: feature flags

    这就是 React(和许多其他库)在投入生产之前剥离开发代码的方式。

    【讨论】:

    • 我如何保证代码会被剥离?如果我的类有两种方法,一种用于浏览器,一种用于节点。 webpacks 分析器是否能够查看对方法的调用是否以 process.env.NODE_ENV 为条件?
    • 我认为这会使我的代码过于混乱,因为我必须包装要求以及方法调用。我会用一个我正在尝试做的例子来更新我的 Q。
    • 看起来你可以很容易和明智地重新组织你的代码以使门控更容易(例如,为什么不直接调用 register 并让插件处理运行哪些方法而不是暴露一个更复杂的界面?)但我知道这可能不可行,具体取决于您的项目规模。
    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多