[{"data":1,"prerenderedAt":2013},["ShallowReactive",2],{"blog:\u002Fblog\u002Fnodejs\u002Foxlint":3},{"id":4,"title":5,"author":6,"body":7,"category":1999,"date":2000,"description":2001,"draft":2002,"extension":2003,"image":2004,"meta":2005,"navigation":296,"path":2006,"seo":2007,"series":2004,"seriesOrder":2004,"seriesTitle":2004,"stem":2008,"tags":2009,"updatedAt":2004,"__hash__":2012},"blog\u002Fblog\u002Fnodejs\u002Foxlint\u002Findex.md","Oxlint + Oxfmt - 用 Rust 加速你的程式碼檢查與格式化","charles",{"type":8,"value":9,"toc":1959},"minimark",[10,14,18,22,43,51,54,58,111,122,126,129,139,141,144,168,170,174,204,211,271,274,345,347,351,358,721,724,783,787,925,927,931,934,955,958,960,964,967,970,979,982,985,991,1072,1077,1079,1083,1086,1090,1119,1123,1129,1146,1149,1157,1161,1164,1180,1186,1247,1252,1263,1265,1269,1272,1278,1295,1298,1405,1409,1589,1591,1594,1597,1720,1723,1729,1731,1734,1738,1747,1751,1754,1758,1761,1765,1776,1780,1793,1795,1798,1832,1834,1837,1909,1912,1926,1929,1931,1934,1955],[11,12,5],"h1",{"id":13},"oxlint-oxfmt-用-rust-加速你的程式碼檢查與格式化",[15,16,17],"h2",{"id":17},"這篇要解決什麼問題",[19,20,21],"p",{},"ESLint 和 Prettier 是前端開發的標配工具，但隨著專案規模增長，它們的速度問題變得越來越明顯：",[23,24,25,34,37,40],"ul",{},[26,27,28,29,33],"li",{},"大型專案執行 ",[30,31,32],"code",{},"eslint ."," 需要等待數秒甚至數十秒",[26,35,36],{},"CI\u002FCD 流程中 lint 步驟佔用大量時間",[26,38,39],{},"pre-commit hooks 讓提交變得緩慢",[26,41,42],{},"開發者因為等待而跳過檢查",[19,44,45,46,50],{},"Oxlint 和 Oxfmt 是用 Rust 重寫的 linter 和 formatter，能夠帶來 ",[47,48,49],"strong",{},"50-100 倍的速度提升","，讓程式碼檢查從「等待」變成「即時」。",[52,53],"hr",{},[15,55,57],{"id":56},"oxlint-和-oxfmt-是什麼","Oxlint 和 Oxfmt 是什麼",[59,60,61,80],"table",{},[62,63,64],"thead",{},[65,66,67,71,74,77],"tr",{},[68,69,70],"th",{},"工具",[68,72,73],{},"對標",[68,75,76],{},"語言",[68,78,79],{},"特點",[81,82,83,98],"tbody",{},[65,84,85,89,92,95],{},[86,87,88],"td",{},"Oxlint",[86,90,91],{},"ESLint",[86,93,94],{},"Rust",[86,96,97],{},"快 50-100 倍，零配置即可使用",[65,99,100,103,106,108],{},[86,101,102],{},"Oxfmt",[86,104,105],{},"Prettier",[86,107,94],{},[86,109,110],{},"快 35 倍，格式一致性高",[19,112,113,114,121],{},"這兩個工具都來自 ",[115,116,120],"a",{"href":117,"rel":118},"https:\u002F\u002Foxc.rs\u002F",[119],"nofollow","Oxc 專案","（Oxidation Compiler），目標是用 Rust 重寫前端工具鏈，提供極致的效能。",[123,124,125],"h3",{"id":125},"效能對比",[19,127,128],{},"以一個中型專案（約 500 個檔案）為例：",[130,131,136],"pre",{"className":132,"code":134,"language":135},[133],"language-text","ESLint:   8.2 秒\nOxlint:   0.1 秒  (快 82 倍)\n\nPrettier: 4.5 秒\nOxfmt:    0.12 秒 (快 37 倍)\n","text",[30,137,134],{"__ignoreMap":138},"",[52,140],{},[15,142,143],{"id":143},"準備環境",[23,145,146,158],{},[26,147,148,149],{},"Node.js v18 或以上版本\n",[150,151,152],"blockquote",{},[19,153,154],{},[115,155,157],{"href":156},"\u002Fblog\u002Fnodejs\u002Fnvm","參考文章",[26,159,160,161],{},"pnpm 或其他套件管理工具\n",[150,162,163],{},[19,164,165],{},[115,166,157],{"href":167},"\u002Fblog\u002Fnodejs\u002Fpackage-manager",[52,169],{},[15,171,173],{"id":172},"安裝-oxlint-和-oxfmt","安裝 Oxlint 和 Oxfmt",[130,175,179],{"className":176,"code":177,"language":178,"meta":138,"style":138},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","pnpm add -D oxlint oxfmt\n","bash",[30,180,181],{"__ignoreMap":138},[182,183,186,190,194,198,201],"span",{"class":184,"line":185},"line",1,[182,187,189],{"class":188},"sbgvK","pnpm",[182,191,193],{"class":192},"s_sjI"," add",[182,195,197],{"class":196},"stzsN"," -D",[182,199,200],{"class":192}," oxlint",[182,202,203],{"class":192}," oxfmt\n",[19,205,206,207,210],{},"安裝完成後，在 ",[30,208,209],{},"package.json"," 加入 scripts：",[130,212,221],{"className":213,"code":214,"highlights":215,"language":220,"meta":138,"style":138},"language-json:line-numbers shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"scripts\": {\n    \"lint\": \"oxlint\",\n    \"lint:fix\": \"oxlint --fix\",\n    \"fmt\": \"oxfmt --write\",\n    \"fmt:check\": \"oxfmt --check\"\n  }\n}\n",[216,217,218,219],3,4,5,6,"json:line-numbers",[30,222,223,228,234,241,247,253,259,265],{"__ignoreMap":138},[182,224,225],{"class":184,"line":185},[182,226,227],{},"{\n",[182,229,231],{"class":184,"line":230},2,[182,232,233],{},"  \"scripts\": {\n",[182,235,238],{"class":236,"line":216},[184,237],"highlight",[182,239,240],{},"    \"lint\": \"oxlint\",\n",[182,242,244],{"class":243,"line":217},[184,237],[182,245,246],{},"    \"lint:fix\": \"oxlint --fix\",\n",[182,248,250],{"class":249,"line":218},[184,237],[182,251,252],{},"    \"fmt\": \"oxfmt --write\",\n",[182,254,256],{"class":255,"line":219},[184,237],[182,257,258],{},"    \"fmt:check\": \"oxfmt --check\"\n",[182,260,262],{"class":184,"line":261},7,[182,263,264],{},"  }\n",[182,266,268],{"class":184,"line":267},8,[182,269,270],{},"}\n",[19,272,273],{},"現在可以執行：",[130,275,277],{"className":176,"code":276,"language":178,"meta":138,"style":138},"# 檢查程式碼問題\npnpm lint\n\n# 檢查並自動修復\npnpm lint:fix\n\n# 格式化程式碼\npnpm fmt\n\n# 檢查格式是否正確（不修改檔案）\npnpm fmt:check\n",[30,278,279,285,292,298,303,310,314,319,326,331,337],{"__ignoreMap":138},[182,280,281],{"class":184,"line":185},[182,282,284],{"class":283},"sutJx","# 檢查程式碼問題\n",[182,286,287,289],{"class":184,"line":230},[182,288,189],{"class":188},[182,290,291],{"class":192}," lint\n",[182,293,294],{"class":184,"line":216},[182,295,297],{"emptyLinePlaceholder":296},true,"\n",[182,299,300],{"class":184,"line":217},[182,301,302],{"class":283},"# 檢查並自動修復\n",[182,304,305,307],{"class":184,"line":218},[182,306,189],{"class":188},[182,308,309],{"class":192}," lint:fix\n",[182,311,312],{"class":184,"line":219},[182,313,297],{"emptyLinePlaceholder":296},[182,315,316],{"class":184,"line":261},[182,317,318],{"class":283},"# 格式化程式碼\n",[182,320,321,323],{"class":184,"line":267},[182,322,189],{"class":188},[182,324,325],{"class":192}," fmt\n",[182,327,329],{"class":184,"line":328},9,[182,330,297],{"emptyLinePlaceholder":296},[182,332,334],{"class":184,"line":333},10,[182,335,336],{"class":283},"# 檢查格式是否正確（不修改檔案）\n",[182,338,340,342],{"class":184,"line":339},11,[182,341,189],{"class":188},[182,343,344],{"class":192}," fmt:check\n",[52,346],{},[15,348,350],{"id":349},"設定-oxlint","設定 Oxlint",[19,352,353,354,357],{},"Oxlint 預設就能檢查大多數常見問題，但如果需要自訂規則，可以建立 ",[30,355,356],{},".oxlintrc.json","：",[130,359,363],{"className":360,"code":361,"language":362,"meta":138,"style":138},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"$schema\": \".\u002Fnode_modules\u002Foxlint\u002Fconfiguration_schema.json\",\n  \"plugins\": [\"typescript\", \"import\", \"unicorn\"],\n  \"env\": {\n    \"browser\": true,\n    \"node\": true,\n    \"es2024\": true\n  },\n  \"rules\": {\n    \"eqeqeq\": \"error\",\n    \"camelcase\": \"error\",\n    \"no-await-in-loop\": \"error\",\n    \"require-atomic-updates\": \"error\",\n    \"max-nested-callbacks\": [\"warn\", { \"max\": 3 }],\n    \"no-return-await\": \"error\"\n  },\n  \"ignorePatterns\": [\"node_modules\", \"dist\", \".nuxt\", \"**\u002F*.md\"]\n}\n","json",[30,364,365,370,398,441,455,473,488,502,507,520,540,559,579,599,641,660,665,716],{"__ignoreMap":138},[182,366,367],{"class":184,"line":185},[182,368,227],{"class":369},"sP7_E",[182,371,372,376,380,383,386,390,393,395],{"class":184,"line":230},[182,373,375],{"class":374},"s39Yj","  \"",[182,377,379],{"class":378},"sseR_","$schema",[182,381,382],{"class":374},"\"",[182,384,385],{"class":369},":",[182,387,389],{"class":388},"sjJ54"," \"",[182,391,392],{"class":192},".\u002Fnode_modules\u002Foxlint\u002Fconfiguration_schema.json",[182,394,382],{"class":388},[182,396,397],{"class":369},",\n",[182,399,400,402,405,407,409,412,414,417,419,422,424,427,429,431,433,436,438],{"class":184,"line":216},[182,401,375],{"class":374},[182,403,404],{"class":378},"plugins",[182,406,382],{"class":374},[182,408,385],{"class":369},[182,410,411],{"class":369}," [",[182,413,382],{"class":388},[182,415,416],{"class":192},"typescript",[182,418,382],{"class":388},[182,420,421],{"class":369},",",[182,423,389],{"class":388},[182,425,426],{"class":192},"import",[182,428,382],{"class":388},[182,430,421],{"class":369},[182,432,389],{"class":388},[182,434,435],{"class":192},"unicorn",[182,437,382],{"class":388},[182,439,440],{"class":369},"],\n",[182,442,443,445,448,450,452],{"class":184,"line":217},[182,444,375],{"class":374},[182,446,447],{"class":378},"env",[182,449,382],{"class":374},[182,451,385],{"class":369},[182,453,454],{"class":369}," {\n",[182,456,457,460,464,466,468,471],{"class":184,"line":218},[182,458,459],{"class":374},"    \"",[182,461,463],{"class":462},"sZMiF","browser",[182,465,382],{"class":374},[182,467,385],{"class":369},[182,469,470],{"class":374}," true",[182,472,397],{"class":369},[182,474,475,477,480,482,484,486],{"class":184,"line":219},[182,476,459],{"class":374},[182,478,479],{"class":462},"node",[182,481,382],{"class":374},[182,483,385],{"class":369},[182,485,470],{"class":374},[182,487,397],{"class":369},[182,489,490,492,495,497,499],{"class":184,"line":261},[182,491,459],{"class":374},[182,493,494],{"class":462},"es2024",[182,496,382],{"class":374},[182,498,385],{"class":369},[182,500,501],{"class":374}," true\n",[182,503,504],{"class":184,"line":267},[182,505,506],{"class":369},"  },\n",[182,508,509,511,514,516,518],{"class":184,"line":328},[182,510,375],{"class":374},[182,512,513],{"class":378},"rules",[182,515,382],{"class":374},[182,517,385],{"class":369},[182,519,454],{"class":369},[182,521,522,524,527,529,531,533,536,538],{"class":184,"line":333},[182,523,459],{"class":374},[182,525,526],{"class":462},"eqeqeq",[182,528,382],{"class":374},[182,530,385],{"class":369},[182,532,389],{"class":388},[182,534,535],{"class":192},"error",[182,537,382],{"class":388},[182,539,397],{"class":369},[182,541,542,544,547,549,551,553,555,557],{"class":184,"line":339},[182,543,459],{"class":374},[182,545,546],{"class":462},"camelcase",[182,548,382],{"class":374},[182,550,385],{"class":369},[182,552,389],{"class":388},[182,554,535],{"class":192},[182,556,382],{"class":388},[182,558,397],{"class":369},[182,560,562,564,567,569,571,573,575,577],{"class":184,"line":561},12,[182,563,459],{"class":374},[182,565,566],{"class":462},"no-await-in-loop",[182,568,382],{"class":374},[182,570,385],{"class":369},[182,572,389],{"class":388},[182,574,535],{"class":192},[182,576,382],{"class":388},[182,578,397],{"class":369},[182,580,582,584,587,589,591,593,595,597],{"class":184,"line":581},13,[182,583,459],{"class":374},[182,585,586],{"class":462},"require-atomic-updates",[182,588,382],{"class":374},[182,590,385],{"class":369},[182,592,389],{"class":388},[182,594,535],{"class":192},[182,596,382],{"class":388},[182,598,397],{"class":369},[182,600,602,604,607,609,611,613,615,618,620,622,625,627,631,633,635,638],{"class":184,"line":601},14,[182,603,459],{"class":374},[182,605,606],{"class":462},"max-nested-callbacks",[182,608,382],{"class":374},[182,610,385],{"class":369},[182,612,411],{"class":369},[182,614,382],{"class":388},[182,616,617],{"class":192},"warn",[182,619,382],{"class":388},[182,621,421],{"class":369},[182,623,624],{"class":369}," {",[182,626,389],{"class":374},[182,628,630],{"class":629},"srdBf","max",[182,632,382],{"class":374},[182,634,385],{"class":369},[182,636,637],{"class":629}," 3",[182,639,640],{"class":369}," }],\n",[182,642,644,646,649,651,653,655,657],{"class":184,"line":643},15,[182,645,459],{"class":374},[182,647,648],{"class":462},"no-return-await",[182,650,382],{"class":374},[182,652,385],{"class":369},[182,654,389],{"class":388},[182,656,535],{"class":192},[182,658,659],{"class":388},"\"\n",[182,661,663],{"class":184,"line":662},16,[182,664,506],{"class":369},[182,666,668,670,673,675,677,679,681,684,686,688,690,693,695,697,699,702,704,706,708,711,713],{"class":184,"line":667},17,[182,669,375],{"class":374},[182,671,672],{"class":378},"ignorePatterns",[182,674,382],{"class":374},[182,676,385],{"class":369},[182,678,411],{"class":369},[182,680,382],{"class":388},[182,682,683],{"class":192},"node_modules",[182,685,382],{"class":388},[182,687,421],{"class":369},[182,689,389],{"class":388},[182,691,692],{"class":192},"dist",[182,694,382],{"class":388},[182,696,421],{"class":369},[182,698,389],{"class":388},[182,700,701],{"class":192},".nuxt",[182,703,382],{"class":388},[182,705,421],{"class":369},[182,707,389],{"class":388},[182,709,710],{"class":192},"**\u002F*.md",[182,712,382],{"class":388},[182,714,715],{"class":369},"]\n",[182,717,719],{"class":184,"line":718},18,[182,720,270],{"class":369},[123,722,723],{"id":723},"常用設定說明",[59,725,726,736],{},[62,727,728],{},[65,729,730,733],{},[68,731,732],{},"設定",[68,734,735],{},"說明",[81,737,738,747,756,765,774],{},[65,739,740,744],{},[86,741,742],{},[30,743,379],{},[86,745,746],{},"提供 JSON Schema，讓編輯器能自動補全和驗證",[65,748,749,753],{},[86,750,751],{},[30,752,404],{},[86,754,755],{},"啟用額外的規則集（typescript、import、unicorn 等）",[65,757,758,762],{},[86,759,760],{},[30,761,447],{},[86,763,764],{},"指定執行環境，讓 Oxlint 知道哪些全域變數是合法的",[65,766,767,771],{},[86,768,769],{},[30,770,513],{},[86,772,773],{},"自訂規則，格式與 ESLint 相容",[65,775,776,780],{},[86,777,778],{},[30,779,672],{},[86,781,782],{},"忽略特定檔案或目錄",[123,784,786],{"id":785},"可用的-plugins","可用的 Plugins",[130,788,790],{"className":360,"code":789,"language":362,"meta":138,"style":138},"{\n  \"plugins\": [\n    \"typescript\", \u002F\u002F TypeScript 相關規則\n    \"import\", \u002F\u002F import\u002Fexport 規則\n    \"unicorn\", \u002F\u002F 現代 JavaScript 最佳實踐\n    \"react\", \u002F\u002F React 相關規則\n    \"jsx-a11y\", \u002F\u002F 無障礙規則\n    \"nextjs\", \u002F\u002F Next.js 規則\n    \"jsdoc\", \u002F\u002F JSDoc 規則\n    \"promise\" \u002F\u002F Promise 相關規則\n  ]\n}\n",[30,791,792,796,809,822,835,848,862,876,890,904,916,921],{"__ignoreMap":138},[182,793,794],{"class":184,"line":185},[182,795,227],{"class":369},[182,797,798,800,802,804,806],{"class":184,"line":230},[182,799,375],{"class":374},[182,801,404],{"class":378},[182,803,382],{"class":374},[182,805,385],{"class":369},[182,807,808],{"class":369}," [\n",[182,810,811,813,815,817,819],{"class":184,"line":216},[182,812,459],{"class":388},[182,814,416],{"class":192},[182,816,382],{"class":388},[182,818,421],{"class":369},[182,820,821],{"class":283}," \u002F\u002F TypeScript 相關規則\n",[182,823,824,826,828,830,832],{"class":184,"line":217},[182,825,459],{"class":388},[182,827,426],{"class":192},[182,829,382],{"class":388},[182,831,421],{"class":369},[182,833,834],{"class":283}," \u002F\u002F import\u002Fexport 規則\n",[182,836,837,839,841,843,845],{"class":184,"line":218},[182,838,459],{"class":388},[182,840,435],{"class":192},[182,842,382],{"class":388},[182,844,421],{"class":369},[182,846,847],{"class":283}," \u002F\u002F 現代 JavaScript 最佳實踐\n",[182,849,850,852,855,857,859],{"class":184,"line":219},[182,851,459],{"class":388},[182,853,854],{"class":192},"react",[182,856,382],{"class":388},[182,858,421],{"class":369},[182,860,861],{"class":283}," \u002F\u002F React 相關規則\n",[182,863,864,866,869,871,873],{"class":184,"line":261},[182,865,459],{"class":388},[182,867,868],{"class":192},"jsx-a11y",[182,870,382],{"class":388},[182,872,421],{"class":369},[182,874,875],{"class":283}," \u002F\u002F 無障礙規則\n",[182,877,878,880,883,885,887],{"class":184,"line":267},[182,879,459],{"class":388},[182,881,882],{"class":192},"nextjs",[182,884,382],{"class":388},[182,886,421],{"class":369},[182,888,889],{"class":283}," \u002F\u002F Next.js 規則\n",[182,891,892,894,897,899,901],{"class":184,"line":328},[182,893,459],{"class":388},[182,895,896],{"class":192},"jsdoc",[182,898,382],{"class":388},[182,900,421],{"class":369},[182,902,903],{"class":283}," \u002F\u002F JSDoc 規則\n",[182,905,906,908,911,913],{"class":184,"line":333},[182,907,459],{"class":388},[182,909,910],{"class":192},"promise",[182,912,382],{"class":388},[182,914,915],{"class":283}," \u002F\u002F Promise 相關規則\n",[182,917,918],{"class":184,"line":339},[182,919,920],{"class":369},"  ]\n",[182,922,923],{"class":184,"line":561},[182,924,270],{"class":369},[52,926],{},[15,928,930],{"id":929},"設定-oxfmt","設定 Oxfmt",[19,932,933],{},"Oxfmt 目前不支援設定檔，它會使用固定的格式化風格。這個設計是刻意的，目的是：",[935,936,937,943,949],"ol",{},[26,938,939,942],{},[47,940,941],{},"零配置","：不需要討論格式化風格",[26,944,945,948],{},[47,946,947],{},"一致性","：所有專案使用相同格式",[26,950,951,954],{},[47,952,953],{},"簡單","：沒有設定就沒有爭議",[19,956,957],{},"如果你習慣 Prettier 的可設定性，這可能需要適應。但好處是團隊不再需要花時間討論「要不要用分號」或「縮排用 2 還是 4」。",[52,959],{},[15,961,963],{"id":962},"整合-vs-code","整合 VS Code",[123,965,966],{"id":966},"安裝擴充套件",[19,968,969],{},"目前 Oxlint 提供官方 VS Code 擴充套件：",[150,971,972],{},[19,973,974],{},[115,975,978],{"href":976,"rel":977},"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=nickstutzman.oxc-vscode",[119],"Oxc - Visual Studio Marketplace",[19,980,981],{},"安裝後，Oxlint 會在編輯器中即時顯示問題。",[123,983,984],{"id":984},"設定自動修復和格式化",[19,986,987,988,357],{},"在專案根目錄建立或更新 ",[30,989,990],{},".vscode\u002Fsettings.json",[130,992,994],{"className":360,"code":993,"language":362,"meta":138,"style":138},"{\n  \"editor.codeActionsOnSave\": {\n    \"source.fixAll.oxc\": \"explicit\"\n  },\n  \"editor.formatOnSave\": true,\n  \"editor.defaultFormatter\": \"nickstutzman.oxc-vscode\"\n}\n",[30,995,996,1000,1013,1031,1035,1050,1068],{"__ignoreMap":138},[182,997,998],{"class":184,"line":185},[182,999,227],{"class":369},[182,1001,1002,1004,1007,1009,1011],{"class":184,"line":230},[182,1003,375],{"class":374},[182,1005,1006],{"class":378},"editor.codeActionsOnSave",[182,1008,382],{"class":374},[182,1010,385],{"class":369},[182,1012,454],{"class":369},[182,1014,1015,1017,1020,1022,1024,1026,1029],{"class":184,"line":216},[182,1016,459],{"class":374},[182,1018,1019],{"class":462},"source.fixAll.oxc",[182,1021,382],{"class":374},[182,1023,385],{"class":369},[182,1025,389],{"class":388},[182,1027,1028],{"class":192},"explicit",[182,1030,659],{"class":388},[182,1032,1033],{"class":184,"line":217},[182,1034,506],{"class":369},[182,1036,1037,1039,1042,1044,1046,1048],{"class":184,"line":218},[182,1038,375],{"class":374},[182,1040,1041],{"class":378},"editor.formatOnSave",[182,1043,382],{"class":374},[182,1045,385],{"class":369},[182,1047,470],{"class":374},[182,1049,397],{"class":369},[182,1051,1052,1054,1057,1059,1061,1063,1066],{"class":184,"line":219},[182,1053,375],{"class":374},[182,1055,1056],{"class":378},"editor.defaultFormatter",[182,1058,382],{"class":374},[182,1060,385],{"class":369},[182,1062,389],{"class":388},[182,1064,1065],{"class":192},"nickstutzman.oxc-vscode",[182,1067,659],{"class":388},[182,1069,1070],{"class":184,"line":261},[182,1071,270],{"class":369},[150,1073,1074],{},[19,1075,1076],{},"如果 Oxfmt 的 VS Code 整合尚未完善，可以暫時使用 Prettier 作為 formatter，只用 Oxlint 做檢查。",[52,1078],{},[15,1080,1082],{"id":1081},"整合-git-hooks","整合 Git Hooks",[19,1084,1085],{},"使用 Husky 在提交前自動執行檢查和格式化。",[123,1087,1089],{"id":1088},"安裝-husky","安裝 Husky",[130,1091,1093],{"className":176,"code":1092,"language":178,"meta":138,"style":138},"pnpm add -D husky\npnpm exec husky init\n",[30,1094,1095,1106],{"__ignoreMap":138},[182,1096,1097,1099,1101,1103],{"class":184,"line":185},[182,1098,189],{"class":188},[182,1100,193],{"class":192},[182,1102,197],{"class":196},[182,1104,1105],{"class":192}," husky\n",[182,1107,1108,1110,1113,1116],{"class":184,"line":230},[182,1109,189],{"class":188},[182,1111,1112],{"class":192}," exec",[182,1114,1115],{"class":192}," husky",[182,1117,1118],{"class":192}," init\n",[123,1120,1122],{"id":1121},"設定-pre-commit-hook","設定 pre-commit hook",[19,1124,1125,1126,357],{},"編輯 ",[30,1127,1128],{},".husky\u002Fpre-commit",[130,1130,1132],{"className":176,"code":1131,"language":178,"meta":138,"style":138},"pnpm fmt\npnpm lint:fix\n",[30,1133,1134,1140],{"__ignoreMap":138},[182,1135,1136,1138],{"class":184,"line":185},[182,1137,189],{"class":188},[182,1139,325],{"class":192},[182,1141,1142,1144],{"class":184,"line":230},[182,1143,189],{"class":188},[182,1145,309],{"class":192},[19,1147,1148],{},"這樣每次 commit 時都會：",[935,1150,1151,1154],{},[26,1152,1153],{},"先用 Oxfmt 格式化程式碼",[26,1155,1156],{},"再用 Oxlint 檢查並自動修復問題",[123,1158,1160],{"id":1159},"搭配-lint-staged可選","搭配 lint-staged（可選）",[19,1162,1163],{},"如果只想檢查有變更的檔案，可以使用 lint-staged：",[130,1165,1167],{"className":176,"code":1166,"language":178,"meta":138,"style":138},"pnpm add -D lint-staged\n",[30,1168,1169],{"__ignoreMap":138},[182,1170,1171,1173,1175,1177],{"class":184,"line":185},[182,1172,189],{"class":188},[182,1174,193],{"class":192},[182,1176,197],{"class":196},[182,1178,1179],{"class":192}," lint-staged\n",[19,1181,1182,1183,1185],{},"在 ",[30,1184,209],{}," 加入：",[130,1187,1189],{"className":360,"code":1188,"language":362,"meta":138,"style":138},"{\n  \"lint-staged\": {\n    \"*.{js,ts,vue,jsx,tsx}\": [\"oxlint --fix\", \"oxfmt --write\"]\n  }\n}\n",[30,1190,1191,1195,1208,1239,1243],{"__ignoreMap":138},[182,1192,1193],{"class":184,"line":185},[182,1194,227],{"class":369},[182,1196,1197,1199,1202,1204,1206],{"class":184,"line":230},[182,1198,375],{"class":374},[182,1200,1201],{"class":378},"lint-staged",[182,1203,382],{"class":374},[182,1205,385],{"class":369},[182,1207,454],{"class":369},[182,1209,1210,1212,1215,1217,1219,1221,1223,1226,1228,1230,1232,1235,1237],{"class":184,"line":216},[182,1211,459],{"class":374},[182,1213,1214],{"class":462},"*.{js,ts,vue,jsx,tsx}",[182,1216,382],{"class":374},[182,1218,385],{"class":369},[182,1220,411],{"class":369},[182,1222,382],{"class":388},[182,1224,1225],{"class":192},"oxlint --fix",[182,1227,382],{"class":388},[182,1229,421],{"class":369},[182,1231,389],{"class":388},[182,1233,1234],{"class":192},"oxfmt --write",[182,1236,382],{"class":388},[182,1238,715],{"class":369},[182,1240,1241],{"class":184,"line":217},[182,1242,264],{"class":369},[182,1244,1245],{"class":184,"line":218},[182,1246,270],{"class":369},[19,1248,1249,1250,357],{},"修改 ",[30,1251,1128],{},[130,1253,1255],{"className":176,"code":1254,"language":178,"meta":138,"style":138},"pnpm lint-staged\n",[30,1256,1257],{"__ignoreMap":138},[182,1258,1259,1261],{"class":184,"line":185},[182,1260,189],{"class":188},[182,1262,1179],{"class":192},[52,1264],{},[15,1266,1268],{"id":1267},"從-eslint-prettier-遷移","從 ESLint + Prettier 遷移",[123,1270,1271],{"id":1271},"遷移策略",[19,1273,1274,1277],{},[47,1275,1276],{},"漸進式遷移","：先讓兩套工具並存，逐步替換。",[935,1279,1280,1282,1289,1292],{},[26,1281,173],{},[26,1283,1284,1285,1288],{},"修改 scripts，新增 ",[30,1286,1287],{},"ox-*"," 指令",[26,1290,1291],{},"測試確認輸出結果符合預期",[26,1293,1294],{},"移除 ESLint 和 Prettier",[123,1296,1297],{"id":1297},"完整遷移步驟",[130,1299,1301],{"className":176,"code":1300,"language":178,"meta":138,"style":138},"# 1. 安裝新工具\npnpm add -D oxlint oxfmt\n\n# 2. 更新 package.json scripts\n# 將 eslint 改為 oxlint，prettier 改為 oxfmt\n\n# 3. 測試\npnpm lint\npnpm fmt\n\n# 4. 確認沒問題後，移除舊工具\npnpm remove eslint prettier @antfu\u002Feslint-config\n# 以及其他 eslint-* 和 prettier-* 套件\n\n# 5. 刪除舊設定檔\nrm eslint.config.js .prettierrc\n",[30,1302,1303,1308,1320,1324,1329,1334,1338,1343,1349,1355,1359,1364,1380,1385,1389,1394],{"__ignoreMap":138},[182,1304,1305],{"class":184,"line":185},[182,1306,1307],{"class":283},"# 1. 安裝新工具\n",[182,1309,1310,1312,1314,1316,1318],{"class":184,"line":230},[182,1311,189],{"class":188},[182,1313,193],{"class":192},[182,1315,197],{"class":196},[182,1317,200],{"class":192},[182,1319,203],{"class":192},[182,1321,1322],{"class":184,"line":216},[182,1323,297],{"emptyLinePlaceholder":296},[182,1325,1326],{"class":184,"line":217},[182,1327,1328],{"class":283},"# 2. 更新 package.json scripts\n",[182,1330,1331],{"class":184,"line":218},[182,1332,1333],{"class":283},"# 將 eslint 改為 oxlint，prettier 改為 oxfmt\n",[182,1335,1336],{"class":184,"line":219},[182,1337,297],{"emptyLinePlaceholder":296},[182,1339,1340],{"class":184,"line":261},[182,1341,1342],{"class":283},"# 3. 測試\n",[182,1344,1345,1347],{"class":184,"line":267},[182,1346,189],{"class":188},[182,1348,291],{"class":192},[182,1350,1351,1353],{"class":184,"line":328},[182,1352,189],{"class":188},[182,1354,325],{"class":192},[182,1356,1357],{"class":184,"line":333},[182,1358,297],{"emptyLinePlaceholder":296},[182,1360,1361],{"class":184,"line":339},[182,1362,1363],{"class":283},"# 4. 確認沒問題後，移除舊工具\n",[182,1365,1366,1368,1371,1374,1377],{"class":184,"line":561},[182,1367,189],{"class":188},[182,1369,1370],{"class":192}," remove",[182,1372,1373],{"class":192}," eslint",[182,1375,1376],{"class":192}," prettier",[182,1378,1379],{"class":192}," @antfu\u002Feslint-config\n",[182,1381,1382],{"class":184,"line":581},[182,1383,1384],{"class":283},"# 以及其他 eslint-* 和 prettier-* 套件\n",[182,1386,1387],{"class":184,"line":601},[182,1388,297],{"emptyLinePlaceholder":296},[182,1390,1391],{"class":184,"line":643},[182,1392,1393],{"class":283},"# 5. 刪除舊設定檔\n",[182,1395,1396,1399,1402],{"class":184,"line":662},[182,1397,1398],{"class":188},"rm",[182,1400,1401],{"class":192}," eslint.config.js",[182,1403,1404],{"class":192}," .prettierrc\n",[123,1406,1408],{"id":1407},"遷移後的-packagejson","遷移後的 package.json",[130,1410,1412],{"className":360,"code":1411,"language":362,"meta":138,"style":138},"{\n  \"scripts\": {\n    \"lint\": \"oxlint\",\n    \"lint:fix\": \"oxlint --fix\",\n    \"fmt\": \"oxfmt --write\",\n    \"fmt:check\": \"oxfmt --check\",\n    \"check\": \"pnpm fmt && pnpm lint\"\n  },\n  \"devDependencies\": {\n    \"oxfmt\": \"^0.26.0\",\n    \"oxlint\": \"^1.41.0\"\n  }\n}\n",[30,1413,1414,1418,1431,1451,1470,1489,1509,1527,1531,1544,1564,1581,1585],{"__ignoreMap":138},[182,1415,1416],{"class":184,"line":185},[182,1417,227],{"class":369},[182,1419,1420,1422,1425,1427,1429],{"class":184,"line":230},[182,1421,375],{"class":374},[182,1423,1424],{"class":378},"scripts",[182,1426,382],{"class":374},[182,1428,385],{"class":369},[182,1430,454],{"class":369},[182,1432,1433,1435,1438,1440,1442,1444,1447,1449],{"class":184,"line":216},[182,1434,459],{"class":374},[182,1436,1437],{"class":462},"lint",[182,1439,382],{"class":374},[182,1441,385],{"class":369},[182,1443,389],{"class":388},[182,1445,1446],{"class":192},"oxlint",[182,1448,382],{"class":388},[182,1450,397],{"class":369},[182,1452,1453,1455,1458,1460,1462,1464,1466,1468],{"class":184,"line":217},[182,1454,459],{"class":374},[182,1456,1457],{"class":462},"lint:fix",[182,1459,382],{"class":374},[182,1461,385],{"class":369},[182,1463,389],{"class":388},[182,1465,1225],{"class":192},[182,1467,382],{"class":388},[182,1469,397],{"class":369},[182,1471,1472,1474,1477,1479,1481,1483,1485,1487],{"class":184,"line":218},[182,1473,459],{"class":374},[182,1475,1476],{"class":462},"fmt",[182,1478,382],{"class":374},[182,1480,385],{"class":369},[182,1482,389],{"class":388},[182,1484,1234],{"class":192},[182,1486,382],{"class":388},[182,1488,397],{"class":369},[182,1490,1491,1493,1496,1498,1500,1502,1505,1507],{"class":184,"line":219},[182,1492,459],{"class":374},[182,1494,1495],{"class":462},"fmt:check",[182,1497,382],{"class":374},[182,1499,385],{"class":369},[182,1501,389],{"class":388},[182,1503,1504],{"class":192},"oxfmt --check",[182,1506,382],{"class":388},[182,1508,397],{"class":369},[182,1510,1511,1513,1516,1518,1520,1522,1525],{"class":184,"line":261},[182,1512,459],{"class":374},[182,1514,1515],{"class":462},"check",[182,1517,382],{"class":374},[182,1519,385],{"class":369},[182,1521,389],{"class":388},[182,1523,1524],{"class":192},"pnpm fmt && pnpm lint",[182,1526,659],{"class":388},[182,1528,1529],{"class":184,"line":267},[182,1530,506],{"class":369},[182,1532,1533,1535,1538,1540,1542],{"class":184,"line":328},[182,1534,375],{"class":374},[182,1536,1537],{"class":378},"devDependencies",[182,1539,382],{"class":374},[182,1541,385],{"class":369},[182,1543,454],{"class":369},[182,1545,1546,1548,1551,1553,1555,1557,1560,1562],{"class":184,"line":333},[182,1547,459],{"class":374},[182,1549,1550],{"class":462},"oxfmt",[182,1552,382],{"class":374},[182,1554,385],{"class":369},[182,1556,389],{"class":388},[182,1558,1559],{"class":192},"^0.26.0",[182,1561,382],{"class":388},[182,1563,397],{"class":369},[182,1565,1566,1568,1570,1572,1574,1576,1579],{"class":184,"line":339},[182,1567,459],{"class":374},[182,1569,1446],{"class":462},[182,1571,382],{"class":374},[182,1573,385],{"class":369},[182,1575,389],{"class":388},[182,1577,1578],{"class":192},"^1.41.0",[182,1580,659],{"class":388},[182,1582,1583],{"class":184,"line":561},[182,1584,264],{"class":369},[182,1586,1587],{"class":184,"line":581},[182,1588,270],{"class":369},[52,1590],{},[15,1592,1593],{"id":1593},"整合自動化流程",[19,1595,1596],{},"建議設定一個完整的檢查指令：",[130,1598,1600],{"className":360,"code":1599,"language":362,"meta":138,"style":138},"{\n  \"scripts\": {\n    \"check\": \"pnpm fmt && pnpm lint && pnpm typecheck && pnpm test\",\n    \"fmt\": \"oxfmt --write\",\n    \"lint\": \"oxlint --deny-warnings\",\n    \"typecheck\": \"vue-tsc --noEmit\",\n    \"test\": \"vitest run\"\n  }\n}\n",[30,1601,1602,1606,1618,1637,1655,1674,1694,1712,1716],{"__ignoreMap":138},[182,1603,1604],{"class":184,"line":185},[182,1605,227],{"class":369},[182,1607,1608,1610,1612,1614,1616],{"class":184,"line":230},[182,1609,375],{"class":374},[182,1611,1424],{"class":378},[182,1613,382],{"class":374},[182,1615,385],{"class":369},[182,1617,454],{"class":369},[182,1619,1620,1622,1624,1626,1628,1630,1633,1635],{"class":184,"line":216},[182,1621,459],{"class":374},[182,1623,1515],{"class":462},[182,1625,382],{"class":374},[182,1627,385],{"class":369},[182,1629,389],{"class":388},[182,1631,1632],{"class":192},"pnpm fmt && pnpm lint && pnpm typecheck && pnpm test",[182,1634,382],{"class":388},[182,1636,397],{"class":369},[182,1638,1639,1641,1643,1645,1647,1649,1651,1653],{"class":184,"line":217},[182,1640,459],{"class":374},[182,1642,1476],{"class":462},[182,1644,382],{"class":374},[182,1646,385],{"class":369},[182,1648,389],{"class":388},[182,1650,1234],{"class":192},[182,1652,382],{"class":388},[182,1654,397],{"class":369},[182,1656,1657,1659,1661,1663,1665,1667,1670,1672],{"class":184,"line":218},[182,1658,459],{"class":374},[182,1660,1437],{"class":462},[182,1662,382],{"class":374},[182,1664,385],{"class":369},[182,1666,389],{"class":388},[182,1668,1669],{"class":192},"oxlint --deny-warnings",[182,1671,382],{"class":388},[182,1673,397],{"class":369},[182,1675,1676,1678,1681,1683,1685,1687,1690,1692],{"class":184,"line":219},[182,1677,459],{"class":374},[182,1679,1680],{"class":462},"typecheck",[182,1682,382],{"class":374},[182,1684,385],{"class":369},[182,1686,389],{"class":388},[182,1688,1689],{"class":192},"vue-tsc --noEmit",[182,1691,382],{"class":388},[182,1693,397],{"class":369},[182,1695,1696,1698,1701,1703,1705,1707,1710],{"class":184,"line":261},[182,1697,459],{"class":374},[182,1699,1700],{"class":462},"test",[182,1702,382],{"class":374},[182,1704,385],{"class":369},[182,1706,389],{"class":388},[182,1708,1709],{"class":192},"vitest run",[182,1711,659],{"class":388},[182,1713,1714],{"class":184,"line":267},[182,1715,264],{"class":369},[182,1717,1718],{"class":184,"line":328},[182,1719,270],{"class":369},[123,1721,1722],{"id":1722},"流程說明",[130,1724,1727],{"className":1725,"code":1726,"language":135},[133],"pnpm check\n    │\n    ▼\n┌─────────────┐\n│ 1. fmt      │ → Oxfmt：自動格式化程式碼\n├─────────────┤\n│ 2. lint     │ → Oxlint：檢查程式碼品質（--deny-warnings 將警告視為錯誤）\n├─────────────┤\n│ 3. typecheck│ → TypeScript：型別檢查\n├─────────────┤\n│ 4. test     │ → Vitest：執行測試\n└─────────────┘\n    │\n    ▼\n全部通過 → 可以提交\n任一失敗 → 修復後重試\n",[30,1728,1726],{"__ignoreMap":138},[52,1730],{},[15,1732,1733],{"id":1733},"常見問題",[123,1735,1737],{"id":1736},"q-oxlint-支援所有-eslint-規則嗎","Q: Oxlint 支援所有 ESLint 規則嗎？",[19,1739,1740,1741,1746],{},"不完全支援。Oxlint 目前實作了約 500 條規則，涵蓋了最常用的規則，但一些冷門或特定框架的規則可能還沒支援。可以查看 ",[115,1742,1745],{"href":1743,"rel":1744},"https:\u002F\u002Foxc.rs\u002Fdocs\u002Fguide\u002Fusage\u002Flinter\u002Frules.html",[119],"Oxlint Rules"," 確認支援情況。",[123,1748,1750],{"id":1749},"q-可以同時使用-oxlint-和-eslint-嗎","Q: 可以同時使用 Oxlint 和 ESLint 嗎？",[19,1752,1753],{},"可以。你可以讓 Oxlint 處理它支援的規則，ESLint 處理剩下的。但這樣會失去速度優勢，建議最終完全遷移到 Oxlint。",[123,1755,1757],{"id":1756},"q-oxfmt-的格式化風格可以自訂嗎","Q: Oxfmt 的格式化風格可以自訂嗎？",[19,1759,1760],{},"目前不行。Oxfmt 採用固定風格，這是刻意的設計決策。如果需要自訂格式化風格，目前只能繼續使用 Prettier 或 dprint。",[123,1762,1764],{"id":1763},"q-vue-sfc-支援如何","Q: Vue SFC 支援如何？",[19,1766,1767,1768,1771,1772,1775],{},"Oxlint 支援 Vue SFC 檔案的 ",[30,1769,1770],{},"\u003Cscript>"," 和 ",[30,1773,1774],{},"\u003Cscript setup>"," 區塊。Oxfmt 也支援 Vue 檔案的格式化。",[123,1777,1779],{"id":1778},"q-需要額外設定-typescript-嗎","Q: 需要額外設定 TypeScript 嗎？",[19,1781,1782,1783,1785,1786,1771,1789,1792],{},"不需要。只要在 plugins 中啟用 ",[30,1784,416],{},"，Oxlint 就會自動處理 ",[30,1787,1788],{},".ts",[30,1790,1791],{},".tsx"," 檔案，不需要額外的 TypeScript 設定。",[52,1794],{},[15,1796,1797],{"id":1797},"最佳實踐",[935,1799,1800,1809,1815,1820,1826],{},[26,1801,1802,1808],{},[47,1803,1804,1805],{},"善用 ",[30,1806,1807],{},"--deny-warnings","：在 CI 中使用這個參數，確保所有警告都被處理",[26,1810,1811,1814],{},[47,1812,1813],{},"搭配 Git Hooks","：在提交前自動執行檢查，避免問題程式碼進入 repository",[26,1816,1817,1819],{},[47,1818,1276],{},"：如果現有專案已經使用 ESLint，不要一次全部切換，先並行運作一段時間",[26,1821,1822,1825],{},[47,1823,1824],{},"定期更新","：Oxlint 和 Oxfmt 還在快速發展中，定期更新可以獲得更多規則和更好的效能",[26,1827,1828,1831],{},[47,1829,1830],{},"統一團隊工具","：確保團隊所有成員使用相同版本的工具，避免格式化差異",[52,1833],{},[15,1835,1836],{"id":1836},"總結",[59,1838,1839,1852],{},[62,1840,1841],{},[65,1842,1843,1846,1849],{},[68,1844,1845],{},"項目",[68,1847,1848],{},"ESLint + Prettier",[68,1850,1851],{},"Oxlint + Oxfmt",[81,1853,1854,1865,1876,1887,1898],{},[65,1855,1856,1859,1862],{},[86,1857,1858],{},"速度",[86,1860,1861],{},"慢",[86,1863,1864],{},"快 50-100 倍",[65,1866,1867,1870,1873],{},[86,1868,1869],{},"配置複雜度",[86,1871,1872],{},"高",[86,1874,1875],{},"低",[65,1877,1878,1881,1884],{},[86,1879,1880],{},"規則數量",[86,1882,1883],{},"多",[86,1885,1886],{},"夠用",[65,1888,1889,1892,1895],{},[86,1890,1891],{},"生態系",[86,1893,1894],{},"成熟",[86,1896,1897],{},"發展中",[65,1899,1900,1903,1906],{},[86,1901,1902],{},"學習曲線",[86,1904,1905],{},"陡峭",[86,1907,1908],{},"平緩",[19,1910,1911],{},"如果你的專案符合以下條件，強烈建議遷移：",[23,1913,1914,1917,1920,1923],{},[26,1915,1916],{},"專案規模中等以上（100+ 檔案）",[26,1918,1919],{},"CI\u002FCD 時間是瓶頸",[26,1921,1922],{},"團隊對格式化風格沒有特殊要求",[26,1924,1925],{},"願意接受部分規則暫時不可用",[19,1927,1928],{},"Oxlint 和 Oxfmt 代表了前端工具的未來方向：用 Rust 重寫效能敏感的工具，讓開發體驗更加流暢。",[52,1930],{},[15,1932,1933],{"id":1933},"延伸閱讀",[23,1935,1936,1942,1948],{},[26,1937,1938],{},[115,1939,1941],{"href":117,"rel":1940},[119],"Oxc 官方文件",[26,1943,1944],{},[115,1945,1947],{"href":1743,"rel":1946},[119],"Oxlint 規則列表",[26,1949,1950],{},[115,1951,1954],{"href":1952,"rel":1953},"https:\u002F\u002Foxc.rs\u002Fdocs\u002Fguide\u002Fusage\u002Flinter\u002Fmigration.html",[119],"從 ESLint 遷移指南",[1956,1957,1958],"style",{},"html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":138,"searchDepth":216,"depth":216,"links":1960},[1961,1962,1965,1966,1967,1971,1972,1976,1981,1986,1989,1996,1997,1998],{"id":17,"depth":230,"text":17},{"id":56,"depth":230,"text":57,"children":1963},[1964],{"id":125,"depth":216,"text":125},{"id":143,"depth":230,"text":143},{"id":172,"depth":230,"text":173},{"id":349,"depth":230,"text":350,"children":1968},[1969,1970],{"id":723,"depth":216,"text":723},{"id":785,"depth":216,"text":786},{"id":929,"depth":230,"text":930},{"id":962,"depth":230,"text":963,"children":1973},[1974,1975],{"id":966,"depth":216,"text":966},{"id":984,"depth":216,"text":984},{"id":1081,"depth":230,"text":1082,"children":1977},[1978,1979,1980],{"id":1088,"depth":216,"text":1089},{"id":1121,"depth":216,"text":1122},{"id":1159,"depth":216,"text":1160},{"id":1267,"depth":230,"text":1268,"children":1982},[1983,1984,1985],{"id":1271,"depth":216,"text":1271},{"id":1297,"depth":216,"text":1297},{"id":1407,"depth":216,"text":1408},{"id":1593,"depth":230,"text":1593,"children":1987},[1988],{"id":1722,"depth":216,"text":1722},{"id":1733,"depth":230,"text":1733,"children":1990},[1991,1992,1993,1994,1995],{"id":1736,"depth":216,"text":1737},{"id":1749,"depth":216,"text":1750},{"id":1756,"depth":216,"text":1757},{"id":1763,"depth":216,"text":1764},{"id":1778,"depth":216,"text":1779},{"id":1797,"depth":230,"text":1797},{"id":1836,"depth":230,"text":1836},{"id":1933,"depth":230,"text":1933},"Node.js","2026-01-23","使用 Oxlint 和 Oxfmt 取代 ESLint 和 Prettier，享受 50-100 倍的速度提升，同時保持程式碼品質。",false,"md",null,{},"\u002Fblog\u002Fnodejs\u002Foxlint",{"title":5,"description":2001},"blog\u002Fnodejs\u002Foxlint\u002Findex",[88,102,1999,2010,2011,94],"Linter","Formatter","d9H7WAtnKeEEeREXqg1Mcvb36BBKCCw9MxPmWs-LUoU",1780512499430]