2023-03-01 16:29:42 +08:00

113 lines
3.5 KiB
JavaScript

// css less post-css mini-css css 压缩
// extraPostCSSPlugins
// postcssLoader
// lessLoader
// css-loader
// 支持 热加载
// 性能优化
// css 压缩 https://github.com/webpack-contrib/css-minimizer-webpack-plugin
// 根据 entry 进行代码块拆分
// 根据 entry 将文件输出到不同的文件夹
import { deepmerge } from '@fesjs/utils';
function createRules({ isDev, webpackConfig, config, lang, test, loader, options, browserslist, styleLoaderOption }) {
function applyLoaders(rule, cssLoaderOption = {}) {
if (isDev) {
rule.use('extra-css-loader').loader(require.resolve('style-loader')).options(Object.assign({}, styleLoaderOption));
} else {
rule.use('extra-css-loader').loader(require('mini-css-extract-plugin').loader).options({});
}
rule.use('css-loader')
.loader(require.resolve('css-loader'))
.options(
deepmerge(
{
importLoaders: 1,
...cssLoaderOption,
},
config.cssLoader || {},
),
);
rule.use('postcss-loader')
.loader(require.resolve('postcss-loader'))
.options(
deepmerge(
{
postcssOptions: () => ({
plugins: [
// https://github.com/luisrudge/postcss-flexbugs-fixes
require('postcss-flexbugs-fixes'),
require('postcss-safe-parser'),
[require('autoprefixer'), { ...config.autoprefixer, overrideBrowserslist: browserslist }],
...(config.extraPostCSSPlugins ? config.extraPostCSSPlugins : []),
],
}),
},
config.postcssLoader || {},
),
);
if (loader) {
rule.use(loader).loader(require.resolve(loader)).options(options);
}
}
const rule = webpackConfig.module.rule(lang).test(test);
applyLoaders(rule.oneOf('css-modules').resourceQuery(/module/), {
modules: {
localIdentName: '[local]___[hash:base64:5]',
},
});
applyLoaders(rule.oneOf('css'));
}
export default function createCssWebpackConfig({ isDev, config, webpackConfig, browserslist }) {
createRules({
isDev,
webpackConfig,
config,
lang: 'css',
test: /\.css$/,
browserslist,
});
createRules({
isDev,
webpackConfig,
config,
lang: 'less',
test: /\.less$/,
loader: 'less-loader',
options: {
lessOptions: {
javascriptEnabled: true,
...config.lessLoader,
},
},
browserslist,
});
if (!isDev) {
webpackConfig.plugin('extra-css').use(require.resolve('mini-css-extract-plugin'), [
{
filename: '[name].[contenthash:8].css',
chunkFilename: '[id].[contenthash:8].css',
},
]);
webpackConfig.optimization.minimizer('css').use(require.resolve('css-minimizer-webpack-plugin'), [{}]);
}
return (options) => {
createRules({
isDev,
config,
webpackConfig,
browserslist,
...options,
});
};
}