1.创建项目

使用create-react-app创建React+Typescript项目

  1. npx create-react-app you-react-app-name --template typescript

2.配置项目

文件引用

当我们用相对路径引用文件时,会出现嵌套多层的情况。比如import {xxx} from '../../../utils'
这样在项目后期文件很多的情况下,头会晕掉。

  1. {
  2. "compilerOptions": {
  3. "baseUrl": "./src",
  4. "target": "es5",
  5. "lib": [
  6. "dom",
  7. "dom.iterable",
  8. "esnext"
  9. ],
  10. "allowJs": true,
  11. "skipLibCheck": true,
  12. "esModuleInterop": true,
  13. "allowSyntheticDefaultImports": true,
  14. "strict": true,
  15. "forceConsistentCasingInFileNames": true,
  16. "noFallthroughCasesInSwitch": true,
  17. "module": "esnext",
  18. "moduleResolution": "node",
  19. "resolveJsonModule": true,
  20. "isolatedModules": true,
  21. "noEmit": true,
  22. "jsx": "react-jsx"
  23. },
  24. "include": [
  25. "src"
  26. ]
  27. }

我们在compilerOptions下面添加baseUrl指向src即可。

代码规范

代码重度洁癖福音,prettier+Eslint,妈妈再也不用担心我写代码的时候犯病了。

prettier配置

官方文档

  1. 安装

    1. yarn add --dev --exact prettier
  2. echo {}> .prettierrc.json

    在项目根目录下新建文件 .prettierrc.json

  3. 新建.prettierignore 不需要格式化的文件

    1. # Ignore artifacts:
    2. build
    3. coverage
  4. 自动格式化

    npx mrm lint-staged 如果是失败使用 npx mrm@2 lint-staged

修改package.json中的lint-staged

  1. "lint-staged": {
  2. "*.{js,css,md,ts,tsx}": "prettier --write"
  3. }
  1. 解决eslint和prettier的冲突 ```shell yarn add eslint-config-prettier -D

修改package.json “eslintConfig”: { “extends”: [ “react-app”, “react-app/jest”, “prettier” ] },

  1. 6. 测试是否成功
  2. ```typescript
  3. //随便写点不符合规范的代码然后 git add . > git commit -m 'xxx' 测试你的配置有没有成功
  4. var a=1
  5. var b=2
  6. console.log(a+b)

git提交规范

官方文档
安装

  1. yarn add @commitlint/config-conventional @commitlint/cli -D //window
  2. npm install --save-dev @commitlint/{config-conventional,cli}//mac
  3. //创建commitlint.config.js
  4. module.exports = {
  5. extends: ["@commitlint/config-conventional"],
  6. rules: {
  7. "type-enum": [
  8. 2,
  9. "always",
  10. [
  11. "build",
  12. "ci",
  13. "chore",
  14. "docs",
  15. "feat",
  16. "fix",
  17. "perf",
  18. "refactor",
  19. "revert",
  20. "style",
  21. "test",
  22. ],
  23. ],
  24. },
  25. };
  26. // build:主要目的是修改项目构建系统(例如 glup,webpack,rollup 的配置等)的提交
  27. // ci:主要目的是修改项目继续集成流程(例如 Travis,Jenkins,GitLab CI,Circle等)的提交
  28. // docs:文档更新
  29. // feat:新增功能
  30. // fix:bug 修复
  31. // perf:性能优化
  32. // refactor:重构代码(既没有新增功能,也没有修复 bug)
  33. // style:不影响程序逻辑的代码修改(修改空白字符,补全缺失的分号等)
  34. // test:新增测试用例或是更新现有测试
  35. // revert:回滚某个更早之前的提交
  36. // chore:不属于以上类型的其他类型
  37. 对于 Husky 的版本4和版本以下,请在 package.json 中使用以下语法
  38. "husky": {
  39. "hooks": {
  40. "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
  41. }
  42. },
  43. 或者 执行 npx husky add .husky/commit-msg 'commitlint --edit $1'

测试下 git commit -m 'build: xxxxxxxxxxxxx'

mock方案

jsonserver

Typescript utility type

Parameters

读取函数参数的类型.
例子:

  1. const add = (x:number,y:number)=>{
  2. return x+y
  3. }
  4. type Param = Parameters<typeof add> //Param=>[x:number,y:number]

image.png

Partial

将一个类型变为可选类型
例子:

  1. type Person = {
  2. name:string,
  3. age:number
  4. }
  5. const somePerson:Parital<Person> = {
  6. name:'xiaofang'
  7. }

image.png

Omit

将一个类型删除某些属性
例子:

  1. type Person = {
  2. name:string,
  3. age:number
  4. }
  5. const somePerson:Omit<Person,'name'|'age'> = {}

image.png

Pick

在一个类型选择某些属性
例子:

  1. type Person = {
  2. name:string,
  3. age:number
  4. }
  5. const somePerson:Pick<Person,'name'> = {
  6. name:'xiaofang'
  7. }

Exclude

在一个联合类型排除某些key
例子:

  1. type Age = Exclude<keyof Person,'name'>

image.png

CSS in JS

emotion
yarn add @emotion/react @emotion/styled

React Hook

useState与useReducer

两个hook在功能上是可以互换的,useState适合于定义单个的状态,useReducer适合定义一群会互相影响的状态。

redux

redux-toolkit
yarn add react-redux @reduxjs/toolkit
react-toolkit在内部集成了immer第三方库,所以我们可以直接对state.xxx进行对象属性改变,不用担心state的引用问题。

react缓存

react-query
swr
image.png

react性能优化

代码分割

React.lazy

React.memo (浅对比)