第五章、web前端架构师

一路繁花似锦绣前程 / 2023-07-26 / 原文

目录
  • 九、项目整体搭建
    • 1、导学
    • 2、大话前端工具链
    • 3、使用Imooc CLI新建项目
    • 4、Vue CLI vs Vite
    • 5、ESLint
    • 6、ESLint配置文件
    • 7、小花絮:Prettier
    • 8、项目结构规范
    • 9、Git标准操作流程:Git Flow
    • 10、ant-design-vue组件库
    • 11、SPA应用路由的基本原理
    • 12、状态管理工具
    • 13、Vuex安装和基础
    • 14、总结

九、项目整体搭建

1、导学
  • 将收获什么
* 第一部分:相关准备知识
    - 前端工具链的相关工具介绍
    - 脚手架工具的使用和对比
        ~ Imooc CLI
        ~ Vue CLI
        ~ Vite
    - 编码规范
        ~ ESLint
        ~ Prettier
        ~ 产出**编码规范文档**
    - 项目结构规范
        ~ 产出**项目结构规范文档**
    - Git操作规范
        ~ Git Flow
* 第二部分:搭建项目整体框架
    - Ant Design Vue
    - Vue Router
    - Vuex
  • 关键词
* **技术规范**文档-必须落实到文档中,别放在脑子里
* Ant Design Vue
* Vue Router和Vuex
* Typescript-用了TS,一定要培养使用的习惯,看到任何变量都想到它的类型
  • 学习方法
* 对比学习:更进一步,不同工具也可以横向对比,这样可以收获的更多
* 必须亲自实践:请不要因为比较简单就不写代码,眼高手低。**无他,唯手熟尔**
* 不要教条主义:很多过程没有标准答案,适合自己的项目的方案才是最优解。
* 学会看**文档**:好的文档中有大部分的知识点。
2、大话前端工具链
* 简介
    - 前端的飞速发展:带来了更复杂的项目
    - 项目的常见需求 - 依赖管理,预编译,构建打包,压缩合并等
    - 随着项目越来越复杂 - 诞生了**前端工程化**
    - 随着工程化的产生 - 产生了对应的**前端工具链**
* 静态类型语言
    - 动态语言的弊端
        ~ **typescript**
        ~ flow
* 代码风格检查Linter
    - 多人协作的弊端,风格各异,维护和扩展的困难
        ~ eslint
* 包管理器
    - npm
    - yarn - 兼容npm registry
* 转译器Traspiler
    - 非JS或不同版本的JS翻译成符合平台要求的等价代码
        ~ Babel
* 开发服务器
    - live reload
    - HMR
* 打包工具Bundler
    - 将源代码转换成符合生产环境的代码
        ~ Webpack - Loader,Plugin,大而全的功能
        ~ Rollup - 专注于打包输出多种格式
        ~ Parcel - 零配置
* 任务管理工具Task Runner
    - 自动执行项目所需的重复任务
        ~ css预处理
        ~ 优化图片
        ~ 合并压缩javascript
        ~ 文件处理(拷贝,删除)
        ~ 监听文件变化
        ~ Gulp - 流式管道写法组合多个任务
        ~ Webpack - 通过插件的方式
        ~ npm scripts或者Shell脚本
* 脚手架Scaffolding tools
    - **将工具链聚合在一个工具内**简单,快速,零配置
        ~ Vue - Vue CLI,Vite,Imooc CLI
        ~ React - create-react-app
        ~ Angular - Angular CLI
3、使用Imooc CLI新建项目
* 不是针对某个前端框架的脚手架,而是一个**大而全更加针对业务的脚手架**
    - 支持各种模板,可扩展性
    - 云构建
    - 预发布和正式发布
    - 项目回滚
    - 远程Git操作
* 安装
    - npm install -g @imooc-cli/core
    - imooc-cli init
* 依赖**cnpm**
    - npm install -g cnpm
4、Vue CLI vs Vite
* **Vite比Vue CLI快10-100倍?**
* Vue CLI的功能
    - 工程脚手架
    - 开发服务器
    - 插件系统
    - 用户UI界面
* Vue CLI构建是基于**Webpack**的。主要耗时都在Webpack的性能上。
* Vite
    - 利用浏览器的**原生ES模块**,基于**Rollup**进行构建
    - 处于测试阶段,不是一体化的工具,目的就是一个**快速**的开发服务器和**简单的**构建工具
* 对比时刻
* 它为什么这么快?
* Vite的缺点
    - 测试阶段
    - 只支持新版支持ES modules的浏览器
    - 第三方库也需要都支持ES modules
    - CommonJS支持有限
    - 开发构建属于两套系统,可能导致生产和开发不一致行为
