为什么DllPlugin打包后样式文件没生效,打包后的dll里没有CSS内容?

令狐若曦 阅读 73

我用Webpack的DllPlugin打包公共依赖时,发现生成的dll文件里没有包含我配置的CSS文件。虽然在entry里加入了样式表路径,但打包后的manifest.json里也没有相关记录。

尝试过把css-loader加到dll的loader配置里,但控制台报错说找不到style-loader。现在页面上的组件样式全乱了,应该怎样正确打包CSS到dll里呢?


/* common-styles.css */
.container {
  background: #f0f0f0;
  padding: 20px;
}
.button {
  color: white;
  border-radius: 4px;
}

DllPlugin的配置里entry写的是[‘react’, ‘./src/assets/common-styles.css’],但打包后的dll vendor-manifest.json里只有react相关的内容。

我来解答 赞 17 收藏
二维码
手机扫码查看
2 条解答
司马士娇
你这个问题其实挺典型的,很多人第一次用 DllPlugin 都会踩这个坑——它默认只处理 JS 模块,CSS 这类非 JS 资源根本不会被自动打进 dll bundle,manifest.json 里自然也不会有对应记录。

关键点在于:DllPlugin 不支持直接打包 CSS 文件进 DLL,你把 ./src/assets/common-styles.css 写进 entry 是无效的,Webpack 根本不会去处理它,更不会生成对应的模块 ID 到 manifest。

正确的做法是分两步走:

第一,把 CSS 单独抽出来,用 MiniCssExtractPlugin(或者 style-loader + css-loader 组合)在 DLL 构建阶段生成一个独立的 CSS 文件,比如 vendor.css,这个文件只包含你在 DLL 中引用到的样式。

第二,打包完之后,手动把这个 vendor.css 通过 标签注入到 HTML 里,顺序要在主 bundle 之前,不然样式会被覆盖。

举个配置例子,你 DLL 的 webpack 配置可以这么写:

const webpack = require('webpack');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');

module.exports = {
mode: 'production',
entry: {
vendor: ['react', 'react-dom', './src/assets/common-styles.css'],
},
output: {
filename: '[name].dll.js',
path: path.resolve(__dirname, 'dist/dll'),
library: '[name]_[hash]',
},
module: {
rules: [
{
test: /.css$/,
use: [
MiniCssExtractPlugin.loader,
'css-loader',
],
},
],
},
plugins: [
new webpack.DllPlugin({
name: '[name]_[hash]',
path: path.resolve(__dirname, 'dist/dll/[name]-manifest.json'),
}),
new MiniCssExtractPlugin({
filename: '[name].css',
}),
],
};


注意这里用了 MiniCssExtractPlugin.loader,不是 style-loader,所以你之前报错“找不到 style-loader”是因为你配置里用了 style-loader 但没装——但其实装了也没用,style-loader 是运行时插入