238 lines
6.6 KiB
Markdown
238 lines
6.6 KiB
Markdown
# 生产模式介绍
|
||
|
||
生产模式是开发完成代码后,我们需要得到代码将来部署上线。
|
||
|
||
这个模式下我们主要对代码进行优化,让其运行性能更好。
|
||
|
||
优化主要从两个角度出发:
|
||
|
||
1. 优化代码运行性能
|
||
2. 优化代码打包速度
|
||
|
||
## 生产模式准备
|
||
|
||
我们分别准备两个配置文件来放不同的配置
|
||
|
||
### 1. 文件目录
|
||
|
||
```:no-line-numbers
|
||
├── webpack-test (项目根目录)
|
||
├── 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 (包的依赖管理配置文件)
|
||
```
|
||
|
||
### 2. 修改 webpack.dev.js
|
||
|
||
因为文件目录变了,所以所有绝对路径需要回退一层目录才能找到对应的文件
|
||
|
||
```js{8,10,66,71}
|
||
const path = require("path");
|
||
const ESLintWebpackPlugin = require("eslint-webpack-plugin");
|
||
const HtmlWebpackPlugin = require("html-webpack-plugin");
|
||
|
||
module.exports = {
|
||
entry: "./src/main.js",
|
||
output: {
|
||
path: undefined, // 开发模式没有输出,不需要指定输出目录
|
||
filename: "static/js/main.js", // 将 js 文件输出到 static/js 目录中
|
||
// clean: true, // 开发模式没有输出,不需要清空输出结果
|
||
},
|
||
module: {
|
||
rules: [
|
||
{
|
||
// 用来匹配 .css 结尾的文件
|
||
test: /\.css$/,
|
||
// use 数组里面 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)$/,
|
||
type: "asset",
|
||
parser: {
|
||
dataUrlCondition: {
|
||
maxSize: 10 * 1024, // 小于10kb的图片会被base64处理
|
||
},
|
||
},
|
||
generator: {
|
||
// 将图片文件输出到 static/imgs 目录中
|
||
// 将图片文件命名 [hash:8][ext][query]
|
||
// [hash:8]: hash值取8位
|
||
// [ext]: 使用之前的文件扩展名
|
||
// [query]: 添加之前的query参数
|
||
filename: "static/imgs/[hash:8][ext][query]",
|
||
},
|
||
},
|
||
{
|
||
test: /\.(ttf|woff2?)$/,
|
||
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"),
|
||
}),
|
||
],
|
||
// 其他省略
|
||
devServer: {
|
||
host: "localhost", // 启动服务器域名
|
||
port: "3000", // 启动服务器端口号
|
||
open: true, // 是否自动打开浏览器
|
||
},
|
||
mode: "development",
|
||
};
|
||
```
|
||
|
||
运行开发模式的指令:
|
||
|
||
```:no-line-numbers
|
||
npx webpack serve --config ./config/webpack.dev.js
|
||
```
|
||
|
||
### 3. 修改 webpack.prod.js
|
||
|
||
```js{8,74-79}
|
||
const path = require("path");
|
||
const ESLintWebpackPlugin = require("eslint-webpack-plugin");
|
||
const HtmlWebpackPlugin = require("html-webpack-plugin");
|
||
|
||
module.exports = {
|
||
entry: "./src/main.js",
|
||
output: {
|
||
path: path.resolve(__dirname, "../dist"), // 生产模式需要输出
|
||
filename: "static/js/main.js", // 将 js 文件输出到 static/js 目录中
|
||
clean: true,
|
||
},
|
||
module: {
|
||
rules: [
|
||
{
|
||
// 用来匹配 .css 结尾的文件
|
||
test: /\.css$/,
|
||
// use 数组里面 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)$/,
|
||
type: "asset",
|
||
parser: {
|
||
dataUrlCondition: {
|
||
maxSize: 10 * 1024, // 小于10kb的图片会被base64处理
|
||
},
|
||
},
|
||
generator: {
|
||
// 将图片文件输出到 static/imgs 目录中
|
||
// 将图片文件命名 [hash:8][ext][query]
|
||
// [hash:8]: hash值取8位
|
||
// [ext]: 使用之前的文件扩展名
|
||
// [query]: 添加之前的query参数
|
||
filename: "static/imgs/[hash:8][ext][query]",
|
||
},
|
||
},
|
||
{
|
||
test: /\.(ttf|woff2?)$/,
|
||
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"),
|
||
}),
|
||
],
|
||
// devServer: {
|
||
// host: "localhost", // 启动服务器域名
|
||
// port: "3000", // 启动服务器端口号
|
||
// open: true, // 是否自动打开浏览器
|
||
// },
|
||
mode: "production",
|
||
};
|
||
```
|
||
|
||
运行生产模式的指令:
|
||
|
||
```:no-line-numbers
|
||
npx webpack --config ./config/webpack.prod.js
|
||
```
|
||
|
||
### 4. 配置运行指令
|
||
|
||
为了方便运行不同模式的指令,我们将指令定义在 package.json 中 scripts 里面
|
||
|
||
```json
|
||
// package.json
|
||
{
|
||
// 其他省略
|
||
"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`
|