本文目录导读:

使用 Prettier(最推荐)
安装和配置
# 安装 Prettier
npm install -g prettier
# 创建配置文件 .prettierrc
{
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"printWidth": 100
}
批量格式化
# 格式化所有 JS/TS 文件
prettier --write "src/**/*.{js,jsx,ts,tsx}"
# 格式化多种类型文件
prettier --write "src/**/*.{js,json,css,md}"
ESLint 自动修复
# 安装 ESLint npm install -g eslint # 运行自动修复 eslint --fix "src/**/*.js" # 结合 prettier eslint --fix --ext .js,.jsx,.ts,.tsx src/
针对特定语言的工具
Python (Black)
# 安装 Black pip install black # 批量格式化 black src/ black --line-length 100 src/**/*.py
Go (gofmt)
# 格式化所有 Go 文件 gofmt -w . gofmt -l . # 列出需要格式化的文件
Java (Google Java Format)
# 批量格式化 java -jar google-java-format-1.15.0-all-deps.jar -r src/**/*.java
自定义脚本方案
Python 脚本示例
import os
import re
from pathlib import Path
def format_python_files(root_dir):
"""批量格式化 Python 文件"""
for path in Path(root_dir).rglob("*.py"):
with open(path, 'r') as f:
content = f.read()
# 自定义格式规则
# 1. 移除多余空行
content = re.sub(r'\n{3,}', '\n\n', content)
# 2. 统一缩进为4空格
content = re.sub(r'^ ', '\t', content, flags=re.MULTILINE)
# 3. 确保文件末尾有换行
content = content.rstrip() + '\n'
with open(path, 'w') as f:
f.write(content)
# 使用
format_python_files("./src")
Shell 脚本示例
#!/bin/bash
# batch_format.sh
# 格式配置
EXTENSIONS=("*.js" "*.jsx" "*.ts" "*.tsx")
ROOT_DIR="$1"
if [ -z "$ROOT_DIR" ]; then
ROOT_DIR="."
fi
format_file() {
local file="$1"
echo "格式化工��: $file"
# 自定义格式化逻辑
# 移除尾部空白
sed -i 's/[[:space:]]*$//' "$file"
# 确保文件末尾有换行
sed -i -e '$a\' "$file"
}
# 遍历文件
for ext in "${EXTENSIONS[@]}"; do
find "$ROOT_DIR" -type f -name "$ext" | while read file; do
format_file "$file"
done
done
echo "格式化完成!"
使用强大的 sed 命令
# 移除尾部空白
find . -name "*.py" -exec sed -i 's/[[:space:]]*$//' {} \;
# 统一换行符 (CRLF -> LF)
find . -type f \( -name "*.js" -o -name "*.py" \) -exec dos2unix {} \;
# 转换缩进 (4空格 -> 2空格)
find . -name "*.js" -exec sed -i 's/ / /g' {} \;
项目级自动化配置
创建格式化脚本 format.sh
#!/bin/bash
set -e
echo "===== 开始代码格式化 ====="
# 检查工具是否存在
command -v prettier >/dev/null 2>&1 || { echo "需要安装 prettier"; exit 1; }
# 运行格式化
prettier --write "src/**/*.{js,ts,jsx,tsx,json,css,scss,md}" --log-level warn
# 运行 ESLint 修复
npx eslint --fix "src/**/*.{js,ts,jsx,tsx}" --quiet
echo "===== 格式化完成! ====="
package.json 配置
{
"scripts": {
"format": "bash format.sh",
"format:check": "prettier --check \"src/**/*.{js,ts}\"",
"format:write": "prettier --write \"src/**/*.{js,ts}\""
}
}
Git Hooks 自动化
pre-commit hook
#!/bin/bash
# .git/hooks/pre-commit
# 暂存区文件格式化
FILES=$(git diff --cached --name-only --diff-filter=ACM)
if [ -n "$FILES" ]; then
echo "格式化暂存的文件..."
# 对暂存文件运行格式化
for FILE in $FILES; do
if [[ $FILE == *.js || $FILE == *.ts ]]; then
npx prettier --write "$FILE"
git add "$FILE"
fi
done
fi
使用建议
- 版本控制:先提交当前代码,再运行格式化
- 渐进式应用:按模块分批格式化,便于排查问题
- 配置文件:创建
.editorconfig统一编辑器设置 - CI/CD:在持续集成中加入格式检查
选择哪种方法取决于你的项目语言、团队规范和现有工具链,Prettier 是最通用和推荐的选择。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播