sublimelinter + eslint 是当前最可行的 js 复杂度分析链路:需先装 sublimelinter 再装 sublimelinter-eslint,全局安装 eslint 并配置 executable 路径,启用 complexity、max-statements 等规则,通过测试函数验证波浪线提示是否生效。

SublimeLinter + ESLint 是当前最可行的 JS 复杂度分析链路
Sublime Text 本身不支持 JS 复杂度分析,SublimeLinter 是唯一能稳定接入外部工具的调度层;而 ESLint 是目前唯一支持圈复杂度(cyclomatic-complexity)、函数长度(max-statements)、嵌套深度(max-depth)等规则的主流 JS linter。别试 jshint 或 jscs——它们早就不维护,也不支持这些规则。
- 必须先装
SublimeLinter核心插件,再装SublimeLinter-eslint,顺序颠倒会导致后者注册失败 -
ESLint必须全局安装:npm install -g eslint,且终端中运行eslint --version能返回版本号才算通过 - 项目根目录需有
.eslintrc.js或.eslintrc.json,里面至少启用一条复杂度规则,例如:"complexity": ["error", { "max": 10 }] - Sublime Text GUI 启动时 PATH 常和终端不一致,若插件静默不报错,优先检查
Preferences → Package Settings → SublimeLinter → Settings – User中是否配了"eslint": {"executable": "/usr/local/bin/eslint"}(macOS)或"executable": "C:\Program Files\nodejs\eslint.cmd"(Windows)
配置 ESLint 规则时容易忽略的三个关键点
只装插件不配规则,等于没装。复杂度类规则默认全关闭,必须显式启用:
-
complexity控制函数圈复杂度,但只对函数体生效,if/for单独写在顶层不会触发——它算的是控制流图中的路径数,不是 if 个数 -
max-statements和max-params需配合overrides按文件类型差异化设置,比如测试文件可放宽max-statements限制,避免误报 - 若用
eslint-plugin-complexity这类第三方插件,必须在.eslintrc的plugins数组里声明,并在extends或rules中引用,否则规则不加载
为什么 Radon / Lizard 不适用于 JS 复杂度分析
Radon 只支持 Python,Lizard 虽标称多语言,但对 JS 的解析能力极弱:它会把箭头函数、解构赋值、可选链当成语法错误跳过,导致圈复杂度计算结果为 0 或直接崩溃。实测在包含 ?. 或 ?? 的现代 JS 文件中,Lizard 80% 情况下无法输出有效指标。
- 不要被“支持多语言”宣传误导,JS 支持度看源码 README 中的
Supported languages小节,而非标题 - 如果硬要跑 Lizard,得先用 Babel 把代码转成 ES5 再喂给它,成本远高于直接配好 ESLint
- 真正需要跨语言统一分析的场景,应上 SonarQube 或 CodeClimate,Sublime 只负责把 ESLint 的实时反馈接进来
验证是否真在工作:最小可测行为
别依赖“插件已安装”或“右下角显示 ESLint”,真实有效性必须靠错误触发来验证:
- 新建一个
test.js,写一个明显超限的函数:function bad() { if (a) { if (b) { if (c) { return 1; } } } } - 保存文件,看行号左侧是否出现黄色波浪线(warning)或红色波浪线(error),鼠标悬停是否显示
Complexity of function 'bad' is 4. Maximum allowed is 3. - 如果没反应,立刻打开 Sublime Text 控制台(
Ctrl+`),搜索eslint或SublimeLinter相关报错——常见是ENOENT: no such file or directory, stat '/xxx/eslint',说明 executable 路径错了











