webpack.config.js
const{resolve} = require('path')const MiniCssExtractPlugin =require('mini-css-extract-plugin')const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');const HtmlWebpackPlugin = require('html-webpack-plugin');//定义nodejs环境变量:决定使用browserslist的哪个环境process.env.NODE_ENV = 'production'//复用loaderconst commonCssLoader = [ MiniCssExtractPlugin.loader, 'css-loader', { //还需要在package.json中定义browserslist loader:'postcss-loader', options:{ ident:'postcss', plugins:()=>[ require('postcss-preset-env')() ] } }]module.exports = { entry:'./src/js/index.js', output:{ filename:'js/built.js', path:resolve(__dirname,'build') }, module:{ rules:[ { test:/\.css$/, use:[...commonCssLoader] }, { test:/\.less$/, use:[ ...commonCssLoader,'less-loader'] }, /** * 正常来讲,一个文件只能被一个loader处理 * 当一个文件要被多个loader处理,那么一定要指定loader执行的先后顺序: * 先执行eslint 再执行babel */ { //在package.json中eslintConfig --> airbnb test:/\.js$/, exclude:/node_modules/, //优先执行 enforce:'pre', loader:'eslint-loader', options:{ fix:true } }, { test:/\.js$/, exclude:/node_modules/, loader:'babel-loader', options:{ preset:[ [ '@babel/preset-env', { //按需加载 useBuiltIns:'usage', //指定core-js版本 corejs:{ version:3 }, targets:{ chrome:'60', firefox:'60', ie:'9', safari:'10', edge:'17' } } ] ] } }, { test:/\.(jpg|png|gif)/, loader:'url-loader', options:{ limit:8*1024, name:'[hash:10].[ext]', outputPath:'../imgs', esModule:false } }, { test:/\.html$/, loader:'html-loader' }, { exclude:/\.(js|css|less|html|jpg|png|gif)/, loader:'file-loader', options:{ outputPath:'media' } } ] }, plugins:[ new MiniCssExtractPlugin({ filename:'css/built.css' }), new OptimizeCssAssetsWebpackPlugin(), new HtmlWebpackPlugin({ template:'./src/index.html', minify:{ collapseWhitespace:true, removeComments:true } }) ], mode:'production'}
package.json
"browserslist": { "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ], "production": [ ">0.01%", "not dead", "not op_mini all" ] }, "eslintConfig": { "extends": "airbnb-base" }