* Vite的前辈
    - [Snowpack](https://www.snowpack.dev/)
      **一个利用浏览器中JavaScript模块的开发服务器项目**
5、ESLint
* **规范的代码格式可以让整个工作的效率在一定程度上提升到最高**
* 没有规范可能出现的问题
    - 代码难以读懂
    - 代码提交的时候会有很多格式问题的修改,造成不必要的事件消耗
* ESLint是什么?
    - 是一个开源的JavaScript的linting工具,使用espree将JavaScript代码解析成抽象语法树
      (AST),然后通过AST来分析我们代码。
* 命令行工具
    - npx eslint --version
    - npx eslint --ext ts,vue src/**
* 编辑器插件
    - [ESLint插件](https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint)
    - [Vetur插件](https://marketplace.visualstudio.com/items?itemName=octref.vetur)
6、ESLint配置文件
* Rules
    - [ESLint可用的Rules](https://eslint.org/docs/rules/)
* Extends
* 自动修正错误
7、小花絮:Prettier
* **Prettier**顾名思义,将代码变漂亮
* ESLint的功能
    - 代码质量问题
    - 代码风格问题
* Prettier的理念
    - **An opinionated code formatter**,格式很重要,但是很重要,让我来帮你搞定!
    - Fewer Options:Prettier还给予了一部分配置项,可以通过.prettierrc文件修改。
* ESLint prettier的工作原理
    - 禁用所有和Prettier冲突的ESLint的代码格式规则
    - 将所有Prettier的规则和修改导入ESLint中,在ESLint统一的显示这些错误
8、项目结构规范
* **代码结构**针对单个文件的书写格式
* **项目结构**针对这些文件应该以怎样的标准进行存放和管理
* [React项目文件结构](https://reactjs.org/docs/faq-structure.html)
    - 按照按功能或路由组织,也就是所说的feature
    - **按照文件类型**
* 注意事项
    - 避免多层嵌套
    - 不要过度思考
* 项目结构举例
/assets
  image.png
  logo.png
/components
  ColorPicker.vue
  Dropdown.vue
  ...
/views
  Home.vue
  ...
/router
  index.ts
  ...
/store
  index.ts
  editor.ts
  user.ts
  ...
/hooks
  useURLloader.ts
  ...
/plugins
  hotKeys.ts
  ...
/test
  ColorPicker.spec.ts
App.vue
main.ts
...
9、Git标准操作流程:Git Flow
* 所有的这些规范都是针对特定的多人设定的,意在让多人协作的过程更顺畅,更简单,
  减少不必要的冲突和时间的浪费。
* Git Flow
    - 预设两个分支
        ~ master只能用来包括产品代码。你不能直接工作在这个master分支上
        ~ develop是你进行任何新的开发的基础分支
        ~ **这两个分支被称之为长期分支**
    - 功能开发feature
        ~ 整合回到develop
        ~ 等待更全面的测试
        ~ 等待和develop一起进行发布
    - 管理release
        ~ 新功能已经添加,bug已经修复
        ~ 代码已经被测试
        ~ release分支使用版本号命名的
    - bug修复hotfix
        ~ 针对master分支
    - 优点:清晰可控
    - 缺点:相对复杂,不适合持续发布
* Github Flow
    - 根据需求,从master拉出分支
    - 激烈的开发阶段,提交commit
    - 开发完毕,发起PR(pull request)
    - 代码评审(很重要!)
    - 部署,并且测试
    - 没问题,merge到master!
    - **Github flow的最大优点就是简单,对于“持续发布”的产品,可以说是最合适的流程**
* 两大规则
    - branch命名
        ~ feature开头代表功能开发
        ~ hotfix开发代码bug修复
    - commit信息,必须**言之有物**,杜绝update,fix bug这类废话
10、ant-design-vue组件库
* 两大解决方案
    - ***[ant-design-vue](https://2x.antdv.com/docs/vue/getting-started-cn/)*
    - [element-plus](https://element-plus.gitee.io/)
* 安装方式
    - npm安装配合webpack等打包工具使用
        ~ npm install ant-design-vue@next --save
    - 直接引入js和css(不推荐)
        ~ <!-- 引入样式 -->
          <link rel="stylesheet" href="https://unpkg.com/element-plus/lib/theme-chalk/index.css">
          <!-- 引入组件库 -->
          <script src="https://unpkg.com/element-plus/lib/index.full.js"></script>
* 开始使用
    - // main.ts
      import Antd from 'ant-design-vue';
      import 'ant-design-vue/dist/reset.css'; 
      app.use(Antd)
* 关于全局API
    - Vue2的时代,都是全局API和配置
        ~ Vue.component('button-counter', {})
        ~ Vue.directive('focus', {})
    - Vue2没有“app”的概念,我们定义的应用只是通过new Vue()创建的根Vue实例。从同一个Vue
      构造函数创建的每个根实例共享相同的全局配置。
        ~ 在测试期间,全局配置很容易意外地污染其他测试用例
        ~ 全局配置使得在同一页面上的多个“app”之间共享同一个Vue副本非常困难
        ~ Vue.mixin({
            /* ... */
          })
          const app1 = new Vue({el: '#app-1'})
          const app2 = new Vue({el: '#app-2'})
    - **Vue3的做法:createApp**
        ~ import {createApp} from 'vue'
          const app = createApp({})
        ~ 应用实例暴露当前全局API的子集,任何全局改变Vue行为的API现在都会移动到**应用实例**上,
          现在就不会产生vue2的这些冲突了。
