前面介绍过,在webpack.config.js
的mode
配置中有development
和production
两个选项,那有什么区别呢?本篇文章就简单介绍下。
开发模式(mode
: development
)顾名思义就是我们开发代码时使用的模式。
这个模式下我们主要做两件事:
html
资源等,webpack
默认都不能处理这些资源,所以我们要加载配置来编译这些资源提前检查代码规范和格式,统一团队编码风格,让代码更优雅美观
生产模式(mode
: production
)是开发完成代码后,我们需要得到代码将来部署上线。
这个模式下我们主要对代码进行优化,让其运行性能更好。
优化主要从两个角度出发:
在项目根目录下创建config
文件夹,用来存在不同模式的配置,项目目录如下:
├── webpack5demo (项目根目录)
├── config (Webpack配置文件目录)
│ ├── webpack.dev.js(开发模式配置文件)
│ └── webpack.prod.js(生产模式配置文件)
├── node_modules (下载包存放目录)
├── src (项目源码目录,除了html其他都在src里面)
│ └── 略
├── public (项目html文件)
│ └── index.html
├── .eslintrc.js(Eslint配置文件)
├── babel.config.js(Babel配置文件)
└── package.json (包的依赖管理配置文件)
因为文件目录变了,所以所有绝对路径需要回退一层目录才能找到对应的文件
const path = require('path') // nodejs核心模块,用来处理路径问题
const ESLintWebpackPlugin = require('eslint-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
// 入口
entry: './src/main.js',
// 输出
output: {
// 文件输出路径
// __dirname nodejs变量,代表当前文件的文件夹目录
path: path.resolve(__dirname, 'dist'),
// 入口文件打包输出文件名
filename: 'static/js/main.js',
// clean: true, // 开发模式没有输出,不需要清空输出结果
},
// 加载器
module: {
rules: [
{
// 匹配css结尾文件
test: /\.css$/,
// loader执行顺序是从右到左
use: ['style-loader', 'css-loader']
},
{
test: /\.less$/,
use: ["style-loader", "css-loader", "less-loader"],
},
{
test: /\.s[ac]ss$/,
use: ["style-loader", "css-loader", "sass-loader"],
},
{
test: /\.styl$/,
use: ["style-loader", "css-loader", "stylus-loader"],
},
{
test: /\.(png|jpe?g|gif|webp|svg)$/,
type: "asset",
parser: {
// 小于10kb的图片转base64
// 优点:减少请求数量 缺点:体积会增大三分之一
dataUrlCondition: {
maxSize: 20 * 1024 // 20kb
}
},
generator: {
// 将图片文件输出到 static/imgs 目录中
// 将图片文件命名 [hash:8][ext][query]
// [hash:8]: hash值取8位
// [ext]: 使用之前的文件扩展名
// [query]: 添加之前的query参数
filename: "static/imgs/[hash:8][ext][query]",
}
},
{
/**
* 处理图标字体、媒体等资源
* type: "asset/resource" 相当于file-loader, 将文件转化成 Webpack 能识别的资源,其他不做处理
type: "asset" 相当于url-loader, 将文件转化成 Webpack 能识别的资源,同时小于某个大小的资源会处理成 data URI 形式
*/
test: /\.(ttf|woff2?|map4|map3|avi)$/,
type: "asset/resource",
generator: {
filename: "static/media/[hash:8][ext][query]",
},
},
{
test: /\.js$/,
exclude: /node_modules/, // 排除node_modules代码不编译
loader: "babel-loader",
},
]
},
// 插件
plugins: [
new ESLintWebpackPlugin({
// 指定检查文件的根目录
context: path.resolve(__dirname, '../src')
}),
new HtmlWebpackPlugin({
// 以 public/index.html 为模板创建文件
// 新的html文件有两个特点:1. 内容和源文件一致 2. 自动引入打包生成的js等资源
template: path.resolve(__dirname, '../public/index.html'),
inject: 'head'
})
],
//开发服务器
devServer: {
host: '127.0.0.1', // 域名
port: '3000', // 端口
open: true // 是否自动打开浏览器
},
// 模式
mode: 'development'
}
运行开发模式的指令:
npx webpack serve --config ./config/webpack.dev.js
const path = require('path') // nodejs核心模块,用来处理路径问题
const ESLintWebpackPlugin = require('eslint-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
// 入口
entry: './src/main.js',
// 输出
output: {
// 文件输出路径
// __dirname nodejs变量,代表当前文件的文件夹目录
path: path.resolve(__dirname, '../dist'),
// 入口文件打包输出文件名
filename: 'static/js/main.js',
clean: true, // 自动将上次打包目录资源清空
},
// 加载器
module: {
rules: [
{
// 匹配css结尾文件
test: /\.css$/,
// loader执行顺序是从右到左
use: ['style-loader', 'css-loader']
},
{
test: /\.less$/,
use: ["style-loader", "css-loader", "less-loader"],
},
{
test: /\.s[ac]ss$/,
use: ["style-loader", "css-loader", "sass-loader"],
},
{
test: /\.styl$/,
use: ["style-loader", "css-loader", "stylus-loader"],
},
{
test: /\.(png|jpe?g|gif|webp|svg)$/,
type: "asset",
parser: {
// 小于10kb的图片转base64
// 优点:减少请求数量 缺点:体积会增大三分之一
dataUrlCondition: {
maxSize: 20 * 1024 // 20kb
}
},
generator: {
// 将图片文件输出到 static/imgs 目录中
// 将图片文件命名 [hash:8][ext][query]
// [hash:8]: hash值取8位
// [ext]: 使用之前的文件扩展名
// [query]: 添加之前的query参数
filename: "static/imgs/[hash:8][ext][query]",
}
},
{
/**
* 处理图标字体、媒体等资源
* type: "asset/resource" 相当于file-loader, 将文件转化成 Webpack 能识别的资源,其他不做处理
type: "asset" 相当于url-loader, 将文件转化成 Webpack 能识别的资源,同时小于某个大小的资源会处理成 data URI 形式
*/
test: /\.(ttf|woff2?|map4|map3|avi)$/,
type: "asset/resource",
generator: {
filename: "static/media/[hash:8][ext][query]",
},
},
{
test: /\.js$/,
exclude: /node_modules/, // 排除node_modules代码不编译
loader: "babel-loader",
},
]
},
// 插件
plugins: [
new ESLintWebpackPlugin({
// 指定检查文件的根目录
context: path.resolve(__dirname, '../src')
}),
new HtmlWebpackPlugin({
// 以 public/index.html 为模板创建文件
// 新的html文件有两个特点:1. 内容和源文件一致 2. 自动引入打包生成的js等资源
template: path.resolve(__dirname, '../public/index.html'),
inject: 'head'
})
],
//开发服务器
devServer: {
host: '127.0.0.1', // 域名
port: '3000', // 端口
open: true // 是否自动打开浏览器
},
// 模式
mode: 'production'
}
运行生产模式的指令:
npx webpack --config ./config/webpack.prod.js
为了方便运行不同模式的指令,我们将指令定义在package.json
中scripts
里面
"scripts": {
"start": "npm run dev",
"dev": "npx webpack serve --config ./config/webpack.dev.js",
"build": "npx webpack --config ./config/webpack.prod.js"
},
以后启动指令:
npm start
或 npm run dev
npm run build