从主捆绑包中隔离特定的配置文件

时间:2019-01-18 15:31:02

标签: reactjs webpack

我的应用程序中有几个配置文件,它们需要放在单独的捆绑软件中,或者根本不捆绑在一起,但复制到输出文件夹中,然后以某种方式由主捆绑软件读取。

<罢工> 我已经设法将文件放入一个单独的配置包中,但问题是这些文件仍仍捆绑在主包中,实际上使我的配置包无用。

我已经设法在@Chase的帮助下使配置包正常工作,但我还不满意。接下来,我想知道如何完全不捆绑这些文件,但是在部署后仍然可供主捆绑使用。

有任何建议吗?

我的项目文件夹/文件结构(必不可少的部分):

- app
  - js
    - components
      - [all of my components]
    - config
      - [my config files that I want to isolate]
    - App.jsx
    - index.jsx
    - ...
  - ...

我的webpack配置:

const path = require('path')
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const cwd = process.cwd()
const mode = 'production'
const CleanWebpackPlugin = require('clean-webpack-plugin');

module.exports = {
  context: path.join(cwd, 'app'),
  mode,

  optimization: {
    runtimeChunk: 'single',
    minimize: false,
    splitChunks: {
      chunks: 'all',
      maxInitialRequests: Infinity,
      minSize: 0,
      cacheGroups: {
        config: {
          test: /[\\/]app[\\/]js[\\/]config[\\/]/,
          minSize: 0
        },
        vendors: {
          test: /[\\/]node_modules[\\/]/,
          name(module) {
            // get the name. E.g. node_modules/packageName/not/this/part.js
            // or node_modules/packageName
            const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];

            // npm package names are URL-safe, but some servers don't like @ symbols
            return `npm.${packageName.replace('@', '')}`;
          },
        }
      },
    },
  },

  entry: {
    app: ["babel-polyfill", './js/index.jsx'],
    silentRenew: ["./silent_renew/silent_renew.js"],
  },

  output: {
    path: path.resolve('dist'),
    filename: 'bundle_[name].js'
  },

  module: {
    rules: [{
      test: /\.jsx?$/,
      use: ['babel-loader'],
      exclude: /node_modules/
    },
    {
      test: /\.json$/,
      use: ['json-loader'],
      exclude: /node_modules/
    },
    {
      test: /\.css$/,
      use: [
        'style-loader',
        'css-loader'
      ]
    },
    {
      test: /\.less$/,
      use: [
        'style-loader',
        'css-loader',
        'less-loader'
      ]
    },
    {
      test: /\.scss$/,
      use: [
        'style-loader',
        'css-loader',
        'scss-loader'
      ]
    },
    {
      test: /\.(png|jpg|jpeg|svg|gif)$/,
      use: [
        'file-loader'
      ]
    },
    {
      test: /\.(woff|woff2|eot|ttf|otf)$/,
      use: [
        'file-loader'
      ]
    },
    {
      test: /\.(pptx|zip)$/,
      loader: "file-loader",
      options: {
        name: '[name].[ext]'
      }
    }]
  },

  plugins: [
    new CleanWebpackPlugin(['dist']),
    new HtmlWebpackPlugin({
      template: './index.ejs',
      excludeChunks: ["silentRenew"],
    }),
    new HtmlWebpackPlugin({
      template: "./silent_renew/silent_renew.html",
      chunks: ["silentRenew",],
      filename: "silent_renew.html"
    }),
    new webpack.DefinePlugin({
      CONSTANTS: {
        PROD: false,
        TEST: true,
        DEV: false
      }
    }),
    new webpack.IgnorePlugin(/^(fs|ipc|ignore)$/)
  ]
}

<罢工> 我希望我的配置文件进入配置包,这已经在工作。 但是,我还需要它们不包含在主捆绑包中。

如果我可以将配置文件完全不捆绑在一起,而只是将其复制到输出文件夹中,然后由主(应用程序)捆绑文件从那里读取,那就更好了。 但是第二个选项是隔离的配置包。

1 个答案:

答案 0 :(得分:1)

您需要根据情况分批打包。这是将node_modules分成“公共”捆绑包的示例,但是您可以重写test属性以匹配您的目录条件。

    optimization: {
    splitChunks: {
      cacheGroups: {
        commons: {
          test: /[\\/]node_modules[\\/]/,
          name: "common",
          chunks: "all"
        }
      }
    }