适用于开发活动与审核。审核时确保需审核内容完全遵循 LPS-1 标准。
在执行审计时,需确保代码使用约束工具执行格式化或确保目前认定的编码约定。
| 编程语言 | 约束工具/编码约定 |
|---|---|
| Rust | rustfmt —check |
| JS/TS | ESLint & Prettier |
| Elixir | Elixir Phoenix 最佳实践 |
对于 Rust,需确保使用本 repo 中的 rustfmt.toml 进行格式化;对于 JS/TS,需确保使用本 repo 中的 prettierrc.config.js 进行格式化。
除此之外还需要将超越长度超越特定行数的函数或方法执行拆分,如无法拆分需要在函数或方法前使用注释标注 FIXME: large function。
| LANG | LINES |
|---|---|
| Elixir | 20 |
| Rust | 40 |
E.g.
// FIXME: large function
fn foo() {
// 45 lines of code
}对于拥有 pub 或 public 等公开修饰符或公开的函数、方法、成员、属性等需要标注完整文档。
对于非公开函数、方法,如其长度超过 10 行则需要标注完整文档。
| Access | Documentation |
|---|---|
| public | Full |
| otherwise | if over 10 lines, full |
对于前端项目,不要使用默认导出,使用命名导出。
// True ✅
export const ComponentA = () => {
return <div>Component A</div>
}
// True ✅
// vite.config.ts
export default defineConfig({
// ...
})
// False ❌
export default () => {
return <div>Component A</div>
}对于 TypeScript,如非必要,不要使用 any 类型。
原始数据类型尽量让 TypeScript 自己推断,对于对象和函数,需显式声明类型。
// True ✅
const name = 'Limit'
// False ❌
const name: string = 'Limit'
// True ✅
const names: Array<string> = []
// False ❌
const names = [] // Oops, never[] 😨
// True ✅
const handler: ChangeEventHandler<HTMLInputElement> = (e) => {
e.target // e.target is HTMLInputElement
}
// False ❌
const handler = (e) => {
e.target // e is any 😨
}提交代码前需要确保代码通过(Pass) tsc 检查。
用于 React 的大部分类型声明都可以从 @types/react 取到,如无特殊情况,不要自己声明类型。如果不清楚相关类型,可以翻阅 React TypeScript Cheatsheets
对于函数组件,使用箭头函数和 React.FC 声明类型。
import { FC, PropsWithChildren } from 'react'
// True ✅
const ComponentA: FC<PropsWithChildren> = props => {
return <div>Component A</div>
}
// False ❌
const ComponentA = (props: PropsWithChildren) => {
return <div>Component A</div>
}对于 Props 有多个属性的组件,需将 Props 用 interface 声明。
interface ComponentAProps extends PropsWithChildren {
name: string
link: string
description: string
}
// True ✅
const ComponentA: FC<ComponentAProps> = props => {
return <div>Component A</div>
}
// False ❌
const ComponentA: FC<PropsWithChildren<{ name: string }>> = props => {
return <div>Component A</div>
}一个项目中最好只使用一种样式方案,如 tailwind 或 CSS Modules 不要混用。
不要使用任何方式拼接 CSS 类名,对于 tailwind 项目,可以使用 tailwind-merge,对于其他样式方案,可以使用 clsx,如果能拿到 DOM 节点,请使用 classList。
// True ✅
import { twJoin } from 'tailwind-merge'
export const ComponentA = props => {
const className = twJoin('text-color-500', props.className)
return <div className={className}></div>
}
// True ✅
import clsx from 'clsx'
export const ComponentA = props => {
const className = clsx('homepage__button', props.className)
return <div className={className}></div>
}
// True ✅
const button = document.querySelector('.homepage__button')
button.classList.add('text-color-500')
// False ❌
export const ComponentA = props => {
const className = 'text-color-500' + ` ${props.className}`
return <div className={className}></div>
}分支名应当全部使用形如 {category}/{name} 的名字,其中 category 为此分支对应的类型,同 commit 类型(feat, fix, refactor)等,name 为此分支的主题,如 card, pipeline 等。
- True ✅
feat/pipelinerefactor/card
- False ❌
lemon-nbtHiSiSsOmEbRaNcH
在发布对应版本前,需使用 git rebase -i 合并针对于同功能修改的小提交
在发布稳定版本(release)时,需保证测试覆盖率须保证测试覆盖率不能降低超过 5% 在发布预览版本(preview)时,需保证测试覆盖率须保证测试覆盖率不能降低超过 10%
| Publish | Test Converage |
|---|---|
| Release | > -5% |
| Preview | > -10% |