https://github.com/FrankFang/jprcb00x6ZsV
const path = require('path')
const mode = 'production'
const ESLintPlugin = require('eslint-webpack-plugin')//自动进行eslint检查插件
const MiniCssExtractPlugin = require('mini-css-extract-plugin')//单独提取css插件
const HtmlWebpackPlugin = require('html-webpack-plugin')自动生成html插件
const cssLoaders = (...loaders) => [
mode === 'production' ? MiniCssExtractPlugin.loader : 'style-loader',
{
loader: 'css-loader',
options: {
modules: {
compileType: 'icss',
},
},
},
...loaders
]
module.exports = {
mode,//模式
entry: {//入口
main: './src/index.js',
admin: './src/admin.js'
},
output: {//出口
filename: '[name].[contenthash].js'
},
plugins: [
new ESLintPlugin({
extensions: ['.js', '.jsx', '.ts', '.tsx'] // 不加 .jsx 就不会检查 jsx 文件了
}),
mode === 'production' && new MiniCssExtractPlugin({
filename: '[name].[contenthash].css'
}),
new HtmlWebpackPlugin({
filename: 'index.html',
chunks: ['main']
}),
new HtmlWebpackPlugin({
filename: 'admin.html',
chunks: ['admin']
})
].filter(Boolean),
optimization: {//优化
moduleIds: 'deterministic',//固定模块id
runtimeChunk: 'single',//将与我们源代码无关的代码单独打包,避免如webpack配置修改导致需要
//更新整个文件
splitChunks: {//将node_module的代码单独打包为vendor
cacheGroups: {
vendor: {
priority: 10,
minSize: 0, /* 如果不写 0,由于 React 文件尺寸太小,会直接跳过 */
test: /[\\/]node_modules[\\/]/,
name: 'vendors', // 文件名
chunks: 'all', // all 表示同步加载和异步加载,async 表示异步加载,initial 表示同步加载
},
common: {//将多个js共有代码单独打包为common
priority: 5,
minSize: 0,
minChunks: 2,
chunks: 'all',
name: 'common'
}
},
},
},
resolve: {
alias: {//别名
'@': path.resolve(__dirname, './src/')
}
},
module: {
rules: [
{
test: /\.styl(us)?$/i,
use: cssLoaders({
loader: 'stylus-loader',
options: {
stylusOptions: {//为每个文件自动引入下面的文件
import: [path.resolve(__dirname, 'src/stylus-vars.styl')]
}
},
}),
},
{
test: /\.[jt]sx?$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: [//规则
['@babel/preset-env'],
['@babel/preset-react', {runtime: 'classic'}],
['@babel/preset-typescript']
]
}
}
},
{
test: /\.s[ac]ss$/i,
use: cssLoaders(
{
loader: 'sass-loader',
options: {
additionalData: `//为每个文件自动引入下面的文件
@import "src/scss-vars.scss";
`,
sassOptions: {
includePaths: [__dirname]//到对应路径上找
},
},
},
),
},
]
}
}