# Oxlint JS Plugins 迁移可行性分析 更新时间:2026-03-14 ## 结论 对当前仓库,`Oxlint + jsPlugins` 已经足以承接大部分 JS/TS lint 规则,但**现阶段无法在不丢失 lint 能力的前提下完全替换 ESLint**。 更准确的判断是: - 可行:继续把 JS/TS 主体规则迁移到 Oxlint,并逐步缩小 ESLint 的职责范围。 - 不可行:立即删除 ESLint,并要求 Oxlint 100% 覆盖当前所有 Vue/JSONC/YAML/pnpm lint 规则。 ## 官方能力边界 根据 Oxc 官方文档,Oxlint 的 JS Plugins 目前具备这些特征: - 支持 ESLint v9+ 插件 API,文档表述为“大多数现有 ESLint 插件应可直接工作”。 - `jsPlugins` 仍处于 `alpha`,不受 semver 稳定性约束。 - 当前尚未支持两类关键能力: - 自定义文件格式和解析器,例如 Vue、Svelte、Angular。 - 依赖 TypeScript type-aware 的 JS 插件规则。 另外,官方内建 `vue` 插件当前只覆盖“适用于 script tags 的规则”,并不等价于完整的 `eslint-plugin-vue` 模板规则集。 官方文档: - JS Plugins: https://oxc.rs/docs/guide/usage/linter/js-plugins.html - Linter Config: https://oxc.rs/docs/guide/usage/linter/config.html - Built-in Plugins: https://oxc.rs/docs/guide/usage/linter/plugins 关键点摘录来源: - JS Plugins 兼容 ESLint v9+,且目前为 alpha:`js-plugins.html` - 暂不支持 custom file formats/parsers 与 type-aware JS plugin rules:`js-plugins.html` - 内建 `vue` 仅覆盖 script tags 可用规则:`plugins` ## 仓库当前状态 当前仓库已经不是“Oxlint 还没开始接管”的状态,而是**Oxlint 已经承担主体,ESLint 负责补位**。 ### 1. 根配置 - ESLint 入口:[eslint.config.mjs](./eslint.config.mjs) - Oxlint 入口:[oxlint.config.ts](./oxlint.config.ts) 两者都只是薄封装: - [eslint.config.mjs](./eslint.config.mjs) 直接使用 `@vben/eslint-config` - [oxlint.config.ts](./oxlint.config.ts) 直接使用 `@vben/oxlint-config` ### 2. 当前 lint 流程是双跑 见 [scripts/vsh/src/lint/index.ts](./scripts/vsh/src/lint/index.ts): - 检查时同时执行 `oxlint .` 和 `eslint . --cache` - 修复时同时执行 `oxlint . --fix` 和 `eslint . --cache --fix` 这说明工具链层面已经默认接受“Oxlint 负责大部分,ESLint 保留兜底”的模式。 ### 3. Oxlint 已覆盖的能力 见 [internal/lint-configs/oxlint-config/src/configs/plugins.ts](./internal/lint-configs/oxlint-config/src/configs/plugins.ts): - 已启用内建插件:`import`、`node`、`oxc`、`typescript`、`unicorn`、`vitest`、`vue` 见 [internal/lint-configs/oxlint-config/src/configs/tailwindcss.ts](./internal/lint-configs/oxlint-config/src/configs/tailwindcss.ts): - 已通过 `jsPlugins` 接入 `eslint-plugin-better-tailwindcss` 这说明仓库已经验证过一个重要前提:**Oxlint 的 `jsPlugins` 在本项目里不是理论能力,而是已经在生产配置中使用。** ## 为什么现在还不能彻底删掉 ESLint ### 1. Vue 模板规则仍依赖 ESLint 生态 见 [internal/lint-configs/eslint-config/src/configs/vue.ts](./internal/lint-configs/eslint-config/src/configs/vue.ts): - 使用 `vue-eslint-parser` - 使用 `pluginVue.processors?.['.vue']` - 配置了大量模板/组件约束规则,例如: - `vue/attribute-hyphenation` - `vue/html-self-closing` - `vue/v-on-event-hyphenation` - `vue/block-order` - `vue/require-default-prop` - `vue/one-component-per-file` 这部分明显超出“只 lint `