请教大佬们,我在使用MiniCssExtractPlugin进行生产打包时,发现打包出来的css文件都是空的,除了main这个css文件不是空的,因为这个是按照正常的文件引入"import './app.less'";但是,我的内部页面与组件都适用以module形式引入的,这样的文件打包编译后内容就会丢失,请问有什么方法解决css文件内容丢失的问题,或者有什么其他的css module方法来避免我这个问题?
以下是baseconfig与prod.config的配置:
// webpack.base.js
const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const webpack = require('webpack');
const isDev = process.env.NODE_ENV === 'development'
module.exports = {
// 入口文件
entry: path.resolve(__dirname, '../src/index.tsx'),
// 打包文件出口
output: {
filename: 'static/js/[name].[chunkhash:8].js', // 每个输出js的名称
path: path.resolve(__dirname, '../dist'), // 打包的出口文件夹路径
clean: true, // webpack4需要配置clean-webpack-plugin删除dist文件,webpack5内置了。
publicPath: '/', // 打包后文件的公共前缀路径
},
module: {
rules: [
{
test: /\.css$/, //匹配所有的 less 文件
enforce: 'pre',
include: [path.resolve(__dirname, '../src')],
use: [
isDev ? 'style-loader' : MiniCssExtractPlugin.loader,
// 'style-loader',
'css-loader',
'postcss-loader',
]
},
{
test: /\.less$/, //匹配所有的 less 文件
enforce: 'pre',
include: [path.resolve(__dirname, '../src')],
use: [
isDev ? 'style-loader' : MiniCssExtractPlugin.loader,
// 'style-loader',
'css-loader',
'postcss-loader',
'less-loader'
]
},
{
test: /\.(ts|tsx)$/,
include: [path.resolve(__dirname, '../src')],
enforce: 'pre',
use: ['thread-loader', 'babel-loader']
},
{
test:/\.(png|jpg|jpeg|gif|svg)$/,
type: "asset",
parser: {
//转base64的条件
dataUrlCondition: {
maxSize: 10 * 1024, // 10kb
}
},
generator:{
filename:'static/images/[name].[contenthash:6][ext]'
},
},
{
test:/\.(woff2?|eot|ttf|otf)$/, // 匹配字体图标文件
type: "asset", // type选择asset
parser: {
dataUrlCondition: {
maxSize: 10 * 1024, // 小于10kb转base64位
}
},
generator:{
filename:'static/fonts/[name].[contenthash:6][ext]', // 文件输出目录和命名
},
},
{
test:/\.(mp4|webm|ogg|mp3|wav|flac|aac)$/, // 匹配媒体文件
type: "asset", // type选择asset
parser: {
dataUrlCondition: {
maxSize: 10 * 1024, // 小于10kb转base64位
}
},
generator:{
filename:'static/media/[name].[contenthash:6][ext]', // 文件输出目录和命名
},
}
]
},
resolve: {
extensions: ['.js', '.tsx', '.ts'],
alias: {
'@': path.resolve(__dirname, '../src')
},
modules: [path.resolve(__dirname, '../node_modules')],
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, '../public/index.html'),
inject: true
}),
new webpack.DefinePlugin({
'process.env.BASE_ENV': JSON.stringify(process.env.BASE_ENV)
}),
],
// 开启webpack持久化存储缓存
cache: {
type: 'filesystem', // 使用文件缓存
},
}
// webpack.prod.js
const path = require('path')
const { merge } = require('webpack-merge')
const baseConfig = require('./webpack.base.js')
const CopyPlugin = require('copy-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
const TerserPlugin = require('terser-webpack-plugin');
const PurgeCSSPlugin = require('purgecss-webpack-plugin')
const CompressionPlugin = require('compression-webpack-plugin')
const globAll = require('glob-all')
module.exports = merge(baseConfig, {
mode: 'production',
plugins: [
// 复制文件插件
new CopyPlugin({
patterns: [
{
from: path.resolve(__dirname, '../public'), // 复制public下文件
to: path.resolve(__dirname, '../dist'), // 复制到dist目录中
filter: source => {
return !source.includes('index.html') // 忽略index.html
}
},
],
}),
// 抽离css插件
new MiniCssExtractPlugin({
filename: 'static/css/[name].[contenthash:8].css'
}),
// 去除没用到的css插件
new PurgeCSSPlugin({
paths: globAll.sync([
`${path.join(__dirname, '../src')}/**/*.tsx`,
`${path.join(__dirname, '../public')}/index.html`
]),
safelist: {
standard: [/^ant-/], // 过滤以ant-开头的类名,哪怕没用到也不删除
}
}),
// 打包生成gzip插件
new CompressionPlugin({
test: /\.(js|css)$/, // 只生成css,js压缩文件
filename: '[path][base].gz', // 文件命名
algorithm: 'gzip', // 压缩格式,默认是gzip
threshold: 10240, // 只有大小大于该值的资源会被处理。默认值是 10k
minRatio: 0.8 // 压缩率,默认值是 0.8
})
],
// 优化配置
optimization: {
minimizer: [
// 压缩css
new CssMinimizerPlugin(),
// 压缩js
new TerserPlugin({
parallel: true, // 开启多线程压缩
terserOptions: {
compress: {
pure_funcs: ["console.log"], // 删除console语句
}
}
}),
],
splitChunks: { // 分隔代码
cacheGroups: {
vendors: { // 提取node_modules代码
test: /node_modules/, // 只匹配node_modules里面的模块
name: 'vendors', // 提取文件命名为vendors,js后缀和chunkhash会自动加
minChunks: 1, // 只要使用一次就提取出来
chunks: 'initial', // 只提取初始化就能获取到的模块,不管异步的
minSize: 0, // 提取代码体积大于0就提取出来
priority: 1, // 提取优先级为1
},
// commons: { // 提取页面公共代码
// name: 'commons', // 提取文件命名为commons
// minChunks: 2, // 只要使用两次就提取出来
// chunks: 'initial', // 只提取初始化就能获取到的模块,不管异步的
// minSize: 0, // 提取代码体积大于0就提取出来
// }
}
}
},
})