涉及知识
- 构建工具:Webpack5.x
- 前端框架:Vue 3.x
- 路由工具:Vue Router 4.x
- CSS 预编译:Less
- Git Hook 工具:husky
- 代码规范:Prettier + Eslint + Airbnb
- 自动部署:Github Actions
一、webpack基础配置
1、每一个伟大的项目从npm init 开始
1 | // 初始化项目 |
2、webpack 三件套
1 | // 本体, 脚手架, 热加载 |
3、区分开发环境与生产环境
1 | // 新增目录结构 |
4、安装dotenv
、cross-env
配置环境变量
cross-env : windows不支持NODE_ENV=development的这样的设置方式,所以需要引入库实现兼容
dotenv : 支持.env, 可将环境变量从.env文件加载到process.env中
1 | cross-env 就是运行跨平台设置和使用环境变量的脚本。 |
5、运行
1 | // 在根目录下新增 src文件夹,index.js文件 |
6、安装 vue3 和 vue-loader
1 | // 安装vue |
7、Es6优雅降级
1 | // babel 三件套 |
8、安装html-webpack-plugin
安装 html-webpack-plugin 插件处理 index.html 文件,此插件的功能是根据提供的模板文件,自动生成正确的项目入口文件,并把 webpack 打包的 js 文件自动插入其中
1 |
|
9、添加vue-router
1 | npm i vueRouter@last -D |
10、添加 less 预处理器
1 | // 四件套 |
11、添加路径别名
assets和static文件夹的区别
相信有很多人知道vue-cli有两个放置静态资源的地方,分别是src/assets文件夹和static文件夹,这两者的区别很多人可能不太清楚。
assets目录中的文件会被webpack处理解析为模块依赖,只支持相对路径形式。例如,在
和 background: url(./logo.png)中,”./logo.png” 是相对的资源路径,将由Webpack解析为模块依赖。
static/ 目录下的文件并不会被Webpack处理:它们会直接被复制到最终的打包目录(默认是dist/static)下。必须使用绝对路径引用这些文件,这是通过在 config.js 文件中的 build.assetsPublicPath 和 build.assetsSubDirectory 连接来确定的。
任何放在 static/ 中文件需要以绝对路径的形式引用:/static/[filename]。
在我们实际的开发中,总的来说:static放不会变动的文件 assets放可能会变动的文件。
1 | // webpack.common.config.js |
[注意]:
这里给’static’赋予了一个地址,那么在程序中引入路径的时候 ’~static’ 就直接可以代替路径’../static’
12、处理图片等静态资源
Webpack5 之前我们处理静态资源比如PNG 图片、SVG 图标等等,需要用到url-loader,file-loader,raw-loader。Webpack5 提供了内置的静态资源构建能力,我们不需要安装额外的 loader,仅需要简单的配置就能实现静态资源的打包和分目录存放。这三个loader在github上也停止了更新。
webpack5使用四种新增的资源模块(Asset Modules[3])替代了这些loader的功能。
asset/resource 将资源分割为单独的文件,并导出url,就是之前的 file-loader的功能.
asset/inline 将资源导出为dataURL(url(data:))的形式,之前的 url-loader的功能.
asset/source 将资源导出为源码(source code). 之前的 raw-loader 功能.
asset 自动选择导出为单独文件或者 dataURL形式(默认为8KB). 之前有url-loader设置asset size limit 限制实现。
1 |
|
13、清除dist目录
webpack5.20以下版本清除dist文件内容一般使用插件 clean-webpack-plugin, 5.20版本以后output新增特性clean,用于清除dist目录
1 |
|
14、FileSystem Cache 加速二次构建
Webpack5 之前,我们会使用 cache-loader[4] 缓存一些性能开销较大的 loader ,或者是使用 hard-source-webpack-plugin[5] 为模块提供一些中间缓存。在 Webpack5 之后,默认就为我们集成了一种自带的缓存能力(对 module 和 chunks 进行缓存[6])。通过如下配置,即可在二次构建时提速。
1 |
|
以上介绍只是webpack5的新特性和比较基础的配置,后续还是要因应需求去配置。包括css分离、css压缩、js压缩等,在这里就不一一展开讨论。
二、代码规范
如果需要团队合作完成我们就要考虑代码规范的问题,由于 JavaScript 的灵活性,往往一段代码能有多种写法,这时候也会导致协同时差异。并且,有一些写法可能会导致不易发现的 bug,或者这些写法的性能不好,开发时也应该避免。
为了解决这类静态代码问题,每个团队都需要一个统一的 JavaScript 代码规范,团队成员都遵守这份代码规范来编写代码。当然,靠人来保障代码规范是不可靠的,需要有对应的工具来保障。
1 | 1、安装 Prettier |
三、提交git仓库
1、在根目录新建一个提交忽略的文件.gitignore
1 | // .gitignore 新增忽略提交的文件 |
2、提交规范
我们在项目中已集成 ESLint 和 Prettier,在编码时,这些工具可以对我们写的代码进行实时校验,在一定程度上能有效规范我们写的代码,但团队可能会有些人觉得这些条条框框的限制很麻烦,选择视“提示”而不见,依旧按自己的一套风格来写代码,或者干脆禁用掉这些工具,开发完成就直接把代码提交到了仓库,日积月累,ESLint 也就形同虚设。
所以,我们还需要做一些限制,让没通过 ESLint 检测和修复的代码禁止提交,从而保证仓库代码都是符合规范的。
为了解决这个问题,我们需要用到 Git Hook,在本地执行 git commit
的时候,就对所提交的代码进行 ESLint 检测和修复(即执行 eslint \--fix
),如果这些代码没通过 ESLint 规则校验,则禁止提交。
实现这一功能,我们借助 husky[7]
husky[8] —— Git Hook 工具,可以设置在 git 各个阶段(
pre-commit
、commit-msg
、pre-push
等)触发我们的命令。
使用 husky-init
命令快速在项目初始化一个 husky 配置。
1 | npx husky-init && cnpm install |
执行命令生成了一个.husky
文件夹和一些文件
image.png
修改 pre-commit
1 | #!/bin/sh |
package.json 添加命令
1 | "scripts": { |
测试一下提交代码,会看到有报错的代码是提交不了的
四、自动部署项目
创建 GitHub Token
创建一个有 repo 和 workflow 权限的 GitHub Token[9]
image.png
注意:新生成的 Token 只会显示一次,保存起来,后面要用到。如有遗失,重新生成即可。
在仓库中添加 secret
将上面新创建的 Token 添加到 GitHub 仓库的 Secrets
里,并将这个新增的 secret
命名为NIGO_DEV
(名字无所谓,看你喜欢)。
步骤:仓库 -> settings
-> Secrets
-> New repository secret
。
image.png
创建 Actions 配置文件
- 在项目根目录下创建
.github
目录。 - 在
.github
目录下创建workflows
目录。 - 在
workflows
目录下创建deploy.yml
文件。
image.png
修改 deploy.yml
文件,添加如下代码
1 | name: deploy |
接着只要提交修改代码,Github Actions就会运行自动部署
image.png
这里部署后的代码会放到gh-pages
分支,gh-pages
分支是自动创建的
github仓库 -> settings
-> pages
读取gh-pages
分支,然后访问shinewen189.github.io/nigo-cli/[10]
image.png
自动部署只是 GitHub Actions 功能一小部分,GitHub Actions 能做的事还很多很多,感兴趣的同学自行查阅。
码云项目构建
1 | 登录注册后(可以使用微信,qq等) |
最后
一套完整的前端工程架构方案,需要考虑技术选型、区分环境、代码规范、提交规范、测试、自动部署等等。本项目对于每项技术栈只是提供较为基础的配置,同学们可以按照自己的需求对本项目每个技术栈展开研究或针对性配置,找出自己最适合的工程化方案。
最后再贴上项目地址
github: wyf195075595/github.io/github-actions-demo
gitee: https://wangyf1024.gitee.io/
- 本文作者: 王不留行
- 本文链接: https://wyf195075595.github.io/2022/06/17/programming/构建工具/架构搭建5.x/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!