Skip to content

工程化实践 ​

前端工程化错误监控 ​

jsx
这种监控可以帮助开发人员及时发现和解决问题,提高应用程序的稳定性和可靠性。

1. Sentry:Sentry是一款开源的错误监控平台,可以监控前端、后端以及移动端应用程序中的错误和异常。Sentry提供了实时错误报告、错误分析和错误解决方案等功能。

2. Bugsnag:Bugsnag是一款专门用于监控Web应用程序和移动应用程序的错误监控工具。它可以捕获JavaScript异常、网络请求错误、客户端错误等。

3. Google Analytics:Google Analytics可以监控网站的访问量、页面浏览量、访问时长和用户行为等。它还提供了实时报告和错误报告等功能,可以帮助开发人员发现和解决问题。

4. Performance API:Performance API是一个浏览器提供的API,可以监控Web应用程序的性能。它可以捕获页面加载时间、资源下载时间和JavaScript执行时间等信息。

5. 前端错误监控SDK:很多前端错误监控工具都提供了JavaScript SDK,可以通过在应用程序中引入SDK来捕获错误和异常。开发人员可以根据捕获的错误信息来定位和解决问题。
这种监控可以帮助开发人员及时发现和解决问题,提高应用程序的稳定性和可靠性。

1. Sentry:Sentry是一款开源的错误监控平台,可以监控前端、后端以及移动端应用程序中的错误和异常。Sentry提供了实时错误报告、错误分析和错误解决方案等功能。

2. Bugsnag:Bugsnag是一款专门用于监控Web应用程序和移动应用程序的错误监控工具。它可以捕获JavaScript异常、网络请求错误、客户端错误等。

3. Google Analytics:Google Analytics可以监控网站的访问量、页面浏览量、访问时长和用户行为等。它还提供了实时报告和错误报告等功能,可以帮助开发人员发现和解决问题。

4. Performance API:Performance API是一个浏览器提供的API,可以监控Web应用程序的性能。它可以捕获页面加载时间、资源下载时间和JavaScript执行时间等信息。

5. 前端错误监控SDK:很多前端错误监控工具都提供了JavaScript SDK,可以通过在应用程序中引入SDK来捕获错误和异常。开发人员可以根据捕获的错误信息来定位和解决问题。

添加 TypeScript 到 JS 项目 ​

tsconfig.json 配置文件 ​

javascript
{
  "compilerOptions": {
    "incremental": true,                // 增量编译
    "tsBuildInfoFile": ".tsbuildinfo",  // 增量编译文件的存储位置
    "diagnostics": true,                // 打印诊断信息
    "target": "ES5",                    // 目标语言版本
    "module": "commonjs",               // 生成代码的模块标准
    "lib": [],                          // TS需要引用的库
    "allowJs": true,                    // 允许编辑JS文件
    "outDir": "./out",                  // 指定输出的目录
    "rootDir": "./",                    // 指定输入文件目录
    "sourceMap": false,                 // 生成目标文件的sourceMap
    "strict": false,                    // 严格的类型检查
    "esModuleInterop": false,           // 允许export = 导出,由import from导入
    "moduleResolution": "node",         // 模块解析策略
    "baseUrl": "",                      // 解析非相对模块的基地址
    "paths": {},                        // 路径映射
    // ... 更多配置项
  }
}
{
  "compilerOptions": {
    "incremental": true,                // 增量编译
    "tsBuildInfoFile": ".tsbuildinfo",  // 增量编译文件的存储位置
    "diagnostics": true,                // 打印诊断信息
    "target": "ES5",                    // 目标语言版本
    "module": "commonjs",               // 生成代码的模块标准
    "lib": [],                          // TS需要引用的库
    "allowJs": true,                    // 允许编辑JS文件
    "outDir": "./out",                  // 指定输出的目录
    "rootDir": "./",                    // 指定输入文件目录
    "sourceMap": false,                 // 生成目标文件的sourceMap
    "strict": false,                    // 严格的类型检查
    "esModuleInterop": false,           // 允许export = 导出,由import from导入
    "moduleResolution": "node",         // 模块解析策略
    "baseUrl": "",                      // 解析非相对模块的基地址
    "paths": {},                        // 路径映射
    // ... 更多配置项
  }
}

安装依赖 ​

javascript
yarn add typescript --D
yarn add @types/node @types/react @types/react-dom @types/react-router-dom
yarn add typescript --D
yarn add @types/node @types/react @types/react-dom @types/react-router-dom

初始化 tsconfig ​

html
npx tsc --init
npx tsc --init

Webpack 配置 ​

javascript
// 安装 ts-loader
yarn add ts-loader eslint-import-resolver-typescript --D

// resolve.extensions 新增 .ts/.tsx
resolve: {
    extensions: ['.js', '.json', '.ts', '.tsx'],
}

// 配置 ts-loader
{
    test: /\.tsx?$/,
    use: 'babel-loader',
    exclude: /node-modules/,
}

// 安装 @babel/preset-typescript
yarn add @babel/preset-typescript -D

// .babelrc 新增
"presets": [
    "@babel/typescript"
],
// 安装 ts-loader
yarn add ts-loader eslint-import-resolver-typescript --D

// resolve.extensions 新增 .ts/.tsx
resolve: {
    extensions: ['.js', '.json', '.ts', '.tsx'],
}

// 配置 ts-loader
{
    test: /\.tsx?$/,
    use: 'babel-loader',
    exclude: /node-modules/,
}

// 安装 @babel/preset-typescript
yarn add @babel/preset-typescript -D

