Я создаю серверное приложение реакции-узел-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`);
});
}