jira_react项目要点
配置文件
public/
manifest.json:pwd
robots.txt:让搜索引擎(搜索引擎爬虫)怎么对待
Disallow:/secret 不允许搜索引擎访问什么页面
根目录
- gitignore:告诉git忽略什么文件
- package.json:每个前端项目的入口文件
- readme.md
- tsconfig.json:配置typescript
- yarn.lock:锁定版本号,package.jason不能精确锁定版本号,只能锁定到版本号的倒数第一位或者第二位。
注意:在源代码中使用的图片,字体,文件都要放在src中,容易产生误解要放在public。
相对路径嵌套太多层可以配置当前目录使用绝对路径
tsconfig.json:
{
“compilerOptions”: {
“baseUrl”: “./src”,
格式化工具:Prettier
一、Husky
Husky 是一款 Git Hooks 工具,可以在执行特定的 git 命令时(如: git commit, git push)触发对应的脚本
安装: (当前版本 7.x)
1 | $ npm i -D husky |
执行以上代码之后,项目的根目录会多出一个 .husky 文件夹,并且 package.json 中会增加一个脚本执行命令
1 | // package.json |
// prepare 会在每次 npm install 的时候执行
现在 husky 已经安装好了,接下来添加对应的钩子函数
比如我需要在每次 git commit 提交前执行某些操作,就可以添加一个 commit-msg 钩子
1 | npx husky add .husky/commit-msg 'npm test' |
然后 .husky 目录下就会增加一个 commit-msg 文件
这样每一次 git commit 都会执行一次 npm test
// 如果面临特殊情况,需要绕过 Git Hooks,可以使用 –no-verify
二、 Commitlint
Commitlint 可以校验 git commit message, 只有规范的 commit message 才能提交
安装: (当前版本 16.x)
1 | npm i -D @commitlint/{config-conventional,cli} |
然后在项目根目录新建一个 commitlint.config.js 文件
1 | // commitlint.config.js |
上一节已经在项目中引入了 Husky,修改一下 commit-msg 脚本,在每次 git commit 的时候执行 commitlint 校验
1 | npx husky add .husky/commit-msg 'npx --no -- commitlint --edit $1' |
不满足规则的提交会报错
Commitlint 提交规范
commitlint 推荐我们使用 config-conventional 配置去写 commit
提交格式(注意冒号后面有空格)
git commit -m
type :用于表明我们这次提交的改动类型,是新增了功能?还是修改了测试代码?又或者是更新了文档?
optional scope:一个可选的修改范围。用于标识此次提交主要涉及到代码中哪个模块。
description:一句话描述此次提交的主要内容,做到言简意赅。
常用的 type 类型
类型 | 描述 |
---|---|
build | 编译相关的修改,例如发布版本、对项目构建或者依赖的改动 |
chore | 其他修改, 比如改变构建流程、或者增加依赖库、工具等 |
ci | 持续集成修改 |
docs | 文档修改 |
feat | 新特性、新功能 |
fix | 修改bug |
perf | 优化相关,比如提升性能、体验 |
refactor | 代码重构 |
revert | 回滚到上一个版本 |
style | 代码格式修改, 注意不是 css 修改 |
test | 测试用例修改 |
三、Lint-staged
在提交的代码的时候,可以通过 ESLint、Prettier 等工具来格式化代码
但如果直接处理全部代码,首先是可能存在性能问题,其次是可能会修改掉别的同事的代码
这时可以引入 lint-staged,它可以过滤出 Git 代码暂存区文件,这样就不会影响到未更改的文件
安装: (当前版本 12.x)
1 | npm i -D lint-staged |
然后在项目根目录创建文件 .lintstagedrc,配置所需要的规则
比如对暂存区的文件做格式化:
1 | { |
甚至对特定文件执行脚本:
1 | { |
最后通过 Husky 来执行 lint-staged
1 | npx husky add .husky/pre-commit 'npx lint-staged' |
jsx中用map渲染的每一个列表都要有一个key
jira-dev-tool:这个开发者工具用MSW以Service Worker为原理实现了“分布式后端”,即:所有请求被Service Worker代理。1.后端处理后,以localStorage为数据库进行增删改查。每个人都可以安装一个独立的后端服务和数据库,不用受任何中心化服务的影响。解决了服务脆弱,请求次数有限,不稳定,如果down了学员就没法使用以及学员对后端的数据库控制有限,如无法轻易的重置数据库。2.HTTP请求精准控制,最佳实践的项目,健壮性是一个被重点关注的点。这个开发者工具可以精准的控制HTTP的请求时间,失败概率,失败规则。可以对loading控制,对错误的控制。
安装
在public多了一个启动分布式服务必须的文件mockServiceWorker.js,将它加入到git中。
mock方案
json-server方案
1.全局安装:npm i json-server -g(全局安装的目的是在整个系统中使 json-server
命令可用,可以在任何目录中直接运行 json-server
。
2.加一个db.json作为我们mock的数据
3.启动server:json-server –watch db.json
4.把json-server嵌入到项目中
yarn add json-server -D
再在根目录新建两个文件夹:
__json_sever_mock__
在文件夹
__json_sever_mock__
中建文件:db.json把第2点加的db.json删掉
在package.json的scripts加: “json-server”:”json-server json_server_mock/db.json –watch”
启动json-server:npm run json-server
如果地址name为空,不知是要找name为空的还是忽略名字,所以要写一个函数删除键为空的对象。在一个函数里,改变传入的对象是不好的,所以复制再改变返回复制后修改的。
hook只能在其他hook或者组件中运行,不能在普通函数中运行。什么时候用函数,hook
不在输入过程中多次发送请求,使用debounce
d.ts是纯粹的说明书文件,给js打一个ts的补丁
连接真实服务端,使用的是localStorage数据库
开发者工具jira-dev-tool
安装之前要确保git没有尚未提交的文件
npm i imooc-jira-tool
把启动分布式必须的文件右键mockServiceWork–>git–>add gitignore
函数式编程中重要的pointfree消参
即使登录成功后,但是后续所有的请求都是401,刷新又回到登录页面,这是因为token失效了,如何在登录状态时让每个请求都自动携带token去服务端来保持一个登录的状态
用fetch抽象http请求方法,增强通用性
fetch为什么要手动抛出异常而不能通过catch发送异常
?:表示可选,如果有解构就不能用,可以给一个默认值,当有默认值就自动变为可选
类型别名type在很多情况下可以和interface互换,但是在或的情况下无法替换
interface也无法实现utility type,常用:Partial,Omit
安装使用antd:yarn add antd
import ‘antd/dist/antd.less’
务必在jira-dev-tool后面引入
如果要修改默认颜色,可以配置less变量来重新定义颜色,因为使用的是create-react-app,(antd官网看)要引入CRACO,安装craco,替换scripts中的react-scripts为craco…
JWT
在真实环境中,如果使用firebase这种第三方auth服务的话,本文件不需要开发者开发
useDebounce防抖
token要携带,抽象HTTP请求
即使登录成功后,但是后续所有的请求都是401,刷新又回到登录页面,这是因为token失效了,如何在登录状态时让每个请求都自动携带token去服务端来保持一个登录的状态呢。
把token参数要携带在header中,所以需要把token加在请求地址中。每次发异步请求都要加,所以封装一个函数。
- utility types 联合类型
可以自定义类型别名type,Parameters只是类型别名中的一种,很多情况下可以和interface互换。
1 | export const useHttp = () => { |
虽然?可以表示可选,但是有时我们并不想改变原来的类型(有可能是第三方库的变量),使用Partial这个utility type。Omit删除类型中的某些属性
fetch和axios
服务端如果返回异常,fetch如果不手动抛出异常,fetch不会抛出异常(可以使用catch测试)
服务端如果返回异常,axios会抛出异常
安装antd
安装craco,覆盖create-react-app创建的默认配置
css in js
在 emotion 编写css, 若是发现代码没有高亮,则需要安装 vscode/webstrom 插件:vscode styled-components插件
create-react-app默认的就是用img渲染图片,使用svg渲染
用方便的方式管理异步操作 custom hook
抽象出users和projects的异步请求
异步函数与Promise
同步和异步,为什么不能直接if(error)Error(error)而是要使用trycatch,因为如果同步代码执行了,但是异步代码还没执行,error还没获得正确值
错误边界
错误边界的实现一定要用class component
改变文档标题
方案一:使用react-helmet
方案二:自定义hook
路由
:后面表示跟的是一个变量
react-router和react-router-dom的关系类似于react和react-dom/react-native/react-vr…
react是一个核心库,处理虚拟的计算的理论的逻辑,经过一系列的计算结果会被react-dom消费,react-dom在浏览器,react-native在客户端、ios消费
react-router是可以运用在native环境中的。
为什么Link是从react-router-dom中引入,因为Link的点击等操作是和浏览器强关联的
在单页面应用(不能改变参数就重新刷新页面)中实现使用url来进行状态管理
useMemo解决依赖循环问题:
基本类型,可以放到依赖里;组件状态,可以放到依赖里;非组件状态的对象,绝不可以放到依赖里。
遇到的错误
1.没有把暂存区的代码先提交就下载了jira-dev-tool,导致不能正常的使用jira-dev-tool工具。
为什么:工具可能在安装过程中生成配置文件,用于指定特定的设置或行为。如果暂存区有未提交的更改,可能会影响配置文件的生成,导致工具无法正确设置。
2.logout不应传参
3.设置可选参数,使用Parameters来读取类型定义,否则不能成功设置可选
4.使用命令安装完antd,报错显示找不到antd.less文件,移除antd,安装更低版本的yarn add antd@^4.24.2
数据在哪?
5.闭包陷阱
useEffect中遇到闭包问题,需要检查依赖项是否设置正确