【问题标题】:Webpack React: Conditionally load json config filesWebpack React:有条件地加载 json 配置文件
【发布时间】:2019-04-04 03:25:13
【问题描述】:

我有一个 WebPack React 项目,我正在我的“staging”服务器上进行测试。 现在是时候在“production”服务器上发布它了。

我正在使用 server.json 文件,其中包含服务器信息,例如 api 密钥、api 地址等。

我想要的是使用不同的 server.json 进行“生产”和“登台”。 当我使用 production-server.json 时,我的包中将有 没有任何痕迹 staging-server.json。

src
- config
-- config.js
-- production-server.json
-- staging-server.json

可能类似于:yarn build-staging、yarn build-production

【问题讨论】:

    标签: javascript reactjs webpack


    【解决方案1】:

    你应该使用环境变量和 webpack 的 DefinePlugin。此外,您可以使用node-config 自动加载基于您的NODE_ENV 的json 配置文件。

    package.json

    "scripts": {
      "build:dev": "NODE_ENV=development start-something",
      "build": "NODE_ENV=production start-something"
    }
    

    项目配置结构

    config
      default.json
        { "api": "https://api.mysite.com/v1" }
      staging.json
        { "api": "http://localhost:8000/v1" }
    

    webpack 配置

    // node-config will load your staging.json or default.json file here
    // depending on what NODE_ENV is
    const config = require('config');
    
    plugins: [
      // inject window.CONFIG into your app
      new webpack.DefinePlugin({
        CONFIG: JSON.stringify(config)
      })
    ]
    

    然后在您的反应代码中,您将可以访问特定于环境的配置

    componentDidMount() {
      // in prod: https://api.mysite.com/v1/user/some-user-id
      // in staging: http://localhost:8000/v1/user/some-user-id
      return axios(`${CONFIG.api}/user/${this.props.userId}`).then(whatever...)
    }
    

    如果您使用的是 Windows,请使用 cross-env 设置您的环境变量。

    使用node-config 不是唯一的方法,有几种方法,但我发现它很容易,除非你使用电子。

    编辑

    由于node-config 使用 nodejs,它通常与 webpack 一起用于前端项目。如果你无法将它与 webpack 集成,你根本不需要使用 node-config,我会这样做:

    项目结构

    config
      default.json
      development.json
      test.json
      index.js
    src
      ...etc
    

    配置文件

    // default.json, typically used for production
    {
      "api": "https://api.mysite.com/v1"
    }
    
    // development.json
    {
      "api": "http://localhost:8000/v1"
    }
    
    // index.js
    // get process.env via babel-plugin-transform-inline-environment-variables
    import production from './default.json';
    import development from './development.json';
    const { NODE_ENV: env } = process.env;
    
    const config = {
      production,
      development
    };
    
    export default config[env];
    

    【讨论】:

    • 但是捆绑呢? Webpack 会捆绑这两个配置文件吗?
    • @rendom 不,webpack 只会捆绑你给它的东西。 node-config 只会给你一个配置对象。
    • 所以这个配置文件应该在src目录之外,还是没关系?
    • 我的问题是什么。如果我将 server.json 文件放在 src 文件夹中,webpack 也会捆绑它吗?在您的示例中,您使用不同的文件夹进行配置存储
    • @rendom 只是摆脱server.json。最好按环境名称组织配置文件。
    猜你喜欢
    • 2020-09-25
    • 1970-01-01
    • 2018-02-24
    • 2016-05-11
    • 2013-03-31
    • 2020-01-26
    • 2022-08-03
    • 2015-01-05
    • 2013-03-09
    相关资源
    最近更新 更多