[{"data":1,"prerenderedAt":309},["ShallowReactive",2],{"content:\u002Fposts\u002F2026\u002Fmigrate-eslint-and-prettier-to-oxlint-and-oxfmt":3,"surround:\u002Fposts\u002F2026\u002Fmigrate-eslint-and-prettier-to-oxlint-and-oxfmt":297},{"id":4,"title":5,"body":6,"canonical":272,"categories":273,"date":275,"description":276,"draft":277,"extension":278,"image":272,"meta":279,"navigation":280,"path":281,"permalink":272,"readingTime":282,"recommend":272,"references":272,"seo":287,"sitemap":288,"stem":292,"tags":293,"type":272,"updated":275,"__hash__":296},"content\u002Fposts\u002F2026\u002Fmigrate-eslint-and-prettier-to-oxlint-and-oxfmt.md","使用 oxlint + oxfmt 替换 ESLint + Prettier",{"type":7,"value":8,"toc":257},"minimark",[9,13,18,26,42,45,48,52,79,82,86,89,94,105,109,112,120,124,129,135,140,146,151,169,175,186,194,199,205,209,215,221,227,233,239,243,246,252],[10,11,12],"p",{},"最近我将自己的 Nest 项目中的 ESLint 和 Prettier 替换为 oxlint 和 oxfmt，至今运行良好。最明显的改善是速度：原先完整的 lint 检查需要 10 多秒，现在仅需 1 秒左右；保存文件时的格式化也几乎无感延迟。今天就来分享一下为什么要做这个替换，以及如何平滑迁移。",[14,15,17],"h2",{"id":16},"什么是-oxlint-和-oxfmt","什么是 oxlint 和 oxfmt",[10,19,20,21,25],{},"两者都属于 ",[22,23,24],"strong",{},"oxc"," 项目（一个用 Rust 编写的高性能 JavaScript\u002FTypeScript 工具链）。",[27,28,29,36],"ul",{},[30,31,32,35],"li",{},[22,33,34],{},"oxlint"," 对标 ESLint，用于代码质量检查。",[30,37,38,41],{},[22,39,40],{},"oxfmt"," 对标 Prettier，用于代码自动格式化。",[10,43,44],{},"目前它们已实现绝大多数常用规则与配置选项，兼容性良好，完全能满足日常开发需求。",[10,46,47],{},"由于采用 Rust 编写，它们在性能上具有数量级优势，同时保持了与现有配置相似的迁移体验。",[14,49,51],{"id":50},"为什么选择它们","为什么选择它们？",[53,54,55,61,67,73],"ol",{},[30,56,57,60],{},[22,58,59],{},"极致的速度","：相比 ESLint，oxlint 在大型项目中通常快 50 倍以上；oxfmt 也远快于 Prettier，尤其在实时格式化时感知明显。",[30,62,63,66],{},[22,64,65],{},"高度兼容","：支持常见的 ESLint 规则（包括 TypeScript）和 Prettier 配置方式，迁移成本低。",[30,68,69,72],{},[22,70,71],{},"迁移简单","：配置结构与原有工具相似，大部分规则名称一致，只需少量调整即可接入。",[30,74,75,78],{},[22,76,77],{},"专注替代","：相比于一体化工具链（如 Biome），oxlint\u002Foxfmt 更专注于直接替代 ESLint\u002FPrettier，对现有项目改造更友好。",[10,80,81],{},"如果你正在寻找更快的代码检查与格式化方案，且不希望大幅改动配置，oxlint + oxfmt 是一个值得尝试的选择。它们不仅带来了开发体验上的流畅感，也延续了熟悉的配置方式，是目前 Rust 工具链中迁移成本较低的一套方案。",[14,83,85],{"id":84},"在现有项目中我们如何将eslint-prettier替换为-oxlint-和oxfmt","在现有项目中我们如何将eslint + prettier替换为 oxlint 和oxfmt",[10,87,88],{},"我这里有一个之前的 nest 项目，使用的是 eslint + prettier的方案，我们一起将它改造一下。具体改造步骤如下：",[90,91,93],"h3",{"id":92},"_1-安装依赖","1. 安装依赖",[95,96,102],"pre",{"className":97,"code":99,"language":100,"meta":101},[98],"language-shell","pnpm add -D oxlint oxfmt\n","shell","",[103,104,99],"code",{"__ignoreMap":101},[90,106,108],{"id":107},"_2-改造脚本","2. 改造脚本",[10,110,111],{},"将之前使用 ESLint 和 Prettier 的脚本改成使用 oxlint 和 oxfmt",[95,113,118],{"className":114,"code":116,"language":117,"meta":101},[115],"language-json","{\n  \"scripts\": {\n    \"lint:check\": \"oxlint\",\n    \"lint\": \"oxlint --fix\",\n    \"fmt\": \"oxfmt\",\n    \"fmt:check\": \"oxfmt --check\",\n  },\n}\n","json",[103,119,116],{"__ignoreMap":101},[90,121,123],{"id":122},"_3-运行迁移脚本","3. 运行迁移脚本",[27,125,126],{},[30,127,128],{},"Prettier 迁移",[95,130,133],{"className":131,"code":132,"language":100,"meta":101},[98],"pnpm dlx oxfmt --migrate prettier\n",[103,134,132],{"__ignoreMap":101},[27,136,137],{},[30,138,139],{},"ESLint 迁移",[95,141,144],{"className":142,"code":143,"language":100,"meta":101},[98],"pnpm dlx @oxlint\u002Fmigrate .\u002Feslint.config.mjs\n",[103,145,143],{"__ignoreMap":101},[27,147,148],{},[30,149,150],{},"限制它们的运行范围",[10,152,153,154,157,158,161,162,157,165,168],{},"这里我不需要它来格式化 ",[103,155,156],{"code":156},"drizzle"," 和 ",[103,159,160],{"code":160},"dist"," 中的文件，我们需要在 ",[103,163,164],{"code":164},".oxfmtrc.json",[103,166,167],{"code":167},".oxlintrc.json"," 中添加以下代码。你可以根据你要限制的范围来配置",[95,170,173],{"className":171,"code":172,"language":117,"meta":101},[115],"\"ignorePatterns\": [\"drizzle\u002F**\", \"dist\u002F**\u002F*\"]\n",[103,174,172],{"__ignoreMap":101},[27,176,177,183],{},[30,178,179,180],{},"删除之前的 ",[103,181,182],{"code":182},".prettierrc",[30,184,185],{},"删除 eslint.config.mjs 中的 prettier 插件",[95,187,192],{"className":188,"code":190,"language":191,"meta":101},[189],"language-js","import eslintPluginPrettierRecommended from 'eslint-plugin-prettier\u002Frecommended'; \u002F\u002F [!code --]\n\u002F\u002F 其他内容\neslintPluginPrettierRecommended, \u002F\u002F [!code --]\n","js",[103,193,190],{"__ignoreMap":101},[27,195,196],{},[30,197,198],{},"移除 prettier 插件",[95,200,203],{"className":201,"code":202,"language":100,"meta":101},[98],"pnpm remove prettier\n",[103,204,202],{"__ignoreMap":101},[90,206,208],{"id":207},"_4-添加-vscode-配置","4. 添加 vscode 配置",[10,210,211,214],{},[103,212,213],{"code":213},".vscode\u002Fextensions.json"," 中添加 oxc 插件",[95,216,219],{"className":217,"code":218,"filename":213,"language":117,"meta":101},[115],"{\n  \"recommendations\": [\"oxc.oxc-vscode\",],\n}\n",[103,220,218],{"__ignoreMap":101},[222,223,224],"blockquote",{},[10,225,226],{},"这是让别人在使用该项目时 vscode 提示该项目需要安装 oxc",[10,228,229,232],{},[103,230,231],{"code":231},".vscode\u002Fsettings.json"," 改造",[95,234,237],{"className":235,"code":236,"filename":231,"language":117,"meta":101},[115],"{\n  \"oxc.fmt.configPath\": \".oxfmtrc.json\",\n  \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n  \"editor.formatOnSave\": true,\n  \"[javascript]\": {\n    \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n    \"editor.formatOnSave\": true,\n  },\n  \"[typescript]\": {\n    \"editor.defaultFormatter\": \"oxc.oxc-vscode\",\n    \"editor.formatOnSave\": true,\n  },\n}\n",[103,238,236],{"__ignoreMap":101},[90,240,242],{"id":241},"_5-运行脚本检查是否可以正确格式化","5. 运行脚本检查是否可以正确格式化",[90,244,245],{"id":245},"两者运行速度对比",[10,247,248],{},[249,250],"img",{"alt":101,"src":251},"https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002Foxlint+oxfmt-script-result.png",[10,253,254],{},[249,255],{"alt":101,"src":256},"https:\u002F\u002Fbitmc.uno\u002Fpicgo\u002Fprettier+eslint-script-result.png",{"title":101,"searchDepth":258,"depth":258,"links":259},4,[260,262,263],{"id":16,"depth":261,"text":17},2,{"id":50,"depth":261,"text":51},{"id":84,"depth":261,"text":85,"children":264},[265,267,268,269,270,271],{"id":92,"depth":266,"text":93},3,{"id":107,"depth":266,"text":108},{"id":122,"depth":266,"text":123},{"id":207,"depth":266,"text":208},{"id":241,"depth":266,"text":242},{"id":245,"depth":266,"text":245},null,[274],"代码","2026-02-10 08:49:04","最近我将自己的 Nest 项目中的 ESLint 和 Prettier 替换为 oxlint 和 oxfmt，至今运行良好。",false,"md",{},true,"\u002Fposts\u002F2026\u002Fmigrate-eslint-and-prettier-to-oxlint-and-oxfmt",{"text":283,"minutes":284,"time":285,"words":286},"4 min read",3.78,226800,756,{"title":5,"description":276},{"loc":281,"images":289},[290,291],{"loc":251},{"loc":256},"posts\u002F2026\u002Fmigrate-eslint-and-prettier-to-oxlint-and-oxfmt",[294,34,40,295],"ESLint","Nest","4SVa33koY9EnNXR3Rzzdve6kmFKhTDQTahjvpEuYhes",[298,303],{"title":299,"path":300,"stem":301,"date":302,"type":272,"children":-1},"Zod 和 Valibot 的异同","\u002Fposts\u002F2026\u002Fzod-vs-valibot","posts\u002F2026\u002Fzod-vs-valibot","2026-01-06 14:54:01",{"title":304,"path":305,"stem":306,"date":307,"type":308,"children":-1},"一个不错的本地输入解决方案","\u002Fposts\u002F2026\u002Frime-setting","posts\u002F2026\u002Frime-setting","2026-02-14 17:38:14","story",1789642585136]