news 2026/7/24 1:21:35

HarmonyOS掌上记账APP开发实践第80篇:Code Linter 与代码质量 — 使用 code-linter.json5 保障工程规范

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS掌上记账APP开发实践第80篇:Code Linter 与代码质量 — 使用 code-linter.json5 保障工程规范

Code Linter 与代码质量 — 使用 code-linter.json5 保障工程规范

文章简介

在团队协作开发中,统一的代码风格和质量标准是保障工程可维护性的基石。HarmonyOS 提供了 Code Linter 工具,通过code-linter.json5配置文件定义代码风格和安全规则。MoneyTrack 项目配置了包括 @typescript-eslint 规则、安全规则和性能规则在内的完整 Linter 体系。本文从 Linter 在开发流程中的定位出发,详细解析配置语法、规则体系、命名规范以及 CI/CD 集成方案。

Linter 在开发流程中的位置

Code Linter 应嵌入到从编码到发布的整个流程中,形成自动化的质量门禁:

编码阶段

本地 Lint 检查

是否通过

代码提交

Pre-commit Hook

再次通过

推送到远程

CI 流水线

全量 Lint 扫描

质量问题

代码合并

自动部署

核心知识点

1. code-linter.json5 完整配置

code-linter.json5是 Code Linter 的核心配置文件,位于项目根目录下。MoneyTrack 项目的完整配置如下:

