最近我清理了webpack一個專案中的配置以使其更易于維護,我通過將配置拆分為兩個檔案來做到這一點:
// webpack.config.js
const ReactRefreshWebpackPlugin = require("@pmmmwh/react-refresh-webpack-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
const { merge } = require("webpack-merge");
const parts = require("./webpack.parts");
const commonConfig = merge([
{
target: "web",
stats: {
optimizationBailout: true,
},
entry: {
index: {
import: parts.rootResolverFn("src/index/main.js"),
dependOn: "vendors",
},
vendors: ["react", "react-dom", "prop-types"],
},
output: {
filename: "[name].[contenthash].js",
path: parts.rootResolverFn("dist/public"),
publicPath: "/",
clean: true,
},
resolve: parts.resolve(),
},
parts.plugins(),
parts.loadJs(),
parts.loadAssets(),
parts.loadCss(),
parts.bundleAnalyzer(),
]);
const developmentConfig = merge([
{
output: {
filename: "[name].bundle.js",
pathinfo: false,
},
devtool: "eval-source-map",
devServer: parts.devServer(),
plugins: [new ReactRefreshWebpackPlugin()],
},
]);
const productionConfig = merge([
{
optimization: {
splitChunks: { chunks: "all" },
runtimeChunk: { name: "runtime" },
usedExports: true,
sideEffects: true,
minimizer: [
`...`,
new CssMinimizerPlugin({
minimizerOptions: {
preset: [
"default",
{
discardComments: { removeAll: true },
},
],
},
}),
],
},
},
]);
module.exports = (env, { mode }) => {
switch (mode) {
case "production":
return merge(commonConfig, productionConfig);
case "development":
return merge(commonConfig, developmentConfig);
default:
throw new Error(`Trying to use unknown mode: ${mode}`);
}
};
另一個檔案:
// webpack.parts.js
const path = require("path");
const { spawnSync } = require("child_process");
const webpack = require("webpack");
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
const CopyPlugin = require("copy-webpack-plugin");
const HtmlWebpackPlugin = require("html-webpack-plugin");
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
const pkg = require("./package.json");
const root = path.join(__dirname, "./");
const pathResolver = (base) => (toResolve) => path.resolve(base, toResolve);
const rootResolver = pathResolver(root);
const isProd = process.env.NODE_ENV === "production";
let commitHash;
if (!isProd) {
try {
const { stdout } = spawnSync("git", ["rev-parse", "--short", "HEAD"]);
console.log(`Current commit is: ${String(stdout)}`);
commitHash = String(stdout);
} catch (e) {
console.warn("Could not retrieve hash for this development environment, is this a valid git repository?");
}
}
const copyPluginPatterns = [
{
from: rootResolver("src/assets"),
to: rootResolver("dist/public/assets"),
},
{
from: rootResolver("node_modules/mxgraph/javascript"),
to: rootResolver("dist/public/mxgraph"),
},
{
from: rootResolver("src/config.js"),
to: rootResolver("dist/public/"),
},
];
exports.rootResolverFn = (path) => rootResolver(path);
exports.devServer = () => ({
port: 8282,
hot: true,
historyApiFallback: true,
open: true,
client: {
overlay: true,
},
});
exports.resolve = () => ({
alias: {
api: rootResolver("src"),
components: rootResolver("src/components"),
shared: rootResolver("src/shared"),
},
extensions: ["*", ".js", ".jsx", ".json", ".mjs", ".es"],
modules: [path.resolve(root), path.resolve(root, "src"), path.resolve(root, "node_modules")],
symlinks: false,
});
exports.loadAssets = () => ({
module: {
rules: [
{
test: /\.(png|jpe?g|gif)$/,
type: "asset/resource",
},
{
test: /\.(svg)$/,
type: "asset/inline",
},
],
},
});
exports.loadJs = () => ({
module: {
rules: [
{
test: /\.m?(js|jsx)$/,
exclude: /(node_modules)/,
use: {
loader: "babel-loader",
options: {
plugins: [!isProd && require.resolve("react-refresh/babel")].filter(Boolean),
},
},
},
],
},
});
exports.loadCss = () => ({
module: {
rules: [
{
test: /\.(sa|sc|c)ss$/,
use: [
MiniCssExtractPlugin.loader,
{
loader: "css-loader",
options: {
sourceMap: true,
url: false,
},
},
"fast-sass-loader",
"postcss-loader",
],
},
],
},
});
exports.plugins = () => {
return {
plugins: [
new MiniCssExtractPlugin({
ignoreOrder: true,
filename: "[name].[contenthash].css",
}),
new CopyPlugin({
patterns: copyPluginPatterns,
}),
new webpack.DefinePlugin({
ENV: JSON.stringify(process.env.NODE_ENV || "development"),
VERSION: JSON.stringify(pkg.version),
TEST_MODE: JSON.stringify(process.env.TEST_MODE),
COMMIT_SHA: process.env.COMMIT_SHA || commitHash,
}),
new HtmlWebpackPlugin({
title: "MyApp",
meta: {
charset: "utf-8",
viewport: "width=device-width, initial-scale=1",
},
template: rootResolver("src/index/index.html"),
hash: true,
chunks: ["index", "vendors"],
minify: {
collapseWhitespace: false,
},
}),
new webpack.IgnorePlugin({
resourceRegExp: /^\.\/locale$/,
contextRegExp: /moment$/,
}),
],
};
};
exports.bundleAnalyzer = (options = {}) => ({
plugins: [
new BundleAnalyzerPlugin({
analyzerHost: "localhost",
analyzerPort: "2112",
...options,
}),
],
});
應用這些更改后,iconsfrom@fluentui/font-icons-mdl2停止正確顯示,如下圖所示:

我正在使用
對我來說奇怪的是,通過檢查NetworkDevTools 中的選項卡,我可以看到檢索字體的呼叫并且它們成功了

但是,正如您所看到的,字形上方的一些影像未正確顯示。
已經有人經歷了類似的問題@fluentui/font-icons-mdl2和webpack最近?提前致謝。
uj5u.com熱心網友回復:
好吧,我能夠找出問題所在,有問題的線路是:
splitChunks: { chunks: "all" },
runtimeChunk: { name: "runtime" },
洗掉這些行后,圖示開始按預期再次顯示。我將關閉它,但我的任務是弄清楚為什么會發生這種情況,據說這webpack是一個了不起的工具,但您真的應該花時間仔細閱讀檔案。干杯
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/366306.html
上一篇:安裝react-leaflet版本3后,ReactStorybook未運行
下一篇:在excel中復制“條件格式”
