同构JS应用程序中的环境变量:Webpack查找和替换?

JP.*_*JP. 14 javascript webpack

我正在使用webpack捆绑一个同构的JS应用程序(基于此示例),以便浏览器运行与服务器相同的代码.一切都运行顺利,除了我有config.js一些设置从服务器上的环境变量拉入:

module.exports = {
  servers:
    auth: process.env.AUTH_SERVER_URL,
    content: process.env.CONTENT_SERVER_URL
  }
}
Run Code Online (Sandbox Code Playgroud)

在服务器上这是盛大的,但是当webpack为客户端呈现这个process是空的时,这不起作用.

我希望有一种'查找和替换'webpack插件,它将仅用该文件中的内容替换它们?

"…config.js content…".replace(/process\.env\.([a-z0-9_]+)/, function(match, varName) {
  return process.env[varName];
})
Run Code Online (Sandbox Code Playgroud)

owe*_*rme 16

请注意,使用DefinePlugin接受的答案中建议的可能是一个危险的操作,因为它完全暴露process.env.正如Tobias在上面评论的那样,实际上有一个插件EnvironmentPlugin可以在DefinePlugin内部使用添加的白名单功能.

在你的webpack.config.js:

{
  plugins: [
    new webpack.EnvironmentPlugin([
      'NODE_ENV',
      'WHITELISTED_ENVIRONMENT_VARIABLE'
    ])
  ]
}
Run Code Online (Sandbox Code Playgroud)


act*_*eek 12

在你的webpack.config.js,使用以下preLoaders(或postLoaders),

  module: {
    preLoaders: [
      { test: /\.js$/, loader: "transform?envify" },
    ]
  }
Run Code Online (Sandbox Code Playgroud)

使用的另一种方式webpack.DefinePlugin:

plugins: [
    new DefinePlugin({
      'process.env': Object.keys(process.env).reduce(function(o, k) {
        o[k] = JSON.stringify(process.env[k]);
        return o;
      }, {})
    })
]
Run Code Online (Sandbox Code Playgroud)

注意:旧方法使用envify-loader已弃用:

DEPRECATED:改为使用transform-loader + envify.

  • 无论在"envify-loader"中做了什么,都只是一个包装器.讨论[这里](https://github.com/mjohnston/envify-loader/issues/1). (2认同)