Stylelint
CSS/SCSS/Less 等样式文件的现代化检查工具,帮助团队保持样式代码的一致性和避免错误
Stylelint 是 CSS/SCSS/Less 等样式文件的现代化检查工具,提供 100+ 内置规则,帮助团队保持样式代码一致性并避免错误,是前端工程化 CSS 质量保障的事实标准。
Stylelint
CSS/SCSS/Less 等样式文件的现代化检查工具,帮助团队保持样式代码的一致性和避免错误
技术简介说明
Stylelint 是一个强大的、现代化的 CSS linter 工具,用于检查样式代码并确保其符合约定的编码规范。它支持多种样式语法,包括 CSS、SCSS、Sass、Less 等,提供了超过 100 个内置规则,能够检测语法错误、遵循代码约定、避免样式冲突等问题。
Stylelint 的设计理念是高度可配置和插件化,允许团队根据项目需求自定义规则集合。它与 ESLint 类似,但专注于样式文件,是现代前端工程化中不可或缺的质量保障工具。
基本信息
| 属性 | 说明 |
|---|---|
| 当前版本 | 16.25.0(2025 年 10 月发布) |
| 开发状态 | 活跃维护,v17 开发中 |
| 开源协议 | MIT License |
| GitHub | stylelint/stylelint |
| 官网 | https://stylelint.io |
| npm | stylelint |
| 支持语法 | CSS、SCSS、Sass、Less、SugarSS |
| Node.js 要求 | Node.js 18.12.0+ |
| 首次发布 | 2015 年 |
| 维护状态 | 活跃开发,社区驱动 |
快速上手
安装
# 使用 npm 安装
npm install stylelint --save-dev
# 使用 pnpm 安装(推荐)
pnpm add -D stylelint
# 使用 yarn 安装
yarn add -D stylelint基础配置
创建 .stylelintrc.json 或 stylelint.config.js 配置文件:
{
"extends": "stylelint-config-standard",
"rules": {
"color-no-invalid-hex": true,
"font-family-no-duplicate-names": true,
"declaration-block-no-duplicate-properties": true,
"block-no-empty": true,
"comment-no-empty": true,
"no-duplicate-selectors": true
}
}最小示例
package.json 中添加 scripts:
{
"scripts": {
"lint:css": "stylelint \"src/**/*.{css,scss,less}\"",
"lint:css:fix": "stylelint \"src/**/*.{css,scss,less}\" --fix"
}
}示例样式文件 src/styles/example.css:
/* 错误示例 - Stylelint 会检测出问题 */
.error {
color: #fff; /* 应该使用小写 */
font-family: Arial, Arial; /* 重复的字体 */
background: #fff
margin: 10px;
margin: 20px; /* 重复的属性 */
}
/* 正确示例 */
.correct {
color: #fff;
font-family: Arial, sans-serif;
background: #fff;
margin: 10px;
}运行检查:
# 检查样式文件
pnpm lint:css
# 自动修复可修复的问题
pnpm lint:css:fix核心概念与架构
核心架构
Stylelint 采用插件化架构设计,主要由以下组件构成:
-
解析器(Parser)
- 使用
postcss作为默认解析器 - 支持自定义解析器处理不同的预处理器语法
postcss-scss处理 SCSS 语法postcss-less处理 Less 语法
- 使用
-
规则引擎(Rule Engine)
- 内置 100+ 规则
- 规则分为多个类别:可能的问题、可限制的功能、字体、颜色、选择器等
- 每条规则独立运行,互不干扰
-
配置系统(Configuration System)
- 支持继承和扩展配置
- 支持
extends、plugins、rules、overrides等配置项 - 支持动态配置和条件规则
-
插件系统(Plugin System)
- 允许社区开发自定义规则
- 插件可以打包发布到 npm
- 官方维护
stylelint-order等核心插件
规则分类
Stylelint 的规则按功能分为以下类别:
- 可能的问题(Possible errors):检测语法错误和潜在问题
- 可限制的功能(Limit language features):限制某些 CSS 特性的使用
- 字体(Font):字体相关规则
- 颜色(Color):颜色格式和命名规则
- 选择器(Selector):选择器命名和结构规则
- 属性(Property):属性命名和值规则
- 声明(Declaration):声明块相关规则
- 值(Value):属性值相关规则
- 媒体查询(Media query):媒体查询相关规则
- 注释(Comment):注释相关规则
- 通用(General):通用规则
核心特性
1. 100+ 内置规则
提供全面的规则集合,覆盖现代 CSS 的各个方面:
{
"rules": {
"color-no-invalid-hex": true,
"color-named": "never",
"color-hex-length": "short",
"font-family-no-duplicate-names": true,
"function-calc-no-unspaced-operator": true,
"string-no-newline": true,
"unit-no-unknown": true,
"property-no-unknown": true,
"declaration-block-no-duplicate-properties": true,
"block-no-empty": true,
"selector-pseudo-class-no-unknown": true,
"selector-pseudo-element-no-unknown": true,
"selector-type-no-unknown": true,
"media-feature-name-no-unknown": true,
"comment-no-empty": true,
"no-duplicate-selectors": true,
"no-empty-source": true
}
}2. 自动修复功能
支持自动修复大量规则问题:
# 自动修复可修复的问题
stylelint "src/**/*.css" --fix
# 在 webpack 中启用自动修复
// webpack.config.js
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader',
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: [
['stylelint', { fix: true }]
]
}
}
}
]
}
]
}
}3. 批量抑制功能(实验性)
v16.25.0 新增的实验性功能,支持批量抑制规则警告:
/* stylelint-disable-next-line color-no-invalid-hex */
.color { color: #FFF; }
/* stylelint-disable */
.ignored-block {
color: #FFF;
background: red;
}
/* stylelint-enable */
/* 针对特定文件抑制 */
/* stylelint-disable plugin/rule-name */4. 高度可配置
灵活的配置系统支持多种配置方式:
{
"extends": [
"stylelint-config-standard",
"stylelint-config-recommended-scss"
],
"plugins": [
"stylelint-order",
"stylelint-scss"
],
"rules": {
"indentation": 2,
"color-hex-case": "lower",
"selector-class-pattern": "^[a-z][a-zA-Z0-9]+$"
},
"overrides": [
{
"files": ["**/*.scss"],
"customSyntax": "postcss-scss",
"rules": {
"scss/at-rule-no-unknown": true
}
},
{
"files": ["**/*.less"],
"customSyntax": "postcss-less",
"rules": {
"less/color-no-invalid-hex": true
}
}
]
}5. 预处理器支持
完整支持主流 CSS 预处理器:
# 安装预处理器支持
pnpm add -D postcss-scss postcss-less
# .stylelintrc.json
{
"customSyntax": "postcss-scss",
"rules": {
"scss/at-rule-no-unknown": true,
"scss/selector-no-redundant-nesting-selector": true
}
}6. CSS Baseline 支持
2025 年 4 月新增对 CSS Baseline 的支持,与 Web Platform 的 Baseline 计划对齐:
{
"rules": {
"property-no-unknown": [
true,
{
"ignoreProperties": ["/^my-custom-/"]
}
],
"value-no-vendor-prefix": [
true,
{
"ignoreValues": ["box"]
}
]
}
}7. 现代化的配置格式
支持 JavaScript 配置文件,提供更强大的配置能力:
// stylelint.config.js
module.exports = {
extends: ['stylelint-config-standard'],
rules: {
'color-hex-case': 'lower',
'indentation': 2,
'max-nesting-depth': 3,
'selector-max-specificity': '1,2,1',
'selector-max-compound-selectors': 3,
'selector-max-id': 0,
'selector-max-universal': 0,
'declaration-no-important': true,
'font-weight-notation': 'numeric',
'number-max-precision': 4,
'time-min-milliseconds': 100,
'unit-disallowed-list': ['pt', 'cm', 'mm'],
'length-zero-no-unit': true,
'value-keyword-case': 'lower',
'custom-property-pattern': '^my-[a-z][a-zA-Z0-9]+$',
'selector-class-pattern': '^[a-z][a-zA-Z0-9]+$',
'keyframes-name-pattern': '^[a-z][a-zA-Z0-9]+-$'
}
}8. 丰富的报告格式
支持多种输出格式,便于集成到不同的工作流:
# JSON 格式输出
stylelint "src/**/*.css" --formatter json
# 紧凑格式输出
stylelint "src/**/*.css" --formatter compact
# Unix 格式输出
stylelint "src/**/*.css" --formatter unix
# 详细格式输出
stylelint "src/**/*.css" --formatter verbose
# 自定义报告器
stylelint "src/**/*.css" --formatter ./my-formatter.js9. IDE 集成
主流编辑器都有 Stylelint 插件支持:
// VS Code settings.json
{
"stylelint.enable": true,
"stylelint.validate": [
"css",
"less",
"postcss",
"scss",
"sugarss"
],
"editor.codeActionsOnSave": {
"source.fixAll.stylelint": true
}
}10. Git 集成
与 Git 工作流无缝集成:
# 使用 lint-staged 在提交前检查
// package.json
{
"lint-staged": {
"*.{css,scss,less}": [
"stylelint --fix",
"git add"
]
}
}
# 使用 husky 添加 pre-commit hook
// .husky/pre-commit
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
pnpm lint-staged生态图
官方维护的配置包
# 推荐配置
pnpm add -D stylelint-config-recommended
# 标准配置(包含更多规则)
pnpm add -D stylelint-config-standard
# 空配置(作为基础)
pnpm add -D stylelint-config-clean-order预处理器插件
# SCSS 支持
pnpm add -D stylelint-scss postcss-scss
# Less 支持
pnpm add -D stylelint-less postcss-less
# SugarSS 支持
pnpm add -D postcss-sugarss社区插件
# 属性排序
pnpm add -D stylelint-order
# 防御性 CSS
pnpm add -D stylelint-plugin-defensive-css
# CSS 模块
pnpm add -D stylelint-css-modules
# 可访问性检查
pnpm add -D stylelint-a11y
# 最佳实践
pnpm add -D stylelint-plugin-best-practices
# BEM 命名规范
pnpm add -D stylelint-selector-bem-pattern
# 高性能 CSS
pnpm add -D stylelint-plugin-high-performance-css
# 颜色对比度检查
pnpm add -D stylelint-color contrast流行的预设配置
# Airbnb 风格
pnpm add -D stylelint-config-airbnb
# WordPress 风格
pnpm add -D stylelint-config-wordpress
# Shopify 风格
pnpm add -D @shopify/stylelint-plugin
# GitHub 风格
pnpm add -D stylelint-config-github
# Prettier 集成
pnpm add -D stylelint-config-prettier构建工具集成
# Webpack
pnpm add -D stylelint-webpack-plugin
# Vite
pnpm add -D vite-plugin-stylelint
# Gulp
pnpm add -D gulp-stylelint
# PostCSS
pnpm add -D postcss-stylelint完整生态示例配置
{
"extends": [
"stylelint-config-standard",
"stylelint-config-recommended-scss",
"stylelint-config-clean-order"
],
"plugins": [
"stylelint-scss",
"stylelint-order",
"stylelint-plugin-defensive-css"
],
"customSyntax": "postcss-scss",
"rules": {
"order/properties-order": [
[
"content",
"display",
"position",
"top",
"right",
"bottom",
"left",
"flex",
"grid",
"width",
"height",
"margin",
"padding",
"border",
"background",
"color",
"font",
"text",
"line-height",
"transform",
"transition",
"animation"
]
],
"plugin/defensive-css": [
true,
{
"accidental-hover": true,
"background-repeat": true,
"flex-wrap": true,
"scroll-chaining": true,
"scroll-lock": true
}
]
}
}适用场景
1. 大型团队协作项目
在多人协作的项目中,Stylelint 确保所有开发者遵循统一的样式编码规范,减少代码审查成本:
{
"extends": "stylelint-config-standard",
"rules": {
"selector-class-pattern": "^[a-z][a-zA-Z0-9]+$",
"custom-property-pattern": "^[a-z][a-zA-Z0-9-]+$",
"max-nesting-depth": 3,
"selector-max-specificity": "1,2,1",
"declaration-no-important": true,
"color-named": "never",
"font-family-name-quotes": "always-where-recommended"
}
}2. 设计系统集成
确保设计系统中的样式组件保持一致性:
{
"rules": {
"custom-property-pattern": "^ds-[a-z][a-zA-Z0-9-]+$",
"selector-class-pattern": "^ds-[a-z][a-zA-Z0-9-]+$",
"color-no-hex": true,
"unit-disallowed-list": ["px", "em"],
"unit-allowed-list": ["rem", "vh", "vw", "%"]
}
}3. 组件库开发
为组件库提供统一的样式规范:
{
"extends": [
"stylelint-config-standard",
"stylelint-config-recommended-scss"
],
"plugins": ["stylelint-scss"],
"customSyntax": "postcss-scss",
"rules": {
"selector-class-pattern": "^[a-z][a-zA-Z0-9]+$",
"scss/at-rule-no-unknown": true,
"scss/selector-no-redundant-nesting-selector": true,
"no-descending-specificity": true,
"selector-max-universal": 0
}
}4. 遗留代码迁移
逐步改进遗留项目的样式质量:
{
"extends": "stylelint-config-recommended",
"rules": {
"color-no-invalid-hex": true,
"font-family-no-duplicate-names": true,
"property-no-unknown": true,
"declaration-block-no-duplicate-properties": true,
"block-no-empty": true
},
"ignoreFiles": [
"node_modules/**",
"dist/**",
"legacy/**"
]
}5. CSS-in-JS 项目
检查 styled-components、emotion 等 CSS-in-JS 方案:
# 安装相关依赖
pnpm add -D stylelint stylelint-config-styled-components{
"extends": "stylelint-config-styled-components",
"processors": [
"stylelint-processor-styled-components"
],
"rules": {
"no-empty-source": null,
"no-missing-end-of-source-newline": null
}
}6. 性能优化项目
检测和避免性能问题的样式代码:
{
"rules": {
"selector-max-universal": 0,
"selector-max-type": 3,
"selector-max-attribute": 2,
"selector-max-class": 3,
"selector-max-id": 0,
"selector-max-pseudo-class": 3,
"selector-max-combinators": 3,
"selector-max-compound-selectors": 3,
"max-nesting-depth": 3,
"no-descending-specificity": true,
"declaration-block-no-redundant-longhand-properties": true
}
}7. 可访问性优先项目
确保样式代码符合可访问性要求:
pnpm add -D stylelint-a11y{
"extends": "stylelint-config-standard",
"plugins": ["stylelint-a11y"],
"rules": {
"a11y/media-prefers-reduced-motion": true,
"a11y/no-outline-none": true,
"a11y/selector-pseudo-class-focus": true,
"a11y/content-no-quotes": true
}
}开发与工程化
与构建工具集成
Webpack 集成
// webpack.config.js
const StylelintPlugin = require('stylelint-webpack-plugin')
module.exports = {
plugins: [
new StylelintPlugin({
files: 'src/**/*.{css,scss,less}',
fix: true,
cache: true,
emitWarning: true,
emitError: false,
failOnError: false,
quiet: false
})
]
}Vite 集成
// vite.config.js
import { defineConfig } from 'vite'
import stylelint from 'vite-plugin-stylelint'
export default defineConfig({
plugins: [
stylelint({
include: ['src/**/*.css', 'src/**/*.scss'],
fix: true,
emitErrorAsWarning: true
})
]
})Turborepo 集成
// turbo.json
{
"tasks": {
"lint:css": {
"inputs": [
"src/**/*.css",
"src/**/*.scss",
"src/**/*.less",
".stylelintrc.json"
],
"outputs": []
}
}
}CI/CD 集成
# .github/workflows/stylelint.yml
name: Stylelint
on:
push:
branches: [main, develop]
pull_request:
branches: [main, develop]
jobs:
stylelint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install pnpm
uses: pnpm/action-setup@v2
with:
version: 8
- name: Install dependencies
run: pnpm install
- name: Run Stylelint
run: pnpm lint:css
- name: Report coverage
if: github.event_name == 'pull_request'
run: |
pnpm lint:css --formatter json > stylelint-report.jsonGit Hooks 集成
# 安装 husky 和 lint-staged
pnpm add -D husky lint-staged
# 初始化 husky
pnpm exec husky init
# 配置 pre-commit hook
echo '#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
pnpm exec lint-staged' > .husky/pre-commit// package.json
{
"lint-staged": {
"*.{css,scss,less}": [
"stylelint --fix",
"git add"
]
}
}编辑器集成配置
VS Code
// .vscode/settings.json
{
"stylelint.enable": true,
"stylelint.validate": [
"css",
"less",
"postcss",
"scss",
"sugarss"
],
"editor.codeActionsOnSave": {
"source.fixAll.stylelint": "explicit"
},
"stylelint.configOverrides": {
"customSyntax": "postcss-scss"
}
}WebStorm/IDEA
// .idea/stylelint.json (自动生成)
{
"enabled": true,
"configLocation": ".stylelintrc.json"
}性能与安全
性能优化
缓存机制
// stylelint.config.js
module.exports = {
// 启用缓存
cache: true,
cacheLocation: './node_modules/.cache/stylelint',
// 只检查变更的文件
ignoreFiles: [
'node_modules/**',
'dist/**',
'build/**',
'coverage/**'
]
}并行处理
# 使用 --concurrency 参数控制并发数
stylelint "src/**/*.css" --concurrency 4
# 在大型项目中只检查变更文件
stylelint $(git diff --name-only --diff-filter=d HEAD | grep -E '\.(css|scss|less)$')增量检查
# 只检查未暂存的文件
stylelint $(git diff --name-only --diff-filter=d | grep -E '\.(css|scss|less)$')
# 只检查暂存的文件
stylelint $(git diff --cached --name-only --diff-filter=d | grep -E '\.(css|scss|less)$')安全考虑
避免敏感信息泄露
{
"rules": {
"comment-word-disallowed-list": [
"password",
"secret",
"token",
"api-key",
"private"
]
}
}防止 CSS 注入
{
"rules": {
"function-disallowed-list": ["url"],
"value-no-vendor-prefix": true,
"property-no-vendor-prefix": true,
"selector-no-vendor-prefix": true
}
}依赖安全
# 定期审计依赖
pnpm audit
# 使用安全的插件来源
# 只使用官方维护或社区知名的插件内存管理
// stylelint.config.js
module.exports = {
// 大项目建议启用缓存
cache: true,
// 限制并发数以控制内存使用
// 通过 CLI 参数 --concurrency 控制
// 排除不需要检查的文件
ignoreFiles: [
'node_modules/**',
'**/*.min.css',
'**/vendor/**',
'**/dist/**'
]
}技术对比
与 ESLint 对比
| 特性 | Stylelint | ESLint |
|---|---|---|
| 检查对象 | CSS/SCSS/Less 等样式文件 | JavaScript/TypeScript |
| 解析器 | PostCSS | Espree/TypeScript |
| 规则数量 | 100+ 内置规则 | 300+ 内置规则 |
| 自动修复 | 支持部分规则 | 支持大量规则 |
| 插件生态 | 丰富的社区插件 | 极其丰富的插件生态 |
| 配置复杂度 | 中等 | 较高 |
| 学习曲线 | 平缓 | 陡峭 |
| 性能 | 快速 | 中等 |
与 Prettier 对比
| 特性 | Stylelint | Prettier |
|---|---|---|
| 定位 | 代码质量检查 | 代码格式化 |
| 检查范围 | 语法、最佳实践、规范 | 格式、缩进、引号 |
| 可配置性 | 高度可配置 | 少量配置项 |
| 自动修复 | 支持部分规则 | 全部自动格式化 |
| 规则冲突 | 可能与其他工具冲突 | 统一格式,避免冲突 |
| 使用方式 | 独立运行 | 独立运行 |
| 集成难度 | 需要配置 | 开箱即用 |
与 PostCSS 对比
| 特性 | Stylelint | PostCSS |
|---|---|---|
| 定位 | 代码检查工具 | CSS 转换工具 |
| 主要功能 | 代码质量检查 | CSS 转换、优化 |
| 插件类型 | 检查规则 | 转换插件 |
| 执行时机 | 开发时检查 | 构建时转换 |
| 依赖关系 | 依赖 PostCSS 解析 | 独立运行 |
| 使用场景 | 代码规范 | 功能增强 |
与 Stylelint 替代品对比
| 工具 | 优势 | 劣势 |
|---|---|---|
| Stylelint | 规则丰富、生态完善、社区活跃 | 配置相对复杂 |
| Prettier | 开箱即用、统一格式 | 只关注格式,不检查质量 |
| PostCSS + 插件 | 灵活、可扩展 | 需要自己组合工具 |
| CSS Modules | 解决样式冲突 | 不是检查工具 |
| Tailwind CSS | 原子化 CSS | 不是检查工具 |
推荐使用组合
// 最佳实践组合
{
"开发工具": {
"代码质量": "Stylelint + ESLint",
"代码格式": "Prettier",
"样式处理": "PostCSS",
"Git 集成": "Husky + lint-staged"
},
"典型配置": {
"样式检查": "stylelint-config-standard + stylelint-scss",
"代码检查": "eslint-config-standard",
"代码格式": "prettier + eslint-config-prettier",
"提交检查": "husky + lint-staged"
}
}最佳实践
配置管理
分层配置策略
// 基础配置 stylelint.config.base.js
module.exports = {
rules: {
// 基础规则,所有项目共享
'color-no-invalid-hex': true,
'font-family-no-duplicate-names': true,
'declaration-block-no-duplicate-properties': true,
'block-no-empty': true
}
}
// 项目配置 stylelint.config.js
module.exports = {
extends: ['./stylelint.config.base.js'],
rules: {
// 项目特定规则
'selector-class-pattern': '^[a-z][a-zA-Z0-9]+$',
'max-nesting-depth': 3
}
}Monorepo 配置
// packages/shared-config/stylelint.config.js
module.exports = {
extends: ['stylelint-config-standard'],
rules: {
// 共享规则
}
}
// apps/web/stylelint.config.js
module.exports = {
extends: ['../../packages/shared-config/stylelint.config.js'],
rules: {
// Web 应用特定规则
}
}
// apps/mobile/stylelint.config.js
module.exports = {
extends: ['../../packages/shared-config/stylelint.config.js'],
rules: {
// Mobile 应用特定规则
}
}规则配置
渐进式引入规则
// 第一阶段:只检查严重问题
{
"extends": "stylelint-config-recommended",
"rules": {
"color-no-invalid-hex": true,
"property-no-unknown": true,
"declaration-block-no-duplicate-properties": true
}
}
// 第二阶段:增加规范检查
{
"extends": "stylelint-config-standard",
"rules": {
"color-hex-case": "lower",
"color-hex-length": "short",
"indentation": 2
}
}
// 第三阶段:完整规则集
{
"extends": [
"stylelint-config-standard",
"stylelint-config-recommended-scss"
],
"plugins": ["stylelint-order"],
"rules": {
// 完整规则集
}
}规则优先级
{
"rules": {
// 高优先级:避免错误
"color-no-invalid-hex": true,
"property-no-unknown": true,
"selector-pseudo-class-no-unknown": true,
// 中优先级:代码质量
"declaration-block-no-duplicate-properties": true,
"no-descending-specificity": true,
"no-duplicate-selectors": true,
// 低优先级:代码风格
"color-hex-case": "lower",
"indentation": 2,
"max-empty-lines": 1
}
}工作流集成
开发阶段
// package.json
{
"scripts": {
"dev": "vite",
"lint:css": "stylelint \"src/**/*.{css,scss,less}\"",
"lint:css:fix": "stylelint \"src/**/*.{css,scss,less}\" --fix",
"build": "pnpm lint:css && vite build"
}
}提交阶段
# .husky/pre-commit
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
# 只检查暂存的文件
CHANGED_FILES=$(git diff --cached --name-only --diff-filter=d | grep -E '\.(css|scss|less)$')
if [ -n "$CHANGED_FILES" ]; then
pnpm exec stylelint $CHANGED_FILES --fix
fi
pnpm exec lint-stagedCI 阶段
# .github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v2
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'pnpm'
- run: pnpm install --frozen-lockfile
- run: pnpm lint:css
- name: Upload Stylelint report
if: always()
uses: actions/upload-artifact@v3
with:
name: stylelint-report
path: stylelint-report.json团队协作
配置锁定
// package.json
{
"dependencies": {
"stylelint": "16.25.0",
"stylelint-config-standard": "36.0.0",
"stylelint-scss": "6.0.0"
},
"resolutions": {
"stylelint": "16.25.0"
}
}文档化配置
<!-- STYLELINT_RULES.md -->
# Stylelint 规则说明
## 启用的规则
### 颜色规则
- `color-no-invalid-hex`: 禁止使用无效的十六进制颜色
- `color-hex-case`: 十六进制颜色使用小写
- `color-hex-length`: 使用短十六进制颜色
### 选择器规则
- `selector-class-pattern`: 类名使用驼峰命名
- `max-nesting-depth`: 最大嵌套深度为 3
- `no-descending-specificity`: 禁止降低特异性
## 自定义规则
- 类名格式:`^[a-z][a-zA-Z0-9]+$`
- 自定义属性:`^my-[a-z][a-zA-Z0-9-]+$`技术局限与边界
已知限制
1. 性能边界
// 大型项目可能需要优化
module.exports = {
// 排除不需要检查的文件
ignoreFiles: [
'node_modules/**',
'dist/**',
'build/**',
'**/*.min.css',
'**/vendor/**'
],
// 启用缓存
cache: true,
// 限制并发数
// 通过 --concurrency 参数控制
}2. 规则冲突
// 与 Prettier 冲突时的解决方案
{
"extends": [
"stylelint-config-standard",
"stylelint-config-prettier" // 放在最后,覆盖冲突规则
]
}3. 预处理器限制
// SCSS 嵌套可能导致问题
{
"rules": {
// 限制嵌套深度
"max-nesting-depth": 3,
// 忽略 SCSS 特有的 at-rule
"scss/at-rule-no-unknown": true,
// 处理 SCSS 插值
"selector-pseudo-class-no-unknown": [
true,
{
"ignorePseudoClasses": ["/^:/"]
}
]
}
}不适用的场景
1. 运行时样式检查
Stylelint 只能检查静态样式文件,无法检查运行时动态生成的样式:
// 这种情况 Stylelint 无法检查
const dynamicStyle = {
color: getDynamicColor() // 运行时计算
}2. CSS-in-JS 深度检查
虽然可以检查 CSS-in-JS,但能力有限:
// 这种复杂的 CSS-in-JS 检查效果有限
const StyledComponent = styled.div`
color: ${props => props.theme.color};
${props => props.customStyles}
`3. 样式功能验证
Stylelint 只检查语法和规范,不验证样式的实际效果:
/* 这个样式虽然通过了 Stylelint 检查,但可能有逻辑问题 */
.button {
color: blue;
background: blue; /* 前景色和背景色相同,文字不可见 */
}迁移考虑
从旧版本迁移
# 检查当前版本
stylelint --version
# 升级到最新版本
pnpm add -D stylelint@latest
# 使用迁移指南
# https://stylelint.io/migration-guide/to-16/配置迁移
// 旧配置(已弃用)
{
"rules": {
"indentation": "tab",
"max-empty-lines": 1
}
}
// 新配置(v16+)
{
"rules": {
"indentation": "tab",
"max-empty-lines": 1
}
}性能优化建议
// 大型项目推荐配置
module.exports = {
// 启用缓存
cache: true,
cacheLocation: './node_modules/.cache/stylelint',
// 排除大文件
ignoreFiles: [
'node_modules/**',
'dist/**',
'**/*.min.css',
'**/vendor/**',
'**/*.generated.css'
],
// 使用高效的自定义语法
customSyntax: 'postcss-scss',
// 只检查必要的文件
// 通过 CLI 参数精确控制
}学习资源
官方资源
- 官网: https://stylelint.io
- GitHub: https://github.com/stylelint/stylelint
- 文档: https://stylelint.io/user-guide
- 规则列表: https://stylelint.io/user-guide/rules
- 配置指南: https://stylelint.io/user-guide/configure
- 迁移指南: https://stylelint.io/migration-guide
- 更新日志: https://stylelint.io/changelog
教程与指南
- Stylelint 快速开始: https://stylelint.io/user-guide/get-started
- 规则配置: https://stylelint.io/user-guide/rules/configure
- 插件开发: https://stylelint.io/developer-guide/plugins
- 中文文档: https://stylelint.docschina.org
视频资源
- YouTube 教程: 搜索 "Stylelint tutorial"
- Bilibili: 搜索 "Stylelint 教程"
- 前端早读课: Stylelint 相关专题
书籍推荐
- 《前端工程化:体系设计与实践》- 包含 Stylelint 等工具的详细介绍
- 《CSS 揭秘》- 理解 CSS 最佳实践
- 《高性能 CSS》- 性能优化相关
社区资源
- Stack Overflow: stylelint 标签
- GitHub Issues: stylelint issues
- Awesome Stylelint: 社区维护的资源列表
- 掘金: 搜索 Stylelint 相关文章
- 知乎: Stylelint 相关话题
实战项目
- 官方示例: https://github.com/stylelint/stylelint/tree/main/examples
- 配置模板: 搜索 GitHub 上的
stylelint-config项目 - 开源项目参考: 查看知名开源项目的 Stylelint 配置
工具集成
- VS Code 插件: stylelint.vscode
- WebStorm 集成: 官方文档
- Prettier 集成: stylelint-config-prettier
2026 年现状
最新版本动态
截至 2026 年初,Stylelint 的最新版本是 16.25.0(2025 年 10 月发布),v17 正在开发中。主要进展包括:
- 批量抑制功能:实验性支持批量抑制规则警告,提升开发体验
- CSS Baseline 支持:与 Web Platform 的 Baseline 计划对齐,支持最新的 CSS 特性
- 不可变发布:首次实现不可变发布,确保版本稳定性
- 性能优化:持续改进检查性能,特别是大型项目
生态发展
插件生态持续繁荣
# 2025-2026 年活跃的插件
stylelint-scss # SCSS 支持(持续更新)
stylelint-order # 属性排序(2026 年 3 月更新)
stylelint-plugin-defensive-css # 防御性 CSS
stylelint-a11y # 可访问性检查预处理器支持成熟
- SCSS: 通过
postcss-scss和stylelint-scss提供完整支持 - Less: 通过
postcss-less提供良好支持 - SugarSS: 缩进语法支持
构建工具集成完善
- Vite:
vite-plugin-stylelint已成为标准配置 - Webpack:
stylelint-webpack-plugin稳定成熟 - Turborepo: 原生支持,适合 Monorepo 项目
技术趋势
1. AI 辅助检查
虽然 Stylelint 本身不直接使用 AI,但社区开始出现结合 AI 的样式检查工具,Stylelint 作为基础工具仍然不可或缺。
2. 与 Prettier 的协作
Stylelint 和 Prettier 的协作模式已经成熟,通过 stylelint-config-prettier 解决了规则冲突问题。
3. 性能持续优化
- 缓存机制更加完善
- 增量检查支持更好
- 大型项目性能显著提升
4. CSS 新特性支持
随着 CSS 规范的发展,Stylelint 持续更新以支持新特性:
- CSS Baseline 支持
- CSS 容器查询
- CSS 嵌套语法
- CSS 层叠层(@layer)
社区活跃度
- GitHub Stars: 超过 12,000+
- npm 下载量: 每周超过 1000 万次
- 贡献者: 500+ 活跃贡献者
- 发布频率: 每月 1-2 个版本
与竞品对比
在 2026 年的前端工具链中,Stylelint 仍然是 CSS 检查的事实标准:
| 工具 | 定位 | 状态 |
|---|---|---|
| Stylelint | CSS 代码检查 | 活跃发展,生态完善 |
| Prettier | CSS 格式化 | 成熟稳定,与 Stylelint 互补 |
| ESLint | JS/TS 检查 | 活跃发展,与 Stylelint 配合使用 |
| Tailwind CSS | 原子化 CSS | 流行趋势,但不是检查工具 |
未来规划
根据官方路线图,Stylelint 的未来发展方向包括:
- v17 发布:预计包含更多新特性和性能优化
- AI 集成探索:探索与 AI 工具的结合方式
- 性能进一步提升:针对超大项目的优化
- 更好的 CSS 新特性支持:持续跟进 CSS 规范发展
- 开发者体验改进:更友好的配置和报告
推荐配置(2026)
{
"extends": [
"stylelint-config-standard",
"stylelint-config-recommended-scss"
],
"plugins": [
"stylelint-scss",
"stylelint-order"
],
"customSyntax": "postcss-scss",
"rules": {
// 基础质量规则
"color-no-invalid-hex": true,
"property-no-unknown": true,
"declaration-block-no-duplicate-properties": true,
// 代码规范
"color-hex-case": "lower",
"color-hex-length": "short",
"indentation": 2,
// 性能优化
"max-nesting-depth": 3,
"selector-max-specificity": "1,2,1",
"no-descending-specificity": true,
// 现代 CSS
"selector-not-notation": "complex",
"media-query-no-invalid": true
}
}总结:Stylelint 在 2026 年仍然是前端工程化中不可或缺的 CSS 检查工具。它拥有完善的规则体系、丰富的插件生态、良好的构建工具集成,以及活跃的社区支持。无论是大型团队项目还是个人开发,Stylelint 都能帮助开发者编写更规范、更高质量的样式代码。