1. 前言

由于我们学习 VueWebpack 是无法绕过去的。但作为后端开发只需要了解即可,并不一定要想前端工程师一样精通。


2. 什么是 Webpack ?

官方文档:https://webpack.docschina.org/concepts/entry-points/

Webpack 是一个现代前端构建工具,用于处理 JavaScript 模块、资源文件(如样式、图片等)以及其他静态资源,将它们打包成一个或多个优化的 bundle,以提高应用的性能和可维护性。

使用拼图的例子描述如下

假设你正在组织一个庞大的拼图,每个拼图片段代表着你的应用程序的一部分,包括各种 JavaScript 代码、样式、图片和其他资源。但是他们非常混乱、难以管理和组装。Webpack 就像是一个智能的拼图整理工具。它可以将这些碎片按照你的需要整理、排序和合并。

  • 首先,它会检查每个碎片上写着的说明,这相当于模块化的 JavaScript 代码。
  • 然后,它会将这些碎片中的颜色块、图案等,相应地进行分类,这就好像是处理样式文件。还有一些碎片是图片,Webpack 知道如何将它们正确地放在一起,就像是处理图片资源。
  • 最终,Webpack 会根据你的设置,将所有整理好的碎片合并成几个优化的大块,就像是组装一幅完整的拼图。

  • 总之,Webpack 就像是一个拼图整理工具,它帮助你把代码和资源整理得更有序,以提高网站性能和开发效率。

官网图解

image-20230810202142414


3. 安装 Webpack

3.1. 第一步:安装 Webpack

  • 执行命令
1
2
3
4
> mkdir 01_webpack
> cd .\01_webpack\
> npm init -y
> npm install webpack webpack-cli --save-dev
  • 文件目录
1
2
3
4
01_webpack
|- /node_modules
|- package.json
|- package-lock.json

3.2. 第二步:创建配置文件

Webpack 使用配置文件来指定打包的规则和行为。

  • 在根目录创建一个名为 webpack.config.js 文件
1
2
3
4
5
6
7
8
9
10
// webpack.config.js
const path = require('path');

module.exports = {
entry: './src/main.js', // 入口文件
output: {
filename: 'bundle.js', // 输出文件名
path: path.resolve(__dirname, 'dist') // 输出目录
}
};
  • 文件目录
1
2
3
4
5
6
7
01_webpack
|- package.json
|- package-lock.json
+ |- /dist
+ |- /src
+ |- main.js
+ |- webpack.config.js

3.3. 第三步:创建入口文件

在配置文件中指定了入口文件后,你需要在项目中创建该入口文件。

  • 创建 /src/main.js
1
2
// src/main.js
console.log('Hello, Webpack!');

3.4. 第四步:安装加载器和插件

Webpack 可以使用加载器(Loaders)来处理不同类型的文件,例如将 ES6 代码转换为 ES5、处理样式文件、图片等。

1
> npm install css-loader style-loader --save-dev
  • package.json 新增依赖

image-20230810222711172

3.5. 第五步:配置加载器

在配置文件中,配置加载器来处理不同类型的文件。例如, CSS 加载器用于处理样式文件。

  • webpack.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// webpack.config.js
const path = require('path');

module.exports = {
// ...
module: {
rules: [
{
test: /\.js$/, // 匹配 JavaScript 文件
exclude: /node_modules/, // 排除 node_modules 目录
},
{
test: /\.css$/, // 匹配 CSS 文件
use: ['style-loader', 'css-loader'] // 先使用 css-loader 处理,再使用 style-loader 处理
}
]
}
};

3.6. 第六步:运行构建

使用命令行运行 Webpack,它将根据配置文件开始构建项目。

  • package.json

删除:”main”: “index.js”,

新增:”private”: true,

新增·:”build”: “webpack —config webpack.config.js”

我们安装包是 private(私有的),并移除 main 入口。这可以防止意外发布你的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"name": "01_webpack",
"version": "1.0.0",
"description": "",
- "main": "index.js",
+ "private": true,
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
+ "build": "webpack --config webpack.config.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"css-loader": "^6.8.1",
"style-loader": "^3.3.3",
"webpack": "^5.88.2",
"webpack-cli": "^5.1.4"
}
}
  • 运行
1
npm run build
  • 结果

动画


4. Webpack 配置 Vue2.X

我们基于上面的案例,设置一个基本的 Vue 项目并使用 Webpack 进行构建。

这个示例包含了一个基本的 Vue 组件、Webpack 配置以及用于开发和构建的命令。

4.1. 第一步:安装 Webpack

  • 执行命令
