Chuyển tới nội dung chính

Quy ước code

ESLint

Dự án sử dụng ESLint v9 flat config với các plugin chuyên biệt:

  • sonarjs: Phát hiện code smells, cognitive complexity
  • boundaries: Kiểm soát dependency giữa các module

Cấu hình gốc tại eslint.config.js, mỗi app có config riêng bổ sung:

# Chạy lint toàn bộ monorepo
pnpm lint

# Kiểm tra complexity
pnpm complexity
pnpm complexity:frontend
pnpm complexity:backend

Prettier

Format code tự động với Prettier. Cấu hình tại .prettierrc.js:

# Format toàn bộ codebase
pnpm format

# Kiểm tra format (CI)
pnpm format:check

Pre-commit Hooks

Husky + lint-staged chạy tự động trước mỗi commit:

package.json (lint-staged)
{
"lint-staged": {
"apps/frontend/**/*.{ts,tsx}": [
"pnpm --dir apps/frontend exec eslint --fix",
"prettier --write"
],
"apps/backend/**/*.ts": ["prettier --write"],
"*.{json,md}": ["prettier --write"]
}
}
thông tin

Khi commit, lint-staged tự động fix linting + format cho các file đã staged. Nếu có lỗi không fix được, commit sẽ bị chặn.

Kiểm tra chất lượng Code

Code Duplication

# Phát hiện code trùng lặp (jscpd)
pnpm dupcheck

# Output JSON cho CI
pnpm dupcheck:ci

Cấu hình jscpd tại .jscpd.json ở thư mục gốc.

Dead Code Detection

# Tìm code, exports, dependencies không sử dụng (Knip)
pnpm deadcode

# Output JSON cho CI
pnpm deadcode:ci

Cấu hình Knip tại knip.json.

Dependency Architecture

# Kiểm tra vi phạm dependency rules
pnpm deps:check

# Sinh dependency graph (SVG)
pnpm deps:check:graph

Cấu hình dependency-cruiser tại dependency-cruiser.js. Các quy tắc chính:

  • Không import ngược từ shared vào modules
  • Không import trực tiếp giữa các module (phải qua module exports)
  • Không circular dependency

Git Workflow

main ← dev ← feature/xxx
hotfix/xxx
bugfix/xxx
NhánhMục đích
mainProduction, chỉ merge từ dev
devDevelopment, merge từ feature branches
feature/ten-tinh-nangTính năng mới
bugfix/mo-ta-loiSửa lỗi
hotfix/ten-fixFix khẩn cấp trên production

Quy trình:

  1. Tạo branch từ dev: git checkout -b feature/add-reports
  2. Phát triển + commit theo convention (xem bên dưới)
  3. Push branch, tạo Merge Request vào dev
  4. Review + merge sau khi CI pass

Naming Conventions

Files & Folders

LoạiConventionVí dụ
Component Reactkebab-case.tsxcustomer-form.tsx
NestJS classkebab-case.tscustomers.service.ts
Test file*.spec.tscustomers.service.spec.ts
DTOkebab-case.dto.tscreate-customer.dto.ts
Modulekebab-caseservice-packages/
Thư mục featurekebab-caseshooting-sessions/

Variables & Functions

LoạiConventionVí dụ
Biến, hàmcamelCasefindAllCustomers
Class, InterfacePascalCaseCustomersService
ConstantUPPER_SNAKEMAX_FILE_SIZE
Enum valuePascalCasePositionStatus.Active
Database columnsnake_casecreated_at
API endpointkebab-case/api/service-packages

React Components

// Tên component = PascalCase, tên file = kebab-case
// customer-list.tsx
export function CustomerList() { ... }

// Hooks bắt đầu bằng "use"
export function useCustomerFilters() { ... }

Import Ordering

Thứ tự import trong mỗi file:

// 1. External libraries
import { Injectable } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';

// 2. Internal packages (alias paths)
import { PrismaService } from '@infrastructure/database/prisma.service';
import { AuditService } from '@shared/common/services/audit.service';

// 3. Relative imports (cùng module)
import { CreateCustomerDto } from '../dto/create-customer.dto';
import { CustomersRepository } from '../repositories/customers.repository';

Alias paths được cấu hình trong tsconfig.json:

AliasĐường dẫn
@modules/*src/modules/*
@shared/*src/shared/*
@infrastructure/*src/infrastructure/*
@test/*test/*

Commit Message Convention

<type>(<scope>): <mô tả ngắn>

# Ví dụ:
feat(delivery): thêm quản lý phiên chụp
fix(auth): sửa lỗi refresh token hết hạn
refactor(organization): tách service pods
docs: cập nhật hướng dẫn cài đặt
chore: upgrade dependencies
TypeMô tả
featTính năng mới
fixSửa lỗi
refactorTái cấu trúc code
docsCập nhật tài liệu
testThêm/sửa test
choreCập nhật build, deps, CI
styleFormat code, không đổi logic