// .babelrc 新增
"presets": [
    "@babel/typescript"
],

ESLint 配置 ​

javascript
// 安装
yarn add @typescript-eslint/parser @typescript-eslint/eslint-plugin -D

// .eslintrc.js 中新增 overrides
overrides: [
    {
      files: ['*.ts', '*.tsx'],
      parser: '@typescript-eslint/parser',
      settings: {
        'import/resolver': {
          node: { extensions: ['.js', '.jsx', '.ts', '.tsx', '.css'] },
          typescript: { alwaysTryTypes: true },
        },
      },
      plugins: ['@typescript-eslint'],
      extends: ['plugin:shopify/esnext'],
      parserOptions: {
        ecmaFeatures: { jsx: true },
        ecmaVersion: 12,
        sourceType: 'module',
      },
      rules: {
        'no-console': 0,
        'no-use-before-define': 'off',
      },
    },
]
// 安装
yarn add @typescript-eslint/parser @typescript-eslint/eslint-plugin -D

// .eslintrc.js 中新增 overrides
overrides: [
    {
      files: ['*.ts', '*.tsx'],
      parser: '@typescript-eslint/parser',
      settings: {
        'import/resolver': {
          node: { extensions: ['.js', '.jsx', '.ts', '.tsx', '.css'] },
          typescript: { alwaysTryTypes: true },
        },
      },
      plugins: ['@typescript-eslint'],
      extends: ['plugin:shopify/esnext'],
      parserOptions: {
        ecmaFeatures: { jsx: true },
        ecmaVersion: 12,
        sourceType: 'module',
      },
      rules: {
        'no-console': 0,
        'no-use-before-define': 'off',
      },
    },
]

eslint 不会报告 typescript 类型错误,ts 如需要检测类型需要使用 tsc --noEmit 命令

本地修改依赖包并应用 ​

使用 patch-package ​

javascript
1. 安装 patch-package:
   npm install --save-dev patch-package 或 yarn add patch-package -D

2. 修改依赖包源码

3. 创建补丁文件:
   npx patch-package <dependency-name>

4. 提交补丁文件到版本控制系统

5. package.json 中添加:
   { "scripts": { "postinstall": "patch-package" } }
1. 安装 patch-package:
   npm install --save-dev patch-package 或 yarn add patch-package -D

2. 修改依赖包源码

3. 创建补丁文件:
   npx patch-package <dependency-name>

4. 提交补丁文件到版本控制系统

5. package.json 中添加:
   { "scripts": { "postinstall": "patch-package" } }

Git Hooks 与代码规范 ​

husky + lint-staged + commitlint ​

bash
# 安装 husky
npm install husky --save-dev

# 安装 lint-staged
npm install lint-staged --save-dev

# 安装 commitlint
npm install @commitlint/cli @commitlint/config-conventional --save-dev
# 安装 husky
npm install husky --save-dev

# 安装 lint-staged
npm install lint-staged --save-dev

# 安装 commitlint
npm install @commitlint/cli @commitlint/config-conventional --save-dev

package.json 配置:

json
{
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged",
      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
    }
  },
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write"],
    "*.{css,scss,less}": ["stylelint --fix", "prettier --write"],
    "*.{md,json}": ["prettier --write"]
  }
}
{
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged",
      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
    }
  },
  "lint-staged": {
    "*.{js,jsx,ts,tsx}": ["eslint --fix", "prettier --write"],
    "*.{css,scss,less}": ["stylelint --fix", "prettier --write"],
    "*.{md,json}": ["prettier --write"]
  }
}

commitizen ​

bash
# 全局安装
npm install commitizen -g

# 项目初始化
commitizen init cz-conventional-changelog --save-dev --save-exact

# 使用
git cz
# 全局安装
npm install commitizen -g

# 项目初始化
commitizen init cz-conventional-changelog --save-dev --save-exact

# 使用
git cz

规范提交信息 ​

遵循 Conventional Commits 规范:

<type>(<scope>): <subject>

<body>
<type>(<scope>): <subject>

<body>

常见 type:feat、fix、docs、style、refactor、perf、test、build、ci、chore、revert

版本号规范 ​

版本号格式:major.minor.patch(主版本号.次版本号.补丁版本号)

  • ^:允许自动更新次版本号和补丁版本号
  • ~:只允许更新补丁版本号
  • >= / <:指定版本范围
  • =:精确版本号

CI/CD 持续集成与部署 ​

常见 CI/CD 平台 ​

  • GitHub Actions:GitHub 内置的 CI/CD
  • GitLab CI:GitLab 内置的 CI/CD
  • Jenkins:自托管 CI/CD 工具
  • CircleCI:云端 CI/CD 服务
  • Travis CI:云端 CI/CD 服务

GitHub Actions 示例 ​

yaml
name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 18
      - run: npm ci
      - run: npm run lint
      - run: npm run test
      - run: npm run build
name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 18
      - run: npm ci
      - run: npm run lint
      - run: npm run test
      - run: npm run build

代码质量工具 ​

ESLint + Prettier + Stylelint ​

bash
npm install eslint prettier stylelint --save-dev
npm install eslint prettier stylelint --save-dev

推荐 ESLint 配置:

  • eslint-config-airbnb
  • eslint-config-standard
  • eslint-plugin-shopify

EditorConfig ​

在项目根目录创建 .editorconfig:

ini
root = true

[*]
indent_style = space
indent_size = 2
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
root = true

[*]
indent_style = space
indent_size = 2
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true