mirror of
https://github.com/WeBankFinTech/fes.js.git
synced 2025-04-05 19:41:57 +08:00
134 lines
3.7 KiB
JavaScript
134 lines
3.7 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, isCSSModules) {
|
|
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,
|
|
// https://webpack.js.org/loaders/css-loader/#onlylocals
|
|
...(isCSSModules
|
|
? {
|
|
modules: {
|
|
localIdentName: '[local]___[hash:base64:5]'
|
|
}
|
|
}
|
|
: {})
|
|
},
|
|
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/), true);
|
|
applyLoaders(rule.oneOf('css'), false);
|
|
}
|
|
|
|
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
|
|
});
|
|
};
|
|
}
|