一、为什么要关注代码质量?

2016年某个凌晨两点,某互联网金融公司的线上系统突然崩溃。经过12小时的排查,发现竟是因为某个开发人员将==误写成===导致接口条件判断失效。这血淋淋的案例告诉我们:代码质量不是空中楼阁,而是程序稳定运行的根基。在这个JavaScript生态日新月异的时代,如何建立自动化质量保障体系?让我们从这三个武器开始:

ESLint 像严格的代码审查员,发现潜在问题
Prettier 是美学设计师,保证格式统一
Jest 担任保险精算师,验证业务逻辑正确性

二、ESLint:代码规范的执行者

2.1 安装与基础配置

(技术栈:Node.js + npm)

npm install eslint --save-dev
npx eslint --init

选择流行风格指南时,Airbnb规范是前端开发的黄金标准:

// .eslintrc.js
module.exports = {
  extends: ['airbnb-base'],
  rules: {
    'no-console': 'off',      // 允许console调试
    'max-len': ['error', 120] // 行宽限制放宽到120字符
  }
};

2.2 实战检测案例

检查这段存疑代码:

// app.js
function calculatePrice(quantity, price) {
  if (quantity = 0) {            // 错误:赋值运算符
    return 0;
  }
  const total = quantity * price;
  console.log(total);
  return total.toFixed(2);       // 警告:数字直接调用方法
}

执行检测命令:

npx eslint app.js

ESLint会输出:

3:9  error  Expected a conditional expression 
   and instead saw an assignment  no-cond-assign
  
5:3  warning  Unexpected console statement  no-console
  
6:10 error  Do not access Object.prototype 
   method 'toFixed' from target object  no-prototype-builtins

2.3 高级配置技巧

在React项目中,我们可以开启Hook规则:

// .eslintrc.js
module.exports = {
  plugins: ['react-hooks'],
  rules: {
    'react-hooks/rules-of-hooks': 'error',
    'react-hooks/exhaustive-deps': 'warn'
  }
};

三、Prettier:代码美学的工匠

3.1 安装与配置(技术栈:VS Code插件)

npm install --save-dev prettier

配置文件示例:

// .prettierrc
{
  "semi": false,        // 结尾不加分号
  "singleQuote": true,  // 使用单引号
  "trailingComma": "es5",
  "printWidth": 100     // 适合16寸笔记本屏幕
}

3.2 格式修复实战

原始代码:

const user={name:'李雷',age:18};function greet(){console.log('你好,'+user.name)}

执行npx prettier --write demo.js后变为:

const user = { name: '李雷', age: 18 }

function greet() {
  console.log('你好,' + user.name)
}

3.3 与ESLint的配合

安装冲突解决包:

npm install --save-dev eslint-config-prettier

配置调整:

// .eslintrc.js
module.exports = {
  extends: ['airbnb-base', 'prettier'], // 把prettier放在最后
  // ...其他配置
}

四、Jest:逻辑安全的守护神

4.1 测试环境搭建(技术栈:Babel + Jest)

npm install jest babel-jest @babel/core --save-dev

配置Babel:

// babel.config.js
module.exports = {
  presets: [['@babel/preset-env', { targets: { node: 'current' } }]]
}

4.2 测试案例设计

测试用户权限验证模块:

// auth.test.js
import { checkPermission } from './auth'

describe('权限验证模块', () => {
  const adminUser = { role: 'admin', group: 'dev' }
  const guestUser = { role: 'guest', group: 'design' }

  test('管理员应具有删除权限', () => {
    expect(checkPermission(adminUser, 'delete')).toBeTruthy()
  })

  test('访客不应看到财务模块', () => {
    expect(checkPermission(guestUser, 'finance-view')).toBeFalsy()
  })
})

4.3 覆盖率报告示例

执行测试命令:

npx jest --coverage

控制台将输出:


----------------|---------|----------|---------|---------
File            | % Stmts | % Branch | % Funcs | % Lines
----------------|---------|----------|---------|---------
 auth.js         |   100   |    85    |   100   |   100  
 utils           |   95.45 |   77.78  |   90    |   96.15 
----------------|---------|----------|---------|---------

五、自动化工作流构建

5.1 Git钩子集成(技术栈:Husky + lint-staged)

npm install husky lint-staged --save-dev

修改package.json:

{
  "scripts": {
    "precommit": "lint-staged"
  },
  "lint-staged": {
    "*.js": [
      "eslint --fix",
      "prettier --write",
      "git add"
    ],
    "*.test.js": ["jest --bail --findRelatedTests"]
  }
}

5.2 CI/CD流水线示例(技术栈:GitHub Actions)

# .github/workflows/test.yml
name: Code Quality Check
on: [push]

jobs:
  lint-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-node@v1
      - run: npm install
      - run: npx eslint .
      - run: npx prettier --check .
      - run: npx jest --ci --coverage

六、技术全景分析

6.1 适用场景图谱

  • 中小企业快速启动项目
  • 大型项目规范化维护
  • 开源项目的协作保障
  • 遗留代码重构工程

6.2 组合技术优缺点分析

优势组合效应

  • ESLint的强规则 + Prettier的美学 = 代码质检双保险
  • Jest的快照测试 + 覆盖率统计 = 质量达标可视化

潜在短板

  • 初期配置成本较高
  • 老旧项目适配需要渐进式改造
  • 过于严格可能降低开发效率

6.3 实施路径建议

  1. 新项目:脚手架集成
  2. 过渡项目:分阶段接入
  3. 老旧项目:增量式改造

七、工程师常见问题锦囊

Q:规则冲突如何解决?
A:推荐使用eslint-config-prettier,或通过override字段局部调整

Q:Jest速度慢怎么办?
A:尝试增量测试:jest --onlyChanged,或开启缓存jest --cache

Q:如何保障团队规范统一?
A:将配置文件纳入版本控制,推荐使用monorepo结构

八、未来展望与总结

随着Deno原生支持ESLint、Vite与Jest深度融合等新趋势,自动化质量保障将朝着智能化方向发展。但无论工具如何进化,质量意识的培养才是根本。记住:好的代码不是写出来的,而是管出来的。