乐趣区

关于javascript:vitejs-typescript-react-项目搭建过程实践

本文记录了应用 vitejs, antd, react, redux 搭建我的项目过程,其它蕴含了集成 jest 单元测试,tailwindcss 应用,eslint 代码格式化以及 git 代码提交规范化等性能。

1. 初始化我的项目

咱们应用 Vite.js 来打包咱们的代码。

运行如下命令:

pnpm create vite

会呈现如下的抉择:

√ Project name: ... react-redux-starter   # 设置我的项目名  这里咱们设置为 react-redux-starter
√ Select a framework: » React  # 抉择框架 React
√ Select a variant: » TypeScript + SWC 

到这里咱们我的项目初始化实现。这时能够看到咱们初始化的我的项目目录如下:

react-redux-starter
    │  .gitignore
    │  index.html
    │  package.json
    │  tsconfig.json     # typescript 配置文件
    │  tsconfig.node.json # typescript 配置文件
    │  vite.config.ts    # vite 配置文件
    │
    ├─public
    │      vite.svg
    │
    └─src
        │  App.css
        │  App.tsx
        │  index.css
        │  main.tsx
        │  vite-env.d.ts
        │
        └─assets
                react.svg

这里咱们先把初始化的代码清理一下:

App.cssindex.css 清空

// App.tsx

import './App.css'

function App() {
  return (
    <div>
      Hello world!
    </div>
  )
}

export default App

这一步骤 代码参考

2 集成 antd 与 tailwindcss

pnpm add antd @ant-design/icons
pnpm install -D tailwindcss postcss autoprefixer

# 生成 tailwind 配置文件
npx tailwindcss init -p

运行完以上命令,在根目录下会生成两个配置文件 postcss.config.jstailwindcss.config.js, 其中 postcss.config.js 这个文件是不须要批改的,咱们用默认的生成的就行。而后咱们批改一下 tailwindcss.config.js 这个配置文件如下:

/** @type {import('tailwindcss').Config} */
module.exports = {
 // content 配置 tailwind 要解决的文件。// 只有在这里配置的文件,能力应用 tailwind 的款式,进而由 PostCSS 打包进理论我的项目中
  content: [ 
    "./index.html",
    "./src/**/*.{js,ts,jsx,tsx}"
  ],
  theme: {extend: {},
  },
  plugins: [],}

到这里 tailwindcss 的配置曾经实现,接下就须要把 tailwindcss 的款式利用到咱们的我的项目中去。

首先咱们先编辑 index.css

@tailwind base;
@tailwind components;
@tailwind utilities;

而后关上 App.tsx 编辑,加上 tailwindcss 款式测试一下

import {Button} from 'antd'
import {CiCircleFilled} from '@ant-design/icons'
import './App.css'

function App() {
  return (<div className='font-bold text-red-500 bg-[#ccc] h-screen w-screen'>
      <Button type="primary" className='flex items-center'>
        <CiCircleFilled size={16}/> Hello world!
      </Button>
    </div>
  )
}

export default App

此时咱们就能够看到 tailwindcss 款式 和 antd 组件都失效了。

如果款式未失效,请查看:

  • tailwindcss.config.js 配置文件里的 content 是否配置了
  • index.css 是否退出了 tailwindcss 的款式引入
  • main.tsx 中是否引入了 index.css

这一步骤 代码参考

3. 集成 Redux

接着下来,咱们把 Redux 状态治理集成到咱们的我的项目中。

pnpm add @reduxjs/toolkit react-redux

这一步骤的代码参考

4. 集成 Jest 单元测试

# jest 测试框架
# @types/jest Jest 类型申明包  TS 申明类型包的大版本最好和 jest 一样。# ts-jest 转译器 利用 tsc 来转译 TypeScript  
# ts-node  写完代码之后要用 tsc 作编译,之后再用 Node.js 来跑,这样比拟麻烦,所以咱们会用 ts-node 来间接跑 ts 代码,省去了编译阶段。# jest-environment-jsdom dom 操作

pnpm add -D jest @types/jest ts-jest ts-node jest-environment-jsdom @testing-library/react @testing-library/user-event @testing-library/jest-dom @types/testing-library__jest-dom identity-obj-proxy @testing-library/dom @types/node

# 初始化 jest 配置
npx jest --init

接着咱们开始配置 jest.config.ts

// jest.config.ts
import type {Config} from 'jest'

const config: Config = {
  bail: 0, // 有测试谬误后就进行谬误
  // 多于一个测试文件运行时不展现每个测试用例测试通过状况
  verbose: true,
  // 测试用例运行在一个相似于浏览器的环境里,能够调用浏览器的 API
  testEnvironment: 'jsdom',
  // 转译下列模块为 Jest 能辨认的代码
  preset: 'ts-jest',
  moduleNameMapper: { 
    // 模块 alias  例如咱们在测试文件中导入文件 import xxx from '@/components/xxx' 其中 '@/components/xxx' 会对应到 <rootDir/src/components/xxx 模块。'^@/(.*)$': '<rootDir>/src/$1',
    // identity-obj-proxy 会 mock 款式相干的
    '\\.(css|less|sass|scss)$': 'identity-obj-proxy',
  },
  // 以 <rootDir>/src 这个目录做为根目录来搜寻测试文件(模块)roots: ['<rootDir>'],

  // 在测试环境筹备好之后执行前的钩子函数,每个测试文件执行之前运行下述文件, 一些环境的兼容的代码咱们能够写在这里
  setupFilesAfterEnv: ['<rootDir>/tests/jest.setup.ts'],
}

export default config

扩大 Jest 的 expect API,以便在测试中应用 Jest DOM 的断言函数

tests/jest.setup.ts

import '@testing-library/jest-dom/extend-expect'