11、SPA应用路由的基本原理
* SPA和普通网页应用的区别
    - 普通网页
        ~ 跳转到新页面,每次重新加载所有资源
        ~ HTML内容是后端直接渲染的
    - SPA应用
        ~ 不跳转,JS拦截跳转,修改URL
        ~ JS动态渲染DOM内容
* SPA路由的实现方式
    - History API
        ~ [pushState](https://developer.mozilla.org/zh-CN/docs/Web/API/History/pushState)
        ~ [codesandbox](https://codesandbox.io/s/optimistic-cookies-wgxhc?file=/src/index.js)
    - URL Hash
* SPA优点
    - 速度快
    - 体验好
    - 为前后端分离提供了实践场所
* Vue Router4
    - https://router.vuejs.org/zh/
12、状态管理工具
* 什么是状态管理工具
    - 首先搞清楚,是否真的需要状态管理工具
    - 它随着SPA的出现,而浮出水面。客户端需要处理复杂的状态数据。
    - 多个组件需要共享的一系列数据,称之为全局数据。
* 解决方案
    - 方案一:单向数据流,从父组件传递到子组件
    - 方案一缺点:
        ~ 多层传递非常繁琐
        ~ 中间传递层有可能根本不需要这个数据
        ~ 根组件压力太大,逻辑代码会非常繁杂
    - 方案二:使用全局对象
    - 方案二缺点:
        ~ 数据非响应式
        ~ 修改无法追踪
        ~ 直接从组件获取数据是一种反模式
* 状态管理工具三杰
    - Vuex
    - Redux
    - Mobx
* 状态管理工具的特点
    - store,神奇的全局数据结构:single source of truth
    - 不能随意修改,调用特殊的方法来实现数据修改
    - 变化可追溯,可预测(predictable)
13、Vuex安装和基础
* Vue的数据流
    -       Actions(methods)
             ↗             ↘         
      View(template) ←  State(data)
* 出现问题:多组件共享状态
    - 根组件多层传递的困境
    - 多组件同步数据的繁琐
* Vuex的解决方案
    - Vue Components  →  (dispatch)Actions
              ↑               ↓
            State     ←  (commit)Mutations
* Vuex的特点
14、总结
* 知识点
    - 脚手架
        ~ Imooc CLI
        ~ Vue CLI
        ~ Vite
    - 代码规范
        ~ ESLint简介,使用和配置文件
        ~ Prettier的定位和作用以及使用
        ~ 产出:代码规范文档:https://www.yuque.com/imooc-lego/elp4vn/wtg4vo
    - 项目文件结构和命名规范
        ~ 产出:文件结构和命名规范文档:https://www.yuque.com/imooc-lego/elp4vn/igcosu
    - Git Flow
        ~ 标准Git Flow
        ~ **Github Flow**
        ~ 产出Git操作规范文档:https://www.yuque.com/imooc-lego/elp4vn/cwu0z1
    - Ant Design Vue
        ~ 安装,全局导入和使用
        ~ 多看文档,多用
    - Vue Router
        ~ SPA router的简单原理
        ~ 安装,全局引入
        ~ 添加路由,使用内置组件router-view和router-link
        ~ 使用钩子函数useRoute和useRouter获取路由信息和跳转
    - Vuex
        ~ 全局状态工具的定义
        ~ 安装,概念:**store,state,mutations**,使用commit提交mutations
        ~ 使用钩子函数useStore
        ~ 使用module将store拆分成多个模块
* 要点
    - **文档化**标准
    - **Typescript**深入编码理念中
* 作业
    - 根据我的介绍,写自己的**技术规范文档**,你可以根据我的简介和自己的偏好,
      写出适合自己项目的文档