反应:从外部文件读取配置

zbe*_*atm 5 javascript reactjs webpack

我正在尝试实现一种从我的React应用程序中的某些文件中读取配置的解决方案...不知道什么是最佳实践,但是我采用了以下方式并尝试实现它:

1)在我的应用程序的根目录下(与webpack.config.js并行),我创建了一个名为config.dev.json的文件,内容如下:

{“ protocol”:“ http”,“ host”:“ localhost”,“ port”:“ 8080”}

2)向webpack.config.js添加了我的代码(末尾的TODO部分):

 const path = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const rtlcss = require('rtlcss');
const webpack = require("webpack");

const useExternalCss =
  process.env.CARBON_REACT_STORYBOOK_USE_EXTERNAL_CSS === 'true';

const useStyleSourceMap =
  process.env.CARBON_REACT_STORYBOOK_USE_STYLE_SOURCEMAP === 'true';

const useRtl = process.env.CARBON_REACT_STORYBOOK_USE_RTL === 'true';

const styleLoaders = [
  {
    loader: 'css-loader',
    options: {
      importLoaders: 2,
      sourceMap: useStyleSourceMap,
    },
  },
  {
    loader: 'postcss-loader',
    options: {
      plugins: () => {
        const autoPrefixer = require('autoprefixer')({
          browsers: ['last 1 version', 'ie >= 11'],
        });
        return !useRtl ? [autoPrefixer] : [autoPrefixer, rtlcss];
      },
      sourceMap: useStyleSourceMap,
    },
  },
  {
    loader: 'sass-loader',
    options: {
      includePaths: [path.resolve(__dirname, '..', 'node_modules')],
      data: `
        $feature-flags: (
          ui-shell: true,
        );
      `,
      sourceMap: useStyleSourceMap,
    },
  },
];

module.exports = (baseConfig, env, defaultConfig) => {
  defaultConfig.devtool = useStyleSourceMap ? 'source-map' : '';
  defaultConfig.optimization = {
    ...defaultConfig.optimization,
    minimizer: [
      new TerserPlugin({
        sourceMap: true,
        terserOptions: {
          mangle: false,
        },
      }),
    ],
  };

  defaultConfig.module.rules.push({
    test: /-story\.jsx?$/,
    loaders: [
      {
        loader: require.resolve('@storybook/addon-storysource/loader'),
        options: {
          prettierConfig: {
            parser: 'babylon',
            printWidth: 80,
            tabWidth: 2,
            bracketSpacing: true,
            trailingComma: 'es5',
            singleQuote: true,
          },
        },
      },
    ],
    enforce: 'pre',
  });

  defaultConfig.module.rules.push({
    test: /\.scss$/,
    sideEffects: true,
    use: [
      { loader: useExternalCss ? MiniCssExtractPlugin.loader : 'style-loader' },
      ...styleLoaders,
    ],
  });

  if (useExternalCss) {
    defaultConfig.plugins.push(
      new MiniCssExtractPlugin({
        filename: '[name].[contenthash].css',
      })
    );
  }

  //TODO
  if (!defaultConfig.resolve) {
    defaultConfig.resolve = {};
  }
  if (!defaultConfig.resolve.alias) {
    defaultConfig.resolve.alias = {};
  }
  defaultConfig.resolve.alias.Config = process.env.NODE_ENV === 'production'
      ? path.resolve('./config.prod.json')
      : path.resolve('./config.dev.json');


  return defaultConfig;
};

module.exports = {
  plugins: [
    new webpack.DefinePlugin({
      'process.env': {
        'NODE_ENV': JSON.stringify('development'),
        'BASE_URL': JSON.stringify('http://localhost:3000/')
      }
    })
  ],

//   externals: {
//     'Config': JSON.stringify(process.env.NODE_ENV === 'production' ? require('./config.prod.json') : require('./config.dev.json'))
//   }
//
//   // externals: {
//   //   'Config': JSON.stringify(process.env.NODE_ENV === 'production' ? {
//   //     serverUrl: "http://test.com:8080"
//   //   } : {
//   //     serverUrl: "http://localhost:8080"
//   //   })
//   // }
//

}
Run Code Online (Sandbox Code Playgroud)

3)并尝试通过某种方式使用它:

let Config = require('Config')
Run Code Online (Sandbox Code Playgroud)

但我得到:

./src/stores/RestService.js找不到模块:无法解析'C'中的'Config':

zhu*_*ber 5

如果你想在没有 webpack 的情况下设置配置(例如使用 create-react-app 时),我建议这样做:

创建配置文件夹(或根据需要命名)并添加配置文件和索引文件:

  • 配置.dev.json
  • 配置.prod.json
  • 索引.js

然后在你的 config/index.js 文件中:

if (process.env.NODE_ENV === 'development') {
    module.exports = require('./config.dev.json')
} else {
    module.exports = require('./config.prod.json')
}
Run Code Online (Sandbox Code Playgroud)

与它一起使用import config from './config';