本篇文章参考以下博文
前言
最近在做一些简单项目的打包,每个小项目的依赖库有细微差异,但是主要的配置信息都相似,css兼容,js兼容,html插件等,不同的是相关插件的使用情况。
本篇文章就初始化一个生产环境的基本配置,方便以后用来直接使用。
生产环境基本配置
基本配置如下:
- 首先配置了入口和出口;
- 然后做css的配置,其中包括兼容和压缩;
- less文件配置
- js语法检查
- js兼容
- 图片检测
- html中的图片
- 其他文件
- 最后插件的部分对html文件进行了处理,并压缩
const { resolve } = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin')
//定义 nodejs 环境变量:决定使用 browserslist 的哪个环境
process.env.NODE_ENV = 'production';
//复用 loader
const commonCssLoader = [
MiniCssExtractPlugin.loader,
'css-loader',
{
//注意在 package.json 中指定 browserslist
loader: 'postcss',
option: {
ident: 'postcss',
plugins: () => [ //这里返回值必须是数组
//css 兼容处理
require('postcss-preset-env')()
]
}
}
];
module.export = {
entry: './src/js/index.js',
output: {
filename: 'js/bulit.js',
path: resolve(__dirname, 'build')
},
module: {
rules: [
// css 配置
{
test: /\.css$/,
use: [...commonCssLoader]
},
// less 配置
{
test: /\.less$/,
use: [
...commonCssLoader,
'less-loader'
]
},
// js 语法检查
{
//在 package.json 中 eslintConfig --> airbnb
test: /\.js$/,
exclude: /node_modules/,
enforce: 'pre', //优先执行此 loader
loader: 'eslint-loader',
options: {
fix: true
}
},
//js 兼容处理
{
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
}
},
//html文件中的图片
{
test: /\.html$/,
loader: 'html-loader'
},
//其他文件
{
exclude: /\.(js|css|less|html|jpg|png|gif)/,
loader: 'file-loader',
options: {
outputPath: 'media'
}
}
]
},
plugins: [
new MiniCssExtractPlugin({
fillname: 'css/built.css'
}),
new HtmlWebpackPlugin({
template: './src/index.html',
//html 压缩
minify: {
collapseWhitespace: true,
removeComments: true
}
}),
new OptimizeCssAssetsWebpackPlugin()
],
mode: 'production'
}