# 第七章 前端工程化 ## 一、前端工程化开篇 ### 1.1 什么是前端工程化 > `前端工程化`是使用`软件工程的方法`来`单独`解决`前端`的开发流程中`模块化、组件化、规范化、自动化`的问题,其主要目的为了提高效率和降低成本。 ### 1.2 前端工程化实现技术栈 > 前端工程化实现的技术栈有很多,我们采用ES6+nodejs+npm+Vite+VUE3+router+pinia+axios+Element-plus组合来实现 + ECMAScript6 VUE3中大量使用ES6语法 + Nodejs 前端项目运行环境 + npm 依赖下载工具 + vite 前端项目构建工具 + VUE3 优秀的渐进式前端框架 + router 通过路由实现页面切换 + pinia 通过状态管理实现组件数据传递 + axios ajax异步请求封装技术实现前后端数据交互 + Element-plus 可以提供丰富的快速构建网页的组件仓库 ## 二、ECMA6Script ### 2.1. es6的介绍 > ECMAScript 6,简称ES6,是**JavaScript**语言的一次重大更新。它于**2015**年发布,是原来的ECMAScript标准的第六个版本。ES6带来了大量的新特性,包括箭头函数、模板字符串、let和const关键字、解构、默认参数值、模块系统等等,大大提升了JavaScript的开发体验。`由于VUE3中大量使用了ES6的语法,所以ES6成为了学习VUE3的门槛之一` > ES6对JavaScript的改进在以下几个方面: 1. 更加简洁:ES6引入了一些新的语法,如箭头函数、类和模板字符串等,使代码更加简洁易懂。 2. 更强大的功能:ES6引入了一些新的API、解构语法和迭代器等功能,从而使得JavaScript更加强大。 3. 更好的适用性:ES6引入的模块化功能为JavaScript代码的组织和管理提供了更好的方式,不仅提高了程序的可维护性,还让JavaScript更方便地应用于大型的应用程序。 > 总的来说,ES6在提高JavaScript的核心语言特性和功能方面取得了很大的进展。由于ES6已经成为了JavaScript的标准,它的大多数新特性都已被现在浏览器所支持,因此现在可以放心地使用ES6来开发前端应用程序。 **历史版本:** | 标准版本 | 发布时间 | 新特性 | | -------- | -------- | ------------------------------------------------------------ | | ES1 | 1997年 | 第一版 ECMAScript | | ES2 | 1998年 | 引入setter和getter函数,增加了try/catch,switch语句允许字符串 | | ES3 | 1999年 | 引入了正则表达式和更好的字符串处理 | | ES4 | 取消 | 取消,部分特性被ES3.1和ES5继承 | | ES5 | 2009年 | Object.defineProperty,JSON,严格模式,数组新增方法等 | | ES5.1 | 2011年 | 对ES5做了一些勘误和例行修订 | | `ES6` | `2015年` | `箭头函数、模板字符串、解构、let和const关键字、类、模块系统等` | | ES2016 | 2016年 | 数组.includes,指数操作符(\*\*),Array.prototype.fill等 | | ES2017 | 2017年 | 异步函数async/await,Object.values/Object.entries,字符串填充 | | ES2018 | 2018年 | 正则表达式命名捕获组,几个有用的对象方法,异步迭代器等 | | ES2019 | 2019年 | Array.prototype.{flat,flatMap},Object.fromEntries等 | | ES2020 | 2020年 | BigInt、动态导入、可选链操作符、空位合并操作符 | | ES2021 | 2021年 | String.prototype.replaceAll,逻辑赋值运算符,Promise.any等 | | ... ... | | | ### 2.2 es6的变量和模板字符串 > ES6 新增了`let`和`const`,用来声明变量,使用的细节上也存在诸多差异 > + let 和var的差别 1、let 不能重复声明 2、let有块级作用域,非函数的花括号遇见let会有块级作用域,也就是只能在花括号里面访问。 3、let不会预解析进行变量提升 4、let 定义的全局变量不会作为window的属性 5、let在es6中推荐优先使用 ```html ``` + const和var的差异 1、新增const和let类似,只是const定义的变量不能修改 2、并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。 ```html ``` > 模板字符串(template string)是增强版的字符串,用反引号(`)标识 1、字符串中可以出现换行符 2、可以使用 ${xxx} 形式输出变量和拼接变量 ``` html ``` ### 2.3 es6的解构表达式 > ES6 的解构赋值是一种方便的语法,可以快速将数组或对象中的值拆分并赋值给变量。解构赋值的语法使用花括号 `{}` 表示对象,方括号 `[]` 表示数组。通过解构赋值,函数更方便进行参数接受等! > **数组解构赋值** + 可以通过数组解构将数组中的值赋值给变量,语法为: ```javascript let [a, b, c] = [1, 2, 3]; //新增变量名任意合法即可,本质是按照顺序进行初始化变量的值 console.log(a); // 1 console.log(b); // 2 console.log(c); // 3 ``` + 该语句将数组 \[1, 2, 3] 中的第一个值赋值给 a 变量,第二个值赋值给 b 变量,第三个值赋值给 c 变量。 可以使用默认值为变量提供备选值,在数组中缺失对应位置的值时使用该默认值。例如: ```javascript let [a, b, c, d = 4] = [1, 2, 3]; console.log(d); // 4 ``` > **对象解构赋值** + 可以通过对象解构将对象中的值赋值给变量,语法为: ```javascript let {a, b} = {a: 1, b: 2}; //新增变量名必须和属性名相同,本质是初始化变量的值为对象中同名属性的值 //等价于 let a = 对象.a let b = 对象.b console.log(a); // 1 console.log(b); // 2 ``` + 该语句将对象 {a: 1, b: 2} 中的 a 属性值赋值给 a 变量,b 属性值赋值给 b 变量。 可以为标识符分配不同的变量名称,使用 : 操作符指定新的变量名。例如: ```javascript let {a: x, b: y} = {a: 1, b: 2}; console.log(x); // 1 console.log(y); // 2 ``` > **函数参数解构赋值** + 解构赋值也可以用于函数参数。例如: ```javascript function add([x, y]) { return x + y; } add([1, 2]); // 3 ``` + 该函数接受一个数组作为参数,将其中的第一个值赋给 x,第二个值赋给 y,然后返回它们的和。 + ES6 解构赋值让变量的初始化更加简单和便捷。通过解构赋值,我们可以访问到对象中的属性,并将其赋值给对应的变量,从而提高代码的可读性和可维护性。 ### 2.4 es6的箭头函数 > ES6 允许使用“箭头” 义函数。语法类似Java中的Lambda表达式 #### 2.4.1 声明和特点 ```html ``` #### 2.4.2 实践和应用场景 ```html
> Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,可以使 JavaScript 运行在服务器端。使用 Node.js,可以方便地开发服务器端应用程序,如 Web 应用、API、后端服务,还可以通过 Node.js 构建命令行工具等。相比于传统的服务器端语言(如 PHP、Java、Python 等),Node.js 具有以下特点:
- 单线程,但是采用了事件驱动、异步 I/O 模型,可以处理高并发请求。
- 轻量级,使用 C++ 编写的 V8 引擎让 Node.js 的运行速度很快。
- 模块化,Node.js 内置了大量模块,同时也可以通过第三方模块扩展功能。
- 跨平台,可以在 Windows、Linux、Mac 等多种平台下运行。
> Node.js 的核心是其管理事件和异步 I/O 的能力。Node.js 的异步 I/O 使其能够处理大量并发请求,并且能够避免在等待 I/O 资源时造成的阻塞。此外,Node.js 还拥有高性能网络库和文件系统库,可用于搭建 WebSocket 服务器、上传文件等。`在 Node.js 中,我们可以使用 JavaScript 来编写服务器端程序,这也使得前端开发人员可以利用自己已经熟悉的技能来开发服务器端程序,同时也让 JavaScript 成为一种全栈语言。`Node.js 受到了广泛的应用,包括了大型企业级应用、云计算、物联网、游戏开发等领域。常用的 Node.js 框架包括 Express、Koa、Egg.js 等,它们能够显著提高开发效率和代码质量。
#### 3.1.2 如何安装nodejs
1. 打开官网https://nodejs.org/en下载对应操作系统的 LTS 版本。
2. 双击安装包进行安装,安装过程中遵循默认选项即可(或者参照https://www.runoob.com/nodejs/nodejs-install-setup.html )。安装完成后,可以在命令行终端输入 `node -v` 和 `npm -v` 查看 Node.js 和 npm 的版本号。

3. 定义一个app.js文件,cmd到该文件所在目录,然后在dos上通过`node app.js`命令即可运行
``` javascript
function sum(a,b){
return a+b;
}
function main(){
console.log(sum(10,20))
}
main()
```
### 3.2 npm 配置和使用
#### 3.2.1 npm介绍
> NPM全称Node Package Manager,是Node.js包管理工具,是全球最大的模块生态系统,里面所有的模块都是开源免费的;也是Node.js的包管理工具,相当于后端的Maven 。
#### 3.2.2 npm 安装和配置
> 1.安装
+ 安装node,自动安装npm包管理工具!
> 2.配置依赖下载使用阿里镜像
+ npm 安装依赖包时默认使用的是官方源,由于国内网络环境的原因,有时会出现下载速度过慢的情况。为了解决这个问题,可以配置使用阿里镜像来加速 npm 的下载速度,具体操作如下:
+ 打开命令行终端,执行以下命令,配置使用阿里镜像:
+ 原来的 registry.npm.taobao.org 已替换为 registry.npmmirror.com
``` shell
npm config set registry https://registry.npmmirror.com
```
+ 确认配置已生效,可以使用以下命令查看当前 registry 的配置:如果输出结果为 `https://registry.npmmirror.com`,说明配置已成功生效。
```shell
npm config get registry
```
+ 如果需要恢复默认的官方源,可以执行以下命令:
```javascript
npm config set registry https://registry.npmjs.org/
```
> 3.配置全局依赖下载后存储位置
+ 在 Windows 系统上,npm 的全局依赖默认安装在 `<用户目录>\AppData\Roaming\npm` 目录下。
+ 如果需要修改全局依赖的安装路径,可以按照以下步骤操作:
1. 创建一个新的全局依赖存储目录,例如 `D:\GlobalNodeModules`。
2. 打开命令行终端,执行以下命令来配置新的全局依赖存储路径:
``` shell
npm config set prefix "D:\GlobalNodeModules"
```
3. 确认配置已生效,可以使用以下命令查看当前的全局依赖存储路径:
``` shell
npm config get prefix
```
> 4.升级npm版本
+ cmd 输入npm -v 查看版本
+ 如果node中自带的npm版本过低!则需要升级至9.6.6!
```shell
npm install -g npm@9.6.6
```
#### 3.2.3 npm 常用命令
> 1.项目初始化
+ npm init
+ 进入一个vscode创建好的项目中, 执行 npm init 命令后,npm 会引导您在命令行界面上回答一些问题,例如项目名称、版本号、作者、许可证等信息,并最终生成一个package.json 文件。package.json信息会包含项目基本信息!类似maven的pom.xml
+ npm init -y
+ 执行,-y yes的意思,所有信息使用当前文件夹的默认值!不用挨个填写!
> 2.安装依赖 (查看所有依赖地址 https://www.npmjs.com )
+ npm install 包名 或者 npm install 包名@版本号
+ 安装包或者指定版本的依赖包(安装到当前项目中)
+ npm install -g 包名
+ 安装全局依赖包(安装到d:/GlobalNodeModules)则可以在任何项目中使用它,而无需在每个项目中独立安装该包。
+ npm install
+ 安装package.json中的所有记录的依赖
> 3.升级依赖
+ npm update 包名
+ 将依赖升级到最新版本
> 4.卸载依赖
+ npm uninstall 包名
> 5.查看依赖
+ npm ls
+ 查看项目依赖
+ npm list -g
+ 查看全局依赖
> 6.运行命令
+ npm run 命令是在执行 npm 脚本时使用的命令。npm 脚本是一组在 package.json 文件中定义的可执行命令。npm 脚本可用于启动应用程序,运行测试,生成文档等,还可以自定义命令以及配置需要运行的脚本。
+ 在 package.json 文件中,scripts 字段是一个对象,其中包含一组键值对,键是要运行的脚本的名称,值是要执行的命令。例如,以下是一个简单的 package.json 文件:
```json
{
"name": "my-app",
"version": "1.0.0",
"scripts": {
"start": "node index.js",
"test": "jest",
"build": "webpack"
},
"dependencies": {
"express": "^4.17.1",
"jest": "^27.1.0",
"webpack": "^5.39.0"
}
}
```
+ scripts 对象包含 start、test 和 build 三个脚本。当您运行 npm run start 时,将运行 node index.js,并启动应用程序。同样,运行 npm run test 时,将运行 Jest 测试套件,而 npm run build 将运行 webpack 命令以生成最终的构建输出。
+ 总之,npm run 命令为您提供了一种在 package.json 文件中定义和管理一组指令的方法,可以在项目中快速且灵活地运行各种操作。
## 四、Vue3简介和快速体验
### 4.1 Vue3介绍

> Vue (发音为 /vjuː/,类似 **view**) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。官网为:
+ 尤雨溪(Evan You),毕业于科尔盖特大学,前端框架Vue.js的作者、HTML5版Clear的打造人、独立开源开发者。曾就职于Google Creative Labs和Meteor Development Group。由于工作中大量接触开源的JavaScript项目,最后自己也走上了开源之路,现全职开发和维护Vue.js
+ 尤雨溪毕业于上海复旦附中,在美国完成大学学业,本科毕业于Colgate University,后在Parsons设计学院获得Design & Technology艺术硕士学位,任职于纽约Google Creative Lab。
+ 尤雨溪大学专业并非是计算机专业,在大学期间他学习专业是室内艺术和艺术史,后来读了美术设计和技术的硕士,正是在读硕士期间,他偶然接触到了JavaScript,从此被这门编程语言深深吸引,开启了自己的前端生涯。
### 4.2 Vue3快速体验(非工程化方式)
```html
> 在浏览器支持 ES 模块之前,JavaScript 并没有提供原生机制让开发者以模块化的方式进行开发。这也正是我们对 “打包” 这个概念熟悉的原因:使用工具抓取、处理并将我们的源码模块串联成可以在浏览器中运行的文件。时过境迁,我们见证了诸如 [webpack](https://webpack.js.org/ "webpack")、[Rollup](https://rollupjs.org/ "Rollup") 和 [Parcel](https://parceljs.org/ "Parcel") 等工具的变迁,它们极大地改善了前端开发者的开发体验
+ 当我们开始构建越来越大型的应用时,需要处理的 JavaScript 代码量也呈指数级增长。
+ 包含数千个模块的大型项目相当普遍。基于 JavaScript 开发的工具就会开始遇到性能瓶颈:通常需要很长时间(甚至是几分钟!)才能启动开发服务器,即使使用模块热替换(HMR),文件修改后的效果也需要几秒钟才能在浏览器中反映出来。如此循环往复,迟钝的反馈会极大地影响开发者的开发效率和幸福感。
> Vite 旨在利用生态系统中的新进展解决上述问题:浏览器开始原生支持 ES 模块,且越来越多 JavaScript 工具使用编译型语言编写。https://cn.vitejs.dev/guide/why.html前端工程化的作用包括但不限于以下几个方面:
1. 快速创建项目:使用脚手架可以快速搭建项目基本框架,避免从零开始搭建项目的重复劳动和繁琐操作,从而节省时间和精力。
2. 统一的工程化规范:前端脚手架可以预设项目目录结构、代码规范、git提交规范等统一的工程化规范,让不同开发者在同一个项目上编写出风格一致的代码,提高协作效率和质量。
3. 代码模板和组件库:前端脚手架可以包含一些常用的代码模板和组件库,使开发者在实现常见功能时不再重复造轮子,避免因为轮子质量不高带来的麻烦,能够更加专注于项目的业务逻辑。
4. 自动化构建和部署:前端脚手架可以自动进行代码打包、压缩、合并、编译等常见的构建工作,可以通过集成自动化部署脚本,自动将代码部署到测试、生产环境等。
### 5.2 Vite创建Vue3工程化项目
#### 5.2.1 Vite+Vue3项目的创建、启动、停止
> 1 使用命令行创建工程
+ 在磁盘的合适位置上,创建一个空目录用于存储多个前端项目
+ 用vscode打开该目录
+ 在vocode中打开命令行运行如下命令
```shell
npm create vite@latest
```
+ 第一次使用vite时会提示下载vite,输入y回车即可,下次使用vite就不会出现了

+ 注意: 选择vue+JavaScript选项即可
> 2 安装项目所需依赖
+ cd进入刚刚创建的项目目录
+ npm install命令安装基础依赖
``` shell
cd ./vue3-demo1
npm install
```
> 3 启动项目
+ 查看项目下的package.json
```json
{
"name": "vue3-demo1",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"bootstrap": "^5.2.3",
"sass": "^1.62.1",
"vue": "^3.2.47"
},
"devDependencies": {
"@vitejs/plugin-vue": "^4.1.0",
"vite": "^4.3.2"
}
}
```
``` shell
npm run dev
```
> 5 停止项目
+ 命令行上 ctrl+c
#### 5.2.2 Vite+Vue3项目的目录结构
> 1.下面是 Vite 项目结构和入口的详细说明:

- public/ 目录:用于存放一些公共资源,如 HTML 文件、图像、字体等,这些资源会被直接复制到构建出的目标目录中。
- src/ 目录:存放项目的源代码,包括 JavaScript、CSS、Vue 组件、图像和字体等资源。在开发过程中,这些文件会被 Vite 实时编译和处理,并在浏览器中进行实时预览和调试。以下是src内部划分建议:
1. `assets/` 目录:用于存放一些项目中用到的静态资源,如图片、字体、样式文件等。
2. `components/` 目录:用于存放组件相关的文件。组件是代码复用的一种方式,用于抽象出一个可复用的 UI 部件,方便在不同的场景中进行重复使用。
3. `layouts/` 目录:用于存放布局组件的文件。布局组件通常负责整个应用程序的整体布局,如头部、底部、导航菜单等。
4. `pages/` 目录:用于存放页面级别的组件文件,通常是路由对应的组件文件。在这个目录下,可以创建对应的文件夹,用于存储不同的页面组件。
5. `plugins/` 目录:用于存放 Vite 插件相关的文件,可以按需加载不同的插件来实现不同的功能,如自动化测试、代码压缩等。
6. `router/` 目录:用于存放 Vue.js 的路由配置文件,负责管理视图和 URL 之间的映射关系,方便实现页面之间的跳转和数据传递。
7. `store/` 目录:用于存放 Vuex 状态管理相关的文件,负责管理应用程序中的数据和状态,方便统一管理和共享数据,提高开发效率。
8. `utils/` 目录:用于存放一些通用的工具函数,如日期处理函数、字符串操作函数等。
- vite.config.js 文件:Vite 的配置文件,可以通过该文件配置项目的参数、插件、打包优化等。该文件可以使用 CommonJS 或 ES6 模块的语法进行配置。
- package.json 文件:标准的 Node.js 项目配置文件,包含了项目的基本信息和依赖关系。其中可以通过 scripts 字段定义几个命令,如 dev、build、serve 等,用于启动开发、构建和启动本地服务器等操作。
- Vite 项目的入口为 src/main.js 文件,这是 Vue.js 应用程序的启动文件,也是整个前端应用程序的入口文件。在该文件中,通常会引入 Vue.js 及其相关插件和组件,同时会创建 Vue 实例,挂载到 HTML 页面上指定的 DOM 元素中。
> 2.vite的运行界面
+ 在安装了 Vite 的项目中,可以在 npm scripts 中使用 `vite` 可执行文件,或者直接使用 `npx vite` 运行它。下面是通过脚手架创建的 Vite 项目中默认的 npm scripts:(package.json)
```json
{
"scripts": {
"dev": "vite", // 启动开发服务器,别名:`vite dev`,`vite serve`
"build": "vite build", // 为生产环境构建产物
"preview": "vite preview" // 本地预览生产构建产物
}
}
```
+ 运行设置端口号:(vite.config.js)
```javascript
//修改vite项目配置文件 vite.config.js
export default defineConfig({
plugins: [vue()],
server:{
port:3000
}
})
```
#### 5.2.3 Vite+Vue3项目组件(SFC入门)
> 什么是VUE的组件?
+ 一个页面作为整体,是由多个部分组成的,每个部分在这里就可以理解为一个组件
+ 每个.vue文件就可以理解为一个组件,多个.vue文件可以构成一个整体页面
+ 组件化给我们带来的另一个好处就是组件的复用和维护非常的方便
> 什么是.vue文件?
+ 传统的页面有.html文件.css文件和.js文件三个文件组成(多文件组件)
+ vue将这文件合并成一个.vue文件(Single-File Component,简称 SFC,单文件组件)
+ .vue文件对js/css/html统一封装,这是VUE中的概念 该文件由三个部分组成 `
```
> 2 vue3响应式数据入门
```html
| 序号 | 商品名 | 价格 | 数量 | 小计 | 操作 |
|---|---|---|---|---|---|
| {{ index+1 }} | {{ cart.name }} | {{ cart.price + '元' }} | {{ cart.number }} | {{ cart.price*cart.number + '元'}} | |
| 购物车没有数据! | |||||