You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

222 lines
13 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 05 | 项目启动搭建Vue 3工程化项目第一步
你好,我是大圣,欢迎进入课程的第二部分——基础入门篇。
在课程导读篇我们了解了Vue 3 的新特性以及从Vue 2升级到Vue 3 的方法。相信你现在已经和小圣同学一样迫不及待地想做一个实际的项目。当然了在实战中学习Vue 3也是最好并且最快的学习方式。
不过你先别着急。在基础入门篇我会用5讲的篇幅带你学习Vue 3的核心功能包括**项目搭建、Composition API、响应式、组件化和动画**。这5讲结束后你就会对Vue 3的核心功能有一个整体的了解为我们全家桶实战篇的学习打下坚实的基础。
实际开发中除了Vue 3这个库我们还需要Vue 3 的最新全家桶也就是Vue 3的周边生态这其实就和士兵需要武器装备是一样的。今天这次我会手把手带你安装和构建Vue 3开发环境。
## 环境准备
在之前的语法演示中我们直接使用script 引入Vue 3从而在浏览器里实现了所有调试功能。但是在实际的项目中我们会使用专门的调试工具。在项目上线之前代码也需要打包压缩并且考虑到研发效率和代码可维护性所以在下面我们需要建立一个工程化的项目来实现这些功能。
你能在下图中看到我们现在要用到的工具VS Code写Vue 3的代码直接在Chrome浏览器里展示我们会在这个基础之上逐步添加新的工具。
![图片](https://static001.geekbang.org/resource/image/f5/92/f51c213d4675b994b93224077a292992.jpg?wh=571x474)
对于Vue 2官方推荐用Vue-cli创建项目而对于Vue 3我建议你使用Vite创建项目因为vite能够提供更好更快的调试体验。在使用Vite之前我们要先安装Node.js 。
下载安装Node.js的过程是傻瓜式的直接去[Node.js官网](http://nodejs.cn/download/)下载安装即可。下载的时候我们可以选择LTS版本也就是稳定版进行下载和安装即可。安装完毕后我们创建vuejs工作目录然后在命令行窗口执行node -v 指令,如果看到如下界面就算安装成功啦。
![图片](https://static001.geekbang.org/resource/image/1f/e3/1f2803761b19b82c6e9c7c37f6bb24e3.png?wh=898x146)
之后我们就可以在VS Code里进行Vue项目的开发。不过在正式开发之前我推荐使用VS Code的官方扩展插件Volar这个插件给Vue 3提供了全面的开发支持。我们访问Volar的[地址](https://marketplace.visualstudio.com/items?itemName=johnsoncodehk.volar)直接点击Install就会启动VS Code并且安装。然后使用Chrome访问 Vue 3调试插件的[地址](https://chrome.google.com/webstore/detail/vuejs-devtools/ljjemllljcmogpfapbkkighbhhppjdbg?hl=en) ,可以帮助我们在浏览器里高效的调试页面。
接下来在命令行窗口里我们对vuejs目录执行下面的命令这样就可以创建一个Vite的初始化项目。
```diff
npm init @vitejs/app
```
之后在Project name这一行我们输入项目的名字例如geek-admin接着在Select a framework这一行输入框架的名字这里我们选择vue再之后在select a variant 这一行因为在项目里我们没有选择TS所以这里我们依然选择vue即可。
![图片](https://static001.geekbang.org/resource/image/bb/8f/bbb51e602ef82234ca930b81c349f78f.png?wh=1300x966)
我们看一下geek-admin下面的文件目录这个目录就是我们项目启动的骨架了。目录中的index.html是项目的入口package.json是管理项目依赖和配置的文件public目录放置静态资源比如logo等图片vite.config.js就是和Vite相关所有工程化的配置src就是工作的重点我们大部分的代码都会在src目录下管理和书写后面我们也会在src目录下细化项目规范。
```diff
.
├── README.md
├── index.html 入口文件
├── package.json
├── public 资源文件
│ └── favicon.ico
├── src 源码
│ ├── App.vue 单文件组件
│ ├── assets
│ │ └── logo.png
│ ├── components
│ │ └── HelloWorld.vue
│ └── main.js 入口
└── vite.config.js vite工程化配置文件
```
在这之后我们在geek-admin文件夹内执行npm install 命令来进行依赖的安装然后执行npm run dev 命令来启动项目,看到如下信息就算是启动成功了。
![图片](https://static001.geekbang.org/resource/image/05/2b/052e1e7768a711d26738f885a9dcd62b.png?wh=750x318)
我们根据命令行中的提示在Chrome里打开[http://localhost:3000/](http://localhost:3000/),看到如下图所示的页面时,我们第一步就完成了。
![图片](https://static001.geekbang.org/resource/image/c6/15/c63206232ed1a27a73ff243a381e0215.png?wh=1206x1000)
完成了项目的初始化之后下一步我们会细化src目录搭建源码的骨架架构。我们去VS Code里打开项目修改一下src目录下的App.vue 文件。例如我们改动一下文件中的HelloWorld组件把msg改成“你好极客时间”之后你会发现浏览器不需要我们去刷新首页大标题就自动更新了这种热更新的开发体验会伴随我们整个项目开发极大提高我们的开发效率。
![图片](https://static001.geekbang.org/resource/image/35/0a/351a33fa19ef1997cfd49e4bd4852d0a.png?wh=1514x1058)
现在,项目的架构是下图所示的这个样子,这样我们的项目就拥有了工程化的雏形。我们来从下往上看这个架构:**我们所有工程化体系都是基于Node.js生态我们使用VS Code+Volar编辑器+语法提示工具作为上层开发工具使用Vite作为工程化工具使用Chrome进行调试**这些都是Vue 3工程化体系的必备工具。
![图片](https://static001.geekbang.org/resource/image/97/eb/973ea8e35c177d252e4180c5bbfcc6eb.jpg?wh=1418x819)
由于小圣还不熟悉TypeScript这里我们就依然使用JavaScript来开发方便学习。关于如何使用TypeScript开发Vue 3我们会在课程的第十四讲中详细地讲到。
我们开发的项目是多页面的所以vue-router和Vuex也成为了必选项就像一个团队需要人员配比Vue负责核心Vuex负责管理数据vue-router负责管理路由。我们在geek-admin目录中使用下面这段代码安装Vuex和vue-router。
```diff
npm install vue-router@next vuex@next
```
框架搭建完毕后我们如何在项目的src目录下面组织我们的路由和其他代码呢我们需要制定一些基本的规范最常见的规范就是使用文件夹来做区分。对于如何做分区下面的规范这一部分就会介绍到。
## 规范
无规矩不成方圆团队项目中的规范尤其重要。我们先对几个文件夹的分层进行规定便于管理下面是src目录的组织结构。
```diff
├── src
│ ├── api 数据请求
│ ├── assets 静态资源
│ ├── components 组件
│ ├── pages 页面
│ ├── router 路由配置
│ ├── store vuex数据
│ └── utils 工具函数
```
我们的页面需要引入路由系统我们进入到router文件夹中新建index.js写入下面的代码
```diff
import {
createRouter,
createWebHashHistory,
} from 'vue-router'
import Home from '../pages/home.vue'
import About from '../pages/about.vue'
const routes = [
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
component: About
}
]
const router = createRouter({
history: createWebHashHistory(),
routes
})
export default router
```
上面的代码中我们首先引入了createRouter和createWebHashHistory两个函数。createRouter用来新建路由实例createWebHashHistory用来配置我们内部使用hash模式的路由也就是url上会通过 `#` 来区分。
之后在上面的代码里我们引入两个组件about和home根据不同的访问地址`/` 和`/home` 去渲染不同的组件最后返回router即可。
现在页面就会报错提示我们找不到about和home这两个组件然后我们去pages下面新建两个文件分别输入如下内容
```diff
<template>
<h1>这是关于页面</h1>
</template>
```
```diff
<template>
<h1>这是首页</h1>
</template>
```
注意,这两个文件是以 `.vue` 作为后缀的这是Vue中单文件组件的写法我们可以在一个文件中通过template、script和style来维护Vue组件的HTML、JavaScript和CSS。然后我们在main.js中加载router的配置
```diff
import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index'
createApp(App)
.use(router)
.mount('#app')
```
然后去App.vue中我们删掉template之前的代码加入如下内容
```diff
<template>
<div>
<router-link to="/">首页</router-link> |
<router-link to="/about">关于</router-link>
</div>
<router-view></router-view>
</template>
```
代码中的router-link和router-view就是由vue-router注册的全局组件router-link负责跳转不同的页面相当于Vue世界中的超链接a标签 router-view负责渲染路由匹配的组件我们可以通过把router-view放在不同的地方实现复杂项目的页面布局。
我们在浏览器中打开[http://localhost:3000/](http://localhost:3000/),就会看到下图的页面,点击“关于”和“首页”都会有页面切换的效果。
![图片](https://static001.geekbang.org/resource/image/53/65/53c75db712636df79415fa2e7455db65.png?wh=686x434)
我们打开Chrome的调试窗这也是我们以后常用的调试页面在Vue这个标签页中能很清晰地看到组件的层级关系。
![图片](https://static001.geekbang.org/resource/image/30/03/303d6e1c45b7bdd848ff76257b853603.png?wh=1370x536)
至此一个多页面的Vue开发项目雏形就完成了现在的页面架构变成了下面图示的这样
![图片](https://static001.geekbang.org/resource/image/46/0a/465ae36094c1549b5804621f33cd370a.jpg?wh=1160x674)
当然这样还不够我们在实际项目开发中还会有各种工具的集成比如写CSS代码时我们需要预处理工具stylus或者sass组件库开发中我们需要Element3作为组件库网络请求后端数据的时候我们需要Axios。
对于团队维护的项目工具集成完毕后还要有严格的代码规范。我们需要Eslint和Prettier来规范代码的格式Eslint和Prettier可以规范项目中JavaScript代码的可读性和一致性。
代码的管理还需要使用Git我们默认使用GitHub来托管我们的代码。此外我们还会使用commitizen来规范Git的日志信息。
对于我们项目的基础组件我们还会提供单元测试来确保代码质量和可维护性最后我们还会配置GitHub Action来实现自动化的部署。
最后这个项目的架构大概是下面这样,这就是一个足以应对复杂项目开发的架构了:
![](https://static001.geekbang.org/resource/image/3c/2c/3c9c01bf8917b85c469d086d4d0eb52c.jpg?wh=1385x968)
**项目雏形搭建完毕后,后面用到哪一块就会把哪一块加上,也就是用一个循序渐进的方式学习。**比如我们下一讲完成一个独立功能的时候才会把Git规范加上。至此项目搭建完毕在下一讲中我们开启下一步也就是页面的主体代码编写。
## 总结
我们来总结一下今天学的知识点。首先在环境准备阶段我们基于Vite 2和Vue 3搭建了我们项目的初始化框架包含文件规范、工程化、路由和开发的基础配置后面我们所有的代码都会在这个架构基础之上进行添加。你可以理解环境准备阶段是给Vue 3提供装备的过程vue-router提供路由的管理、Vuex管理数据流、VS Code+Chrome+Vite则提供了极致的开发调试体验。
之后在本讲内容的第二部分我们制定了代码和文件夹规范。后续新增组件就要去src/components目录新增数据请求就去src/api目录。并且main.js在项目入口对路由数据进行了注册这样我们就能够通过执行 `npm run dev`启动这个项目。之后,我们就能看到首页和关于页面,这样项目的雏形我们就搭建完毕。
最后,在第二部分结尾,我还展示了一下整个项目架构的全景图,你能看到,从环境的准备到项目的初始化,再到搭建完成项目雏形,整个项目架构的全景图也在项目开发过程中逐渐完善。
## **思考题**
当然,没有完美的项目结构,那么对于我们目前的项目来说,你觉得还需要新增什么插件和工具吗?
欢迎你在留言区分享你的想法,如果你对这个项目结构还有什么疑问和建议,我们也可以一起讨论。也推荐你把这一讲推荐给你自己的朋友和同事,我们下一讲见!