1
2
3
4
5
6
7
8
> mkdir 02_webpack_vue
> cd .\02_webpack_vue\
# 初始化
> npm init -y
# 添加依赖
# - webpack@4.46.0: 前端构建工具,用于打包和处理资源
# - webpack-cli@4.7.2: webpack 的命令行工具,方便在命令行中使用 webpack
> npm install webpack@4 webpack-cli@3 --save-dev
  • 文件目录
1
2
3
4
01_webpack
|- /node_modules
|- package.json
|- package-lock.json

4.2. 第二步:创建组件

  • 创建 /src/App.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<template>
<div>
<h1>{{ message }}</h1>
</div>
</template>

<script>
export default {
data() {
return {
message: 'Hello, Vue with Webpack!'
};
}
};
</script>

<style>
h1 {
color: blue;
}
</style>

  • 文件目录
1
2
3
4
5
6
7
01_webpack
|- /node_modules
|- package.json
|- package-lock.json
+ |- /dist
+ |- /src
+ |- App.vue

4.3. 第三步:创建文件入口

  • 创建 /src/main.js
1
2
3
4
5
6
import Vue from 'vue';
import App from './App.vue';

new Vue({
render: h => h(App) // 使用 render 函数渲染 App 组件,并将其挂载到 id 为 'app' 的元素上
}).$mount('#app'); // 手动挂载 Vue 实例到 id 为 'app' 的元素上
  • 文件目录
1
2
3
4
5
6
7
01_webpack
|- /node_modules
|- package.json
|- package-lock.json
|- /src
|- App.vue
+ |- main.js

4.4. 第四步:创建文件

  • 创建 /src/index.html

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue Webpack Demo</title>
    </head>
    <body>
    <div id="app"></div>
    <script src="./src/main.js"></script>
    </body>
    </html>

4.5. 第五步:添加依赖

  • 执行命令
1
2
3
4
5
6
7
8
9
# 安装了以下开发依赖:
# - vue@2.6.14: Vue 2.x 版本,用于构建用户界面
# - vue-loader@15.9.8: 用于加载和解析 Vue 单文件组件
# - vue-template-compiler@2.6.14: 用于编译 Vue 单文件组件中的模板
# - webpack-dev-server@3.11.2: 开发服务器,用于在开发过程中提供实时预览和热重载
# - html-webpack-plugin@5.3.2: 自动生成 HTML 文件,并将打包后的资源自动引入
# - css-loader@6.3.0: 用于加载和解析 CSS 文件,使其能够在项目中使用
# - vue-style-loader@4.1.3: 用于加载 Vue 单文件组件中的样式
> npm install vue@2.6.14 vue-loader@15.9.8 vue-template-compiler@2.6.14 webpack-dev-server@3.11.2 html-webpack-plugin@3.2.0 css-loader@3.6.0 vue-style-loader@4.1.3 --save-dev

4.6. 第六步:配置加载器

  • 创建 webpack.config.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const { VueLoaderPlugin } = require('vue-loader');

module.exports = {
entry: './src/main.js', // 入口文件,指定项目的起始位置
output: {
filename: 'bundle.js', // 输出文件名,打包后的 JavaScript 文件将命名为 bundle.js
path: path.resolve(__dirname, 'dist') // 输出路径,打包后的文件将存放在 dist 目录中
},
module: {
rules: [
{
test: /\.vue$/, // 匹配以 .vue 结尾的文件
use: 'vue-loader' // 使用 vue-loader 处理 Vue 单文件组件
},
{
test: /\.css$/, // 匹配以 .css 结尾的文件
use: ['vue-style-loader', 'css-loader'] // 先使用 vue-style-loader 处理样式,再使用 css-loader 加载 CSS 文件
}
]
},
plugins: [
new HtmlWebpackPlugin({
title: 'hello vue',
template: 'index.html' // 使用 index.html 作为模板生成 HTML 文件,并自动引入打包后的资源
}),
new VueLoaderPlugin()
]
};

4.7. 第七步:运行构建

  • package.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"name": "01_webpack",
"version": "1.0.0",
"description": "",
- "main": "index.js",
+ "private": true,
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
+ "dev": "webpack-dev-server --open",
+ "build": "webpack --config webpack.config.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"css-loader": "^3.6.0",
"html-webpack-plugin": "^3.2.0",
"vue": "^2.6.14",
"vue-loader": "^15.9.8",
"vue-style-loader": "^4.1.3",
"vue-template-compiler": "^2.6.14",
"webpack": "^4.46.0",
"webpack-cli": "^3.3.12",
"webpack-dev-server": "^3.11.2"
}
}

  • 运行构建
1
npm run dev
  • 结果

image-20230811003600613