1. 为什么 2024 年还要单独折腾 stylelint
如果你正在用 VS Code 写 Vue3 + Vite 项目,大概率已经习惯了 ESLint 帮你管 JS/TS 的格式和潜在错误。但样式部分呢?.vue文件里那一大段<style scoped lang="scss">,ESLint 基本管不到,团队里有人写color: #FFF;、有人写color:#fff、有人属性顺序随心所欲,代码 review 时全靠肉眼盯,时间一长就崩。
stylelint 就是补这块短板的工具:它能校验 CSS/SCSS/Less,也能钻进.vue和.html的<style>标签里做检查,配合 VS Code 插件还能保存即修复。2024 年这一版比较关键的几个变化是:stylelint 已经到 v16 系列,stylelint-config-prettier这类兼容插件在 v15 之后基本不需要了,stylelint-config-standard-vue也拆出了/scss子路径,配置写法和两年前差别不小。
这篇就按「VS Code + Vue3 + Vite + stylelint 2024」这条线,把插件、.stylelintrc、settings.json、npm 脚本、CI 校验、常见报错一次讲清楚。同时我会把 TaoToken 作为统一 Key/API 通道在工具链里怎么接一次说明白——它不参与样式校验本身,但你在配 lint、跑脚本、接 AI 辅助时,Key 管理可以统一走它,省得每个工具各配一套。
适合谁看:正在搭 Vue3 + Vite 脚手架、想加样式规范的前端;团队里负责工程化配置的人;以及被 stylelint 版本升级搞到头大、想找一份能直接抄的 2024 配置的人。
2. TaoToken 统一 Key 接入:工具链里只配一次
先说清楚定位,避免误会:stylelint 是本地 lint 工具,它不需要联网、不需要 Key,你装完依赖就能跑。TaoToken 在这里的角色是「统一 Key/API 通道」——当你的工具链里还有别的需要调模型能力的环节(比如 AI 辅助改样式、代码审查脚本、Coding Agent),可以把 Key 收敛到一处管理,而不是散落在各个.env里。
官网入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
API 基址:https://taotoken.net/api
操作路径大致是这样:进控制台创建 Key,然后在需要调用的工具里把 base URL 指向https://taotoken.net/api,Key 用刚创建的那一串。这样你项目里跟模型相关的调用都走同一个出口,换 Key、看用量、做限额都在一个地方。
几个常用 deep link,按需取:
- 模型对话体验:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
- Coding Plan(长期编码/Agent 场景):https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
- 控制台:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
- API Keys 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
- Claude Code / Anthropic 相关:https://taotoken.net/claudecode-anthropic?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
注意:stylelint 的配置和运行完全在本地,不需要任何 Key。TaoToken 只在你项目里存在「需要调模型」的环节时才用得上,别把它和 lint 工具混为一谈。
3. 可复制配置:从装依赖到 settings.json 骨架
3.1 安装依赖(2024 版本组合)
在 Vue3 + Vite 项目根目录执行。这套组合覆盖了标准规则、SCSS、Vue 单文件组件、属性排序:
npm i -D stylelint stylelint-config-standard stylelint-config-standard-scss stylelint-config-standard-vue stylelint-scss postcss-html postcss-scss stylelint-config-recess-order逐个说下作用,方便你按需删减:
| 包名 | 作用 |
|---|---|
| stylelint | 核心 |
| stylelint-config-standard | 官方标准规则集 |
| stylelint-config-standard-scss | SCSS 语法规则 |
| stylelint-config-standard-vue | 校验.vue里的样式块 |
| stylelint-scss | SCSS 专属规则插件 |
| postcss-html | 让 stylelint 能解析.vue/.html里的<style> |
| postcss-scss | SCSS 自定义语法解析 |
| stylelint-config-recess-order | CSS 属性书写顺序规则 |
3.2.stylelintrc.js完整骨架
根目录新建.stylelintrc.js。注意 2024 年 stylelint v16 默认走 ESM,项目package.json里如果有"type": "module",用export default;否则用module.exports。下面给 ESM 版本:
// .stylelintrc.js // @see: https://stylelint.io export default { plugins: ['stylelint-scss', 'stylelint-order'], extends: [ 'stylelint-config-standard', 'stylelint-config-standard-scss', 'stylelint-config-standard-vue/scss', 'stylelint-config-recess-order', ], overrides: [ { files: ['**/*.{vue,html}'], customSyntax: 'postcss-html', }, ], rules: { // 允许空样式块,避免 <style scoped> 暂时为空时报错 'block-no-empty': null, // 颜色值统一小写,团队约定 'color-hex-case': 'lower', // 禁止在选择器里用未知伪类 'selector-pseudo-class-no-unknown': [ true, { ignorePseudoClasses: ['deep', 'global'] }, ], }, }这里有两个坑要提前说:
第一,stylelint-config-prettier在 stylelint v15 之后已经不需要了,官方标准规则集自己处理了和 Prettier 的冲突,别再装它,装了反而可能报重复规则。
第二,selector-pseudo-class-no-unknown这条一定要加ignorePseudoClasses: ['deep', 'global'],否则 Vue3 的:deep()、:global()会被判成未知伪类,满屏红。
3.3 VS Codesettings.json骨架
打开命令面板(Ctrl/Cmd + Shift + P),输入Preferences: Open User Settings (JSON),或者直接改工作区的.vscode/settings.json。推荐放工作区,团队共享:
{ "stylelint.enable": true, "stylelint.validate": ["css", "less", "postcss", "scss", "sass", "vue"], "editor.codeActionsOnSave": { "source.fixAll.stylelint": "explicit" }, "css.validate": false, "scss.validate": false, "less.validate": false }关键点解释:
stylelint.validate里必须显式加上"vue",否则插件不会去检查.vue文件里的样式块,这是最常见的「配了没反应」原因。
editor.codeActionsOnSave用"explicit"而不是true,是 VS Code 新版本的要求,true会提示弃用。
把css.validate、scss.validate、less.validate关掉,是因为 VS Code 内置的校验会和 stylelint 打架,出现重复波浪线。
注意:如果你从设置界面点进 stylelint 配置,VS Code 有时会自动生成一个空的
stylelint.config字段。这个空配置优先级很高,会直接覆盖你根目录的.stylelintrc.js,导致规则全部失效。进settings.json搜stylelint.config,有就删掉。
3.4 npm 脚本与 CI 校验
在package.json的scripts里加两条:
{ "scripts": { "lint:style": "stylelint \"src/**/*.{css,scss,vue}\"", "lint:style:fix": "stylelint \"src/**/*.{css,scss,vue}\" --fix" } }CI 里跑npm run lint:style,有报错就退出非零码,卡住合并。本地开发用lint:style:fix批量修。
如果项目用 husky + lint-staged,可以只对暂存文件跑:
{ "lint-staged": { "*.{css,scss,vue}": ["stylelint --fix"] } }4. 验证请求:一次通过 / 失败的实测
配置完别急着信,手动造两个文件验证一下。
先建一个「故意写错」的样式文件src/styles/bad.scss:
// src/styles/bad.scss .box { color: #FFF; margin: 0px; display: flex; background-color: red; }跑校验:
npm run lint:style预期输出类似:
src/styles/bad.scss 2:10 ✖ Expected "#fff" to be "#FFF" color-hex-case 3:11 ✖ Unexpected unit "px" length-zero-no-unit 5:3 ✖ Expected "background-color" to come before "display" order/properties-order三条报错分别对应:颜色大小写、零值带单位、属性顺序。说明规则生效了。
再跑自动修复:
npm run lint:style:fix修复后bad.scss变成:
.box { color: #fff; margin: 0; display: flex; background-color: red; }再跑一次npm run lint:style,应该零报错。这一步就是「提交前校验通过」的验证动作。
接着验证.vue文件。建src/components/Demo.vue:
<template> <div class="demo">hello</div> </template> <script setup> </script> <style scoped lang="scss"> .demo { color: #ABC; :deep(.inner) { padding: 0px; } } </style>跑npm run lint:style,应该报color-hex-case和length-zero-no-unit,但:deep()不报错——说明ignorePseudoClasses和postcss-html都配对了。如果:deep()报selector-pseudo-class-no-unknown,回去检查 3.2 里那条规则。
VS Code 里打开这个.vue文件,保存时应该自动把#ABC修成#abc、0px修成0。如果没反应,看第 5 节。
5. 本篇常见错排查
5.1 保存不自动修复
先确认 VS Code 装了 stylelint 插件(作者是 stylelint,当前 1.4 系列),并且右下角状态栏没有显示它被禁用。然后检查settings.json里editor.codeActionsOnSave的 key 是不是source.fixAll.stylelint,拼错一个字母就不生效。最后确认stylelint.validate数组里有"vue"。
5.2 报Cannot find module 'stylelint-config-standard-vue/scss'
这是版本路径问题。2024 年stylelint-config-standard-vue把 SCSS 配置拆到了/scss子路径,如果你装的是旧版,路径是stylelint-config-standard-vue。先看package.json里装的版本,v1.x 用/scss,更早的用不带后缀。实在不确定就npm ls stylelint-config-standard-vue看实际版本。
5.3 报Unknown word或 SCSS 语法解析失败
多半是customSyntax没配对。.vue文件必须走postcss-html,纯.scss文件走postcss-scss。如果你在overrides里只写了.vue没写.scss,纯 SCSS 文件可能用默认 CSS 解析器,遇到嵌套就报Unknown word。补一条:
{ files: ['**/*.scss'], customSyntax: 'postcss-scss', }5.4 规则全部失效,一条都不报
九成是 3.3 里说的空stylelint.config覆盖问题。进settings.json搜stylelint.config,删掉。另一个可能是根目录同时存在.stylelintrc和.stylelintrc.js,stylelint 按优先级只读一个,删掉多余的。
5.5stylelint-config-prettier相关报错
如果你从旧项目迁移过来,extends里还留着stylelint-config-prettier,在 stylelint v15+ 会报规则重复或找不到模块。直接删掉这一行,卸载这个包,标准规则集已经处理了冲突。
5.6 CI 里报No files matching the pattern
检查lint:style脚本里的 glob 路径。如果样式文件不在src下,或者用了 monorepo 结构,路径要相应调整。可以先本地跑npx stylelint "src/**/*.{css,scss,vue}"确认能匹配到文件,再放进 CI。
6. 把 Key 和 lint 各归各位
回到工具链整体:stylelint 负责样式规范,本地跑、CI 卡,不需要任何网络和 Key。TaoToken 负责的是你项目里「需要调模型」的那部分——比如用 AI 辅助批量改样式、写代码审查脚本、跑 Coding Agent。这两条线不要混。
如果你确实要在项目里接模型能力,建议这样分流:
排障和接入类问题,先看 API Keys 管理和接入文档,把 base URL 和 Key 配好:
- API Keys:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
- 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
想先验证模型效果、试对话,走模型对话入口:
- https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
长期编码、Agent 类场景,走 Coding Plan:
- https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
官网总入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
我自己的习惯是:.stylelintrc.js和.vscode/settings.json提交进仓库,团队共享;Key 相关的东西一律走环境变量,不进仓库。这样换人、换机器、换 CI,样式规范照跑,Key 也不会泄露。