使用webpack,我可以将Node.js和浏览器代码放在同一个文件中,但是阻止Node.js代码进入浏览器吗?

时间:2015-07-30 13:19:10

标签: javascript node.js webpack isomorphic-javascript

我有一个文件,我想要同时拥有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)
}

1 个答案:

答案 0 :(得分: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(和许多其他库)在开始生产之前剥离开发代码的方式。