MiniCSSExtractPlugin не работает в производстве, но работает новый веб-пакет. HotModuleReplacementPlugin () работает - PullRequest
0 голосов
/ 24 марта 2020

Я создаю серверное приложение реакции-узел-webpack4 на стороне сервера. сторона разработки работает отлично, но у меня есть проблема с производством: вот webpack.prod-config. js code

const path = require("path");
const webpack = require("webpack");
const TerserPlugin = require("terser-webpack-plugin");
// const BundleAnalyzerPlugin = require("webpack-bundle-analyzer")
//   .BundleAnalyzerPlugin;
const { CleanWebpackPlugin } = require("clean-webpack-plugin");
const OptimizeCssAssetsPlugin = require("optimize-css-assets-webpack-plugin");
const MiniCSSExtractPlugin = require("mini-css-extract-plugin");
const CompressionPlugin = require("compression-webpack-plugin");
const BrotliPlugin = require("brotli-webpack-plugin");
module.exports = {
  name: "client",
  entry: { main: "./src/main.js" },
  mode: "production",
  output: {
    filename: "[name]-bundle.js",
    path: path.resolve(__dirname, "../dist"),
    publicPath: "/"
  },
  optimization: {
    minimize: true,
    minimizer: [new TerserPlugin()],
    splitChunks: {
      maxInitialRequests: Infinity,
      minSize: 0,
      chunks: "all",
      cacheGroups: {
        vendor: {
          name: "vendor",
          chunks: "initial",
          test: /[\\/]node_modules[\\/]/,

          minChunks: 2
        }
      }
    }
  },
  module: {
    rules: [
      {
        test: /\.js$/,
        use: [{ loader: "babel-loader" }],
        exclude: /node_modules/
      },
      {
        test: /\.css$/,
        use: [
          // {
          //   loader: "style-loader"
          // },
          { loader: MiniCSSExtractPlugin.loader },

          { loader: "css-loader" }
        ]
      },
      {
        test: /\.html$/,
        use: [
          {
            loader: "html-loader"
          }
        ]
      },
      {
        test: /\.md$/,
        use: [{ loader: "html-loader" }, { loader: "markdown-loader" }]
      },

      {
        test: /\.(jpg|jpeg|png|gif)$/,
        use: [
          {
            loader: "file-loader",
            options: { name: "images/[name].[ext]" }
          }
        ]
      }
    ]
  },
  plugins: [
    // new BundleAnalyzerPlugin({ generateStatsFile: true }),
    new webpack.HotModuleReplacementPlugin(),
    new CleanWebpackPlugin(),
    new webpack.DefinePlugin({
      "process.env.NODE_ENV": JSON.stringify(
        process.env.NODE_ENV || "production"
      )
    }),
    new OptimizeCssAssetsPlugin(),
    new MiniCSSExtractPlugin(),
    new CompressionPlugin(),
    new BrotliPlugin(),
    new webpack.SourceMapDevToolPlugin()
  ]
};

код в этом стиле не будет работать из-за MiniCssExtractPlugin. Если я отключу MiniCssExtractPlugin и использую вместо этого «загрузчик стилей», код работает отлично.

Но, если я отключу новый webpack.HotModuleReplacementPlugin (), , который предназначен для разработки, код больше не будет работать. Я удивлен, почему он не работает, это мой express код:

if (isDev) {
  const compiler = webpack([configDevClient, configDevServer]);
  const clientCompiler = compiler.compilers[0];
  const serverCompiler = compiler.compilers[1];
  const webpackDevMiddleware = require("webpack-dev-middleware")(
    compiler,
    configDevClient.devServer
  );

  const webpackHotMiddleware = require("webpack-hot-middleware")(
    clientCompiler,
    configDevClient.devServer
  );

  server.use(webpackDevMiddleware);
  server.use(webpackHotMiddleware);
  server.use(webpackHotServerMiddleware(compiler));
  console.log(`I am in ${process.env.NODE_ENV} environment`);
} else {
  //when we get here there is no bundle
  webpack([configProdClient, configProdServer]).run((err, stats) => {
    const render = require("../../build/prod-server-bundle").default;

    server.use(
      expressStaticGzip("dist", {
        enableBrotli: true,
        orderPreference: ["br", "gzip"],
        index: false
      })
    );
    server.use(render());

    console.log(`I am in ${process.env.NODE_ENV} environment`);
  });
}
...