{ // 指定要扫描的文件匹配模式 "files": ["**/*.ets", "**/*.ts"], // 排除不需要扫描的目录 "ignore": [ "**/ohosTest/**/*", "**/test/**/*", "**/build/**/*", "**/oh_modules/**/*" ], // 启用规则集(plugin 前缀表示来自插件) "ruleSet": [ "plugin:@performance/recommended", "plugin:@typescript-eslint/recommended", "plugin:@hw-stylistic/recommended", "plugin:@security/recommended" ], // 细粒度规则配置(覆盖 ruleSet 中的默认行为) "rules": { // ===== 安全规则 ===== "@security/no-unsafe-aes": "error", "@security/no-hardcoded-credentials": "error", // ===== TypeScript 类型规则 ===== "@typescript-eslint/await-thenable": "error", "@typescript-eslint/no-floating-promises": "error", "@typescript-eslint/explicit-member-accessibility": ["error", { "accessibility": "explicit", "overrides": { "constructors": "no-public" } }], "@typescript-eslint/consistent-type-definitions": ["error", "interface"], "@typescript-eslint/prefer-readonly": "warn", // ===== 命名规范 ===== "@typescript-eslint/naming-convention": ["error", { "selector": "default", "format": ["camelCase", "UPPER_CASE"] }, { "selector": "variable", "format": ["camelCase", "UPPER_CASE"] }, { "selector": "function", "format": ["camelCase"] }, { "selector": "class", "format": ["PascalCase"] }, { "selector": "interface", "format": ["PascalCase"] }, { "selector": "enum", "format": ["PascalCase"] }, { "selector": "enumMember", "format": ["UPPER_CASE"] }, { "selector": "memberLike", "modifiers": ["private"], "format": ["camelCase"], "leadingUnderscore": "require" }], // ===== 风格规则 ===== "@hw-stylistic/quotes": ["error", "single"], "@hw-stylistic/semi": ["error", "always"], "@hw-stylistic/comma-dangle": ["error", "always-multiline"], "@hw-stylistic/indent": ["error", 2], "@hw-stylistic/max-len": ["warn", { "code": 120 }], // ===== 变量声明规则 ===== "init-declarations": ["error", "always"] } }

配置字段说明:

字段类型说明
filesstring[]文件匹配模式,决定哪些文件被扫描
ignorestring[]排除模式,跳过不需要检查的目录
ruleSetstring[]引用的预定义规则集,支持plugin:前缀
rulesobject单个规则的启用/禁用/配置,值可为"off""warn""error"或配置数组

2. @typescript-eslint 常用规则详解

规则名级别作用违反示例正确示例
await-thenableerror禁止 await 非 Promise 值await someStringawait somePromise
no-floating-promiseserror禁止未处理的 PromiseasyncFunc()await asyncFunc()
explicit-member-accessibilityerror要求显式成员访问修饰符name: stringpublic name: string
consistent-type-definitionserror强制使用 interfacetype User = { id: number }interface User { id: number }
prefer-readonlywarn建议只读成员加 readonlyprivate id: numberprivate readonly id: number
naming-conventionerror强制统一命名规范class user_serviceclass UserService
no-unused-varserror禁止声明未使用的变量const x = 1(未使用)删除或使用_x前缀
prefer-optional-chainwarn建议使用可选链a && a.ba?.b

3. 命名规范完整要求

MoneyTrack 项目遵循以下命名规范,由naming-convention规则强制执行:

代码元素规范示例说明
变量(普通)camelCaseuserNamebillListtotalAmount普通变量统一小驼峰
变量(常量)UPPER_CASEMAX_RETRY_COUNTAPI_BASE_URL全局常量全大写+下划线
函数/方法camelCaseinitData()refreshBill()getTotalIncome()动宾结构,小驼峰
PascalCaseHomeVMStatisticsVMBillRepository名词或名词短语
接口PascalCaseIBillIUserInfoPageState可以是I前缀或无前缀
枚举PascalCaseBillTypeCategoryTransactionStatus名词形式
枚举成员UPPER_CASEEXPENSEINCOMEPENDINGCOMPLETED全大写+下划线
私有成员camelCase +_前缀_instance_cacheData_subscription下划线开头表示私有
类型参数PascalCase 单字母TKVR泛型统一单大写字母

项目中的实际应用:

// ✅ 符合规范constMAX_PAGE_SIZE:number=50;letuserName:string='';classHomeVM{privatereadonly_instance:HomeVM;private_billList:Bill[]=[];publicasyncinitData():Promise<void>{// 初始化逻辑}publicgetTotalIncome():number{returnthis._billList.reduce((sum,bill)=>sum+bill.amount,0);}}interfaceIBill{id:string;amount:number;category:Category;}enumCategory{FOOD='FOOD',TRANSPORT='TRANSPORT',ENTERTAINMENT='ENTERTAINMENT',}// ❌ 违反规范classhome_vm{}// 类必须 PascalCasefunctionGet_Data(){}// 函数必须 camelCaseletUser_Name='test';// 变量必须 camelCaseconstmax_count=10;// 常量必须 UPPER_CASE

4. CI/CD 集成

Pre-commit Hook 配置:

.husky/pre-commit中配置提交前自动运行 Linter:

#!/bin/sh."$(dirname"$0")/_/husky.sh"# 对暂存的文件运行 Linternpx code-linter--files="$(gitdiff--cached--name-only --diff-filter=d|grep-E'\.(ets|ts)$'|tr'\n'',')"if[$?-ne0];thenecho"❌ Lint 检查未通过,请修复后重新提交"exit1fi

CI 流水线集成(oh-pipeline.json5):

{ "stages": [{ "name": "quality-gate", "jobs": [{ "name": "code-lint", "steps": [ { "name": "安装依赖", "command": "ohpm install" }, { "name": "运行 Linter", "command": "code-linter --config code-linter.json5" }, { "name": "运行单元测试", "command": "ohos test --build-type local" } ] }] }] }

最佳实践

  1. 渐进式启用:不要一次性开启所有规则。先启用核心规则(如命名规范、安全规则),等团队适应后再逐步增加风格类规则,避免大量报错打乱开发节奏。

  2. 规则覆盖优先级rules中的单个规则配置优先级高于ruleSet中的默认配置。在ruleSet基础上通过rules微调,而不需要删除整个规则集。

  3. Lint 即文档:将命名规范、代码风格等约定通过 Linter 规则强制执行,而不是写在团队规范文档中。这样新的团队成员不需要记忆大量规则,Linter 会实时提示。

  4. CI 门禁:在 CI 流水线中设置 Lint 检查为门禁卡点,Lint 未通过的代码不能合并到主分支。这比依赖开发人员自觉性更可靠。

  5. 阶段区分:在本地开发和 pre-commit 阶段只对变更文件进行检查(速度快),在 CI 阶段对全量文件扫描(确保全面),两者配合使用。

  6. 定期审查:每个迭代结束后审查 Linter 报错统计,如果某些规则频繁被违反,考虑是否规则过于严格或不合理,及时调整配置。

推荐参考文档

  • HarmonyOS Code Linter 工具文档
  • @typescript-eslint 规则参考
  • code-linter.json5 配置语法
  • 代码审查最佳实践指南
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/24 1:21:25

二升三暑假计算大通关|人教版同步衔接 每日筑牢低年级计算底子

很多家长都有体会&#xff0c;二升三是小学数学计算的第一个转折关口。二年级还停留在表内乘除、百以内加减法&#xff0c;孩子算起来还算顺手&#xff0c;一到三年级就要接触万以内加减、多位数乘除&#xff0c;计算量和复杂度一下提上来。不少孩子暑假彻底放松&#xff0c;开…

作者头像 李华
网站建设 2026/7/24 1:20:39

服装进销存软件,到底值不值那个价?

这两年服装实体店的老板们见面&#xff0c;聊得最多的不是哪款衣服爆了&#xff0c;而是“利润去哪了”。房租、人工、进货成本一样没少&#xff0c;线上流量贵得离谱&#xff0c;线下客流还被短视频平台分流。很多老板开始动心思&#xff1a;要不要上一套进销存软件&#xff1…

作者头像 李华
网站建设 2026/7/24 1:15:37

Python+Django双算法电商推荐系统实战解析

1. 项目概述&#xff1a;PythonDjango双算法推荐系统这个基于PythonDjango的电商商品推荐系统&#xff0c;是我在指导计算机专业毕业设计时反复打磨的实战项目。不同于市面上简单的管理系统&#xff0c;它深度融合了协同过滤和内容推荐两种算法&#xff0c;配合Bootstrap可视化…

作者头像 李华
网站建设 2026/7/24 1:12:23

【Rust中级教程】1.8. 内存 Pt.6:通过操作系统扫描地址空间

1.8 内存 Pt.6&#xff1a;通过操作系统扫描地址空间 1.8.1. 通过操作系统扫描地址空间&#xff08;例子&#xff09; 操作系统提供了接口可让程序发出请求——系统调用(system call)。在Windows里&#xff0c;KERNEL.DLL提供了用于检查和操纵运行进程内存 的功能。 这个例子…

作者头像 李华
网站建设 2026/7/24 1:12:13

C# WinForm飞机大战游戏开发:从零实现GDI+图形绘制与游戏循环

1. 项目概述与核心思路最近在整理硬盘&#xff0c;翻出来一个十多年前刚学C#时做的飞机大战游戏项目。当时WinForm还是桌面开发的主流&#xff0c;用GDI在窗体上“画”出一个能打飞机的游戏&#xff0c;对初学者来说成就感爆棚。今天重新审视这个项目&#xff0c;发现它麻雀虽小…

作者头像 李华
网站建设 2026/7/24 1:08:55

AI Agent开发指南:从架构设计到实战应用

1. 初识AI Agent&#xff1a;从概念到实践AI Agent&#xff08;人工智能代理&#xff09;正在掀起一场智能革命。作为一名长期关注AI技术发展的从业者&#xff0c;我见证了从简单的聊天机器人到如今能够自主执行复杂任务的智能代理的演进过程。AI Agent与传统AI系统的本质区别在…

作者头像 李华