既然咱们在 jest 配置了导入模块 alias。同样的咱们也须要在 typescript 的配置中退出相应的 alias, 要不然 typescript 不能解析 jest 的测试代码。

同时咱们在 tsconfig.json 中加上 jesttypescript 类型申明。批改如下:

{
  "compilerOptions": {
    // ...
    "baseUrl": ".",
    "paths": {"@/*": ["src/*"]
    },
    "types": ["vite/client", "jest", "@testing-library/jest-dom"] 
  },
  // ...
}

并且还须要在 vite.config.ts 中加上相应的 alias 配置.

import path from 'path'
// ... 代码
export default defineConfig({
  // ... 代码
  resolve: {
    alias: {'@': path.resolve(__dirname, '/src'),
    }
  }
  // ... 代码
})

好了,当初 jest 基本上曾经配置实现了,咱们写个小例子来测试一下。示例代码

当初增加一个 React 组件的测试 示例代码

装置依赖如下:

pnpm add axios
pnpm add -D classnames msw

5. 集成代码标准相干的工具 eslint stylelint prettier

pnpm add -D eslint prettier stylelint  eslint-plugin-react@latest @typescript-eslint/eslint-plugin@latestes @typescript-eslint/parser lint-config-prettier eslint-plugin-prettier stylelint-config-prettier stylelint-config-standard stylelint-order

配置 prettier 规定,在根目录下新建一个 .prettierrc.cjs 配置文件,内容如下:

module.exports = {
  // 一行最多 120 字符..
  printWidth: 80,
  // 应用 2 个空格缩进
  tabWidth: 2,
  // 不应用缩进符,而应用空格
  useTabs: false,
  // 行尾须要有分号
  semi: false,
  // 应用单引号
  singleQuote: true,
  // 对象的 key 仅在必要时用引号
  quoteProps: "as-needed",
  // jsx 不应用单引号,而应用双引号
  jsxSingleQuote: false,
  // 开端不须要有逗号 none es5 all
  trailingComma: "es5",
  // 大括号内的首尾须要空格
  bracketSpacing: true,
  // jsx 标签的反尖括号须要换行
  jsxBracketSameLine: false,
  // 箭头函数,只有一个参数的时候,不须要括号 always avoid
  arrowParens: "always",
  // 每个文件格式化的范畴是文件的全部内容
  rangeStart: 0,
  rangeEnd: Infinity,
  // 不须要写文件结尾的 @prettier
  requirePragma: false,
  // 不须要主动在文件结尾插入 @prettier
  insertPragma: false,
  // 应用默认的折行规范
  proseWrap: "preserve",
  // 依据显示款式决定 html 要不要折行
  htmlWhitespaceSensitivity: "css",
  // vue 文件中的 script 和 style 内不必缩进
  vueIndentScriptAndStyle: false,
  // 换行符应用 lf
  endOfLine: "lf",
}

再配置 eslint, 在根目录下创立 .eslintrc 配置文件,内容如下:

{
    "env": {
        "browser": true,
        "es2021": true
    },
    "extends": [
        "eslint:recommended",
        "plugin:react/recommended",
        "plugin:@typescript-eslint/recommended",
        "plugin:prettier/recommended"
    ],
    "overrides": [],
    "parser": "@typescript-eslint/parser",
    "parserOptions": {
        "ecmaVersion": "latest",
        "sourceType": "module"
    },
    "plugins": [
        "react",
        "@typescript-eslint",
        "prettier"
    ],
    "settings": {
        "react": {"version": "detect"}
    },
    "rules": {
        "prettier/prettier": "error",
        "arrow-body-style": "off",
        "prefer-arrow-callback": "off"
    }
}

最初配置一个款式的规定,创立一个 .stylelintrc.json, 内容如下:

{
    "extends": [
        "stylelint-config-standard",
        "stylelint-config-prettier"
    ],
    "plugins": ["stylelint-order"]
}

接下来在 package.jsonscript 中增加命令。

{
    "script": {"lint": "eslint --ext .js,.jsx,.ts,.tsx --fix --quiet ./"}
}

6. husky + commitlint +lint-staged

pnpm add -D husky lint-staged @commitlint/cli @commitlint/config-conventional

在 package.json 增加 prepare 命令并运行

{
  "script": {
    // ...,
    "prepare": "husky install"
  }
}
yarn prepare

给 Husky 增加一个 Hook, 这样每次 git commit 之前都会先运行 npm run lint, 通过之后才会提交代码

npx husky add .husky/pre-commit "npm run lint"

咱们能够通过 lint-staged 只对暂存区的代码进行测验。在级 package.json 增加一个 lint-staged 的配置

{
  "lint-staged": {"*.{js,jsx,tsx,ts}": ["npm run lint"]
  }
}

并在 .husky/pre-commit 中替换 npx lint-staged。。当初咱们每次 git commit 前都会对改变的文件进行 Lint 查看了。

commitlint 配置

在根目录下创立配置文件 .commitlintrc.cjs

module.exports = {extends: ["@commitlint/config-conventional"]
}

而后给 husky 增加一个 commit-msg hook,

npx husky add .husky/commit-msg "npx --no-install commitlint -e $HUSKY_GIT_PARAMS"

当初提交信息不标准就会被拦挡导致提交失败,标准可见 commitlint,当然你也能够依据须要批改提交信息标准。

  • 本文示例代码在 github
  • 本文示例代码在 gitee

文档参考

  • vitejs 中文官网文档
  • TailwindCss 官网文档
  • Redux 官网
  • esbuild 中文官网文档
  • swc 官网文档
  • Jest 官网文档
  • React Testing Library
  • MSW – Mock Service Worker
  • typescript-eslint
退出移动版