[{"data":1,"prerenderedAt":1278},["ShallowReactive",2],{"doc-page:\u002Fdocs\u002Fnodejs-ecosystem":3},{"doc":4,"prev":1239,"next":1247,"resolvedType":8,"readingMinutes":262,"audience":1252,"checklist":1256,"related":1260},{"path":5,"title":6,"description":7,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13,"body":14},"\u002Fdocs\u002Fnodejs-ecosystem","Node.js 生态工具链","Node.js 安装与版本管理（fnm）、pnpm 包管理器、Bun 运行时完整指南","article",null,"programming-languages","编程语言","2026-01-05","i-carbon-application",{"type":15,"value":16,"toc":1206},"minimark",[17,21,25,29,58,61,73,76,80,84,95,113,116,141,144,148,156,165,172,212,215,282,287,291,299,314,317,406,409,434,440,451,455,505,508,512,520,526,529,589,592,682,686,764,768,804,840,846,849,866,870,877,880,883,901,903,915,918,985,989,1003,1007,1010,1036,1039,1042,1063,1066,1085,1088,1091,1094,1098,1101,1105,1122,1125,1202],[18,19,6],"h1",{"id":20},"nodejs-生态工具链",[22,23,24],"p",{},"Node 生态真正让人容易混乱的地方，不是工具不够，而是选择太多：Node 版本管理器、包管理器、运行时、镜像、锁文件、workspace 都可能混在一起。更稳的做法是先明确“谁负责版本、谁负责装包、谁负责运行”。",[26,27,28],"h2",{"id":28},"推荐理解方式",[30,31,32,40,46,52],"ul",{},[33,34,35,39],"li",{},[36,37,38],"strong",{},"Node.js","：运行时基础",[33,41,42,45],{},[36,43,44],{},"fnm \u002F nvm \u002F Volta \u002F mise","：版本管理",[33,47,48,51],{},[36,49,50],{},"npm \u002F pnpm \u002F yarn \u002F bun","：包管理与脚本入口",[33,53,54,57],{},[36,55,56],{},"Bun","：既能做运行时，也能做包管理器",[26,59,60],{"id":60},"推荐选择顺序",[62,63,64,67,70],"ol",{},[33,65,66],{},"先决定 Node 版本管理器",[33,68,69],{},"再决定包管理器",[33,71,72],{},"最后再决定项目是否真的要用 Bun 作为运行时",[22,74,75],{},"如果一个团队没有统一这三件事，后面几乎一定会遇到环境漂移问题。",[26,77,79],{"id":78},"nodejs-安装","Node.js 安装",[81,82,83],"h3",{"id":83},"直接安装",[22,85,86,87,94],{},"从 ",[88,89,93],"a",{"href":90,"rel":91},"https:\u002F\u002Fnodejs.org",[92],"nofollow","nodejs.org"," 下载 LTS 版本，或使用 winget：",[96,97,102],"pre",{"className":98,"code":99,"language":100,"meta":101,"style":101},"language-powershell shiki shiki-themes github-light github-dark","winget install OpenJS.NodeJS.LTS\n","powershell","",[103,104,105],"code",{"__ignoreMap":101},[106,107,110],"span",{"class":108,"line":109},"line",1,[106,111,99],{"class":112},"sVt8B",[22,114,115],{},"验证：",[96,117,121],{"className":118,"code":119,"language":120,"meta":101,"style":101},"language-bash shiki shiki-themes github-light github-dark","node --version\nnpm --version\n","bash",[103,122,123,133],{"__ignoreMap":101},[106,124,125,129],{"class":108,"line":109},[106,126,128],{"class":127},"sScJk","node",[106,130,132],{"class":131},"sj4cs"," --version\n",[106,134,136,139],{"class":108,"line":135},2,[106,137,138],{"class":127},"npm",[106,140,132],{"class":131},[22,142,143],{},"对新机器来说，先把 LTS 跑稳通常比追最新版本更重要。",[81,145,147],{"id":146},"使用-fnm-管理多版本推荐","使用 fnm 管理多版本（推荐）",[22,149,150,155],{},[88,151,154],{"href":152,"rel":153},"https:\u002F\u002Fgithub.com\u002FSchniz\u002Ffnm",[92],"fnm"," 是一个用 Rust 编写的快速 Node.js 版本管理器。",[96,157,159],{"className":98,"code":158,"language":100,"meta":101,"style":101},"winget install Schniz.fnm\n",[103,160,161],{"__ignoreMap":101},[106,162,163],{"class":108,"line":109},[106,164,158],{"class":112},[22,166,167,168,171],{},"在 ",[103,169,170],{},"$PROFILE"," 中添加：",[96,173,175],{"className":98,"code":174,"language":100,"meta":101,"style":101},"fnm env --use-on-cd --shell powershell | Out-String | Invoke-Expression\n",[103,176,177],{"__ignoreMap":101},[106,178,179,182,186,189,192,195,197,200,203,206,209],{"class":108,"line":109},[106,180,181],{"class":112},"fnm env ",[106,183,185],{"class":184},"szBVR","--",[106,187,188],{"class":131},"use-on",[106,190,191],{"class":184},"-",[106,193,194],{"class":112},"cd ",[106,196,185],{"class":184},[106,198,199],{"class":112},"shell powershell ",[106,201,202],{"class":184},"|",[106,204,205],{"class":131}," Out-String",[106,207,208],{"class":184}," |",[106,210,211],{"class":131}," Invoke-Expression\n",[22,213,214],{},"常用命令：",[96,216,218],{"className":118,"code":217,"language":120,"meta":101,"style":101},"fnm install 22          # 安装指定版本\nfnm use 22              # 切换版本\nfnm default 22          # 设置默认版本\nfnm list                # 查看已安装版本\nfnm list-remote         # 查看可用版本\n",[103,219,220,235,247,260,271],{"__ignoreMap":101},[106,221,222,224,228,231],{"class":108,"line":109},[106,223,154],{"class":127},[106,225,227],{"class":226},"sZZnC"," install",[106,229,230],{"class":131}," 22",[106,232,234],{"class":233},"sJ8bj","          # 安装指定版本\n",[106,236,237,239,242,244],{"class":108,"line":135},[106,238,154],{"class":127},[106,240,241],{"class":226}," use",[106,243,230],{"class":131},[106,245,246],{"class":233},"              # 切换版本\n",[106,248,250,252,255,257],{"class":108,"line":249},3,[106,251,154],{"class":127},[106,253,254],{"class":226}," default",[106,256,230],{"class":131},[106,258,259],{"class":233},"          # 设置默认版本\n",[106,261,263,265,268],{"class":108,"line":262},4,[106,264,154],{"class":127},[106,266,267],{"class":226}," list",[106,269,270],{"class":233},"                # 查看已安装版本\n",[106,272,274,276,279],{"class":108,"line":273},5,[106,275,154],{"class":127},[106,277,278],{"class":226}," list-remote",[106,280,281],{"class":233},"         # 查看可用版本\n",[22,283,284,286],{},[103,285,154],{}," 的优势是轻和快，适合个人开发机或需要频繁切换版本的场景。",[81,288,290],{"id":289},"使用-nvm-windows","使用 nvm-windows",[22,292,293,298],{},[88,294,297],{"href":295,"rel":296},"https:\u002F\u002Fgithub.com\u002Fcoreybutler\u002Fnvm-windows",[92],"nvm-windows"," 是 Windows 上经典的 Node.js 版本管理器。",[96,300,302],{"className":98,"code":301,"language":100,"meta":101,"style":101},"# 安装\nwinget install CoreyButler.NVMforWindows\n",[103,303,304,309],{"__ignoreMap":101},[106,305,306],{"class":108,"line":109},[106,307,308],{"class":233},"# 安装\n",[106,310,311],{"class":108,"line":135},[106,312,313],{"class":112},"winget install CoreyButler.NVMforWindows\n",[22,315,316],{},"重启终端后使用：",[96,318,320],{"className":118,"code":319,"language":120,"meta":101,"style":101},"nvm install 22             # 安装指定版本\nnvm install lts            # 安装最新 LTS\nnvm use 22                 # 切换版本\nnvm list                   # 查看已安装版本\nnvm list available         # 查看可用版本\nnvm alias default 22       # 设置默认版本\nnvm uninstall 18           # 卸载指定版本\n",[103,321,322,334,346,357,366,377,392],{"__ignoreMap":101},[106,323,324,327,329,331],{"class":108,"line":109},[106,325,326],{"class":127},"nvm",[106,328,227],{"class":226},[106,330,230],{"class":131},[106,332,333],{"class":233},"             # 安装指定版本\n",[106,335,336,338,340,343],{"class":108,"line":135},[106,337,326],{"class":127},[106,339,227],{"class":226},[106,341,342],{"class":226}," lts",[106,344,345],{"class":233},"            # 安装最新 LTS\n",[106,347,348,350,352,354],{"class":108,"line":249},[106,349,326],{"class":127},[106,351,241],{"class":226},[106,353,230],{"class":131},[106,355,356],{"class":233},"                 # 切换版本\n",[106,358,359,361,363],{"class":108,"line":262},[106,360,326],{"class":127},[106,362,267],{"class":226},[106,364,365],{"class":233},"                   # 查看已安装版本\n",[106,367,368,370,372,375],{"class":108,"line":273},[106,369,326],{"class":127},[106,371,267],{"class":226},[106,373,374],{"class":226}," available",[106,376,281],{"class":233},[106,378,380,382,385,387,389],{"class":108,"line":379},6,[106,381,326],{"class":127},[106,383,384],{"class":226}," alias",[106,386,254],{"class":226},[106,388,230],{"class":131},[106,390,391],{"class":233},"       # 设置默认版本\n",[106,393,395,397,400,403],{"class":108,"line":394},7,[106,396,326],{"class":127},[106,398,399],{"class":226}," uninstall",[106,401,402],{"class":131}," 18",[106,404,405],{"class":233},"           # 卸载指定版本\n",[22,407,408],{},"配置镜像加速：",[96,410,412],{"className":118,"code":411,"language":120,"meta":101,"style":101},"nvm node_mirror https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode\u002F\nnvm npm_mirror https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnpm\u002F\n",[103,413,414,424],{"__ignoreMap":101},[106,415,416,418,421],{"class":108,"line":109},[106,417,326],{"class":127},[106,419,420],{"class":226}," node_mirror",[106,422,423],{"class":226}," https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode\u002F\n",[106,425,426,428,431],{"class":108,"line":135},[106,427,326],{"class":127},[106,429,430],{"class":226}," npm_mirror",[106,432,433],{"class":226}," https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnpm\u002F\n",[435,436,437],"blockquote",{},[22,438,439],{},"fnm 和 nvm-windows 选一个即可。fnm 更快（Rust 编写），nvm-windows 更成熟、社区更大。",[22,441,442,443,446,447,450],{},"如果你主要在仓库级固定版本，通常更推荐进一步看 ",[103,444,445],{},"Volta"," 或 ",[103,448,449],{},"mise","。",[81,452,454],{"id":453},"配置-npm-镜像","配置 npm 镜像",[96,456,458],{"className":118,"code":457,"language":120,"meta":101,"style":101},"# 淘宝镜像\nnpm config set registry https:\u002F\u002Fregistry.npmmirror.com\n\n# 恢复官方源\nnpm config set registry https:\u002F\u002Fregistry.npmjs.org\n",[103,459,460,465,481,487,492],{"__ignoreMap":101},[106,461,462],{"class":108,"line":109},[106,463,464],{"class":233},"# 淘宝镜像\n",[106,466,467,469,472,475,478],{"class":108,"line":135},[106,468,138],{"class":127},[106,470,471],{"class":226}," config",[106,473,474],{"class":226}," set",[106,476,477],{"class":226}," registry",[106,479,480],{"class":226}," https:\u002F\u002Fregistry.npmmirror.com\n",[106,482,483],{"class":108,"line":249},[106,484,486],{"emptyLinePlaceholder":485},true,"\n",[106,488,489],{"class":108,"line":262},[106,490,491],{"class":233},"# 恢复官方源\n",[106,493,494,496,498,500,502],{"class":108,"line":273},[106,495,138],{"class":127},[106,497,471],{"class":226},[106,499,474],{"class":226},[106,501,477],{"class":226},[106,503,504],{"class":226}," https:\u002F\u002Fregistry.npmjs.org\n",[22,506,507],{},"镜像可以提升安装体验，但遇到奇怪依赖问题时，也建议先切回官方源做一次验证。",[26,509,511],{"id":510},"pnpm-包管理器","pnpm 包管理器",[22,513,514,519],{},[88,515,518],{"href":516,"rel":517},"https:\u002F\u002Fpnpm.io",[92],"pnpm"," 通过硬链接和内容寻址存储，节省磁盘空间并加速安装。",[22,521,522,523,525],{},"对多包仓库、前端项目和依赖量大的项目来说，",[103,524,518],{}," 往往是最值得优先掌握的包管理器。",[81,527,528],{"id":528},"安装",[96,530,532],{"className":98,"code":531,"language":100,"meta":101,"style":101},"# 通过 npm\nnpm install -g pnpm\n\n# 通过 winget\nwinget install pnpm.pnpm\n\n# 通过 corepack（Node.js 16.13+）\ncorepack enable\ncorepack prepare pnpm@latest --activate\n",[103,533,534,539,549,553,558,563,567,572,578],{"__ignoreMap":101},[106,535,536],{"class":108,"line":109},[106,537,538],{"class":233},"# 通过 npm\n",[106,540,541,544,546],{"class":108,"line":135},[106,542,543],{"class":112},"npm install ",[106,545,191],{"class":184},[106,547,548],{"class":112},"g pnpm\n",[106,550,551],{"class":108,"line":249},[106,552,486],{"emptyLinePlaceholder":485},[106,554,555],{"class":108,"line":262},[106,556,557],{"class":233},"# 通过 winget\n",[106,559,560],{"class":108,"line":273},[106,561,562],{"class":112},"winget install pnpm.pnpm\n",[106,564,565],{"class":108,"line":379},[106,566,486],{"emptyLinePlaceholder":485},[106,568,569],{"class":108,"line":394},[106,570,571],{"class":233},"# 通过 corepack（Node.js 16.13+）\n",[106,573,575],{"class":108,"line":574},8,[106,576,577],{"class":112},"corepack enable\n",[106,579,581,584,586],{"class":108,"line":580},9,[106,582,583],{"class":112},"corepack prepare pnpm@latest ",[106,585,185],{"class":184},[106,587,588],{"class":112},"activate\n",[81,590,591],{"id":591},"常用命令",[96,593,595],{"className":118,"code":594,"language":120,"meta":101,"style":101},"pnpm install            # 安装依赖\npnpm add vue            # 添加依赖\npnpm add -D typescript  # 添加开发依赖\npnpm remove vue         # 移除依赖\npnpm dev                # 运行脚本（简写）\npnpm update --latest    # 更新所有依赖到最新\npnpm dlx create-vite    # 等同于 npx\n",[103,596,597,606,619,634,646,656,669],{"__ignoreMap":101},[106,598,599,601,603],{"class":108,"line":109},[106,600,518],{"class":127},[106,602,227],{"class":226},[106,604,605],{"class":233},"            # 安装依赖\n",[106,607,608,610,613,616],{"class":108,"line":135},[106,609,518],{"class":127},[106,611,612],{"class":226}," add",[106,614,615],{"class":226}," vue",[106,617,618],{"class":233},"            # 添加依赖\n",[106,620,621,623,625,628,631],{"class":108,"line":249},[106,622,518],{"class":127},[106,624,612],{"class":226},[106,626,627],{"class":131}," -D",[106,629,630],{"class":226}," typescript",[106,632,633],{"class":233},"  # 添加开发依赖\n",[106,635,636,638,641,643],{"class":108,"line":262},[106,637,518],{"class":127},[106,639,640],{"class":226}," remove",[106,642,615],{"class":226},[106,644,645],{"class":233},"         # 移除依赖\n",[106,647,648,650,653],{"class":108,"line":273},[106,649,518],{"class":127},[106,651,652],{"class":226}," dev",[106,654,655],{"class":233},"                # 运行脚本（简写）\n",[106,657,658,660,663,666],{"class":108,"line":379},[106,659,518],{"class":127},[106,661,662],{"class":226}," update",[106,664,665],{"class":131}," --latest",[106,667,668],{"class":233},"    # 更新所有依赖到最新\n",[106,670,671,673,676,679],{"class":108,"line":394},[106,672,518],{"class":127},[106,674,675],{"class":226}," dlx",[106,677,678],{"class":226}," create-vite",[106,680,681],{"class":233},"    # 等同于 npx\n",[81,683,685],{"id":684},"与-npm-命令对照","与 npm 命令对照",[687,688,689,700],"table",{},[690,691,692],"thead",{},[693,694,695,698],"tr",{},[696,697,138],"th",{},[696,699,518],{},[701,702,703,716,728,740,752],"tbody",{},[693,704,705,711],{},[706,707,708],"td",{},[103,709,710],{},"npm install",[706,712,713],{},[103,714,715],{},"pnpm install",[693,717,718,723],{},[706,719,720],{},[103,721,722],{},"npm install pkg",[706,724,725],{},[103,726,727],{},"pnpm add pkg",[693,729,730,735],{},[706,731,732],{},[103,733,734],{},"npm uninstall pkg",[706,736,737],{},[103,738,739],{},"pnpm remove pkg",[693,741,742,747],{},[706,743,744],{},[103,745,746],{},"npm run script",[706,748,749],{},[103,750,751],{},"pnpm script",[693,753,754,759],{},[706,755,756],{},[103,757,758],{},"npx command",[706,760,761],{},[103,762,763],{},"pnpm dlx command",[81,765,767],{"id":766},"workspacemonorepo","Workspace（Monorepo）",[96,769,773],{"className":770,"code":771,"language":772,"meta":101,"style":101},"language-yaml shiki shiki-themes github-light github-dark","# pnpm-workspace.yaml\npackages:\n  - \"packages\u002F*\"\n  - \"apps\u002F*\"\n","yaml",[103,774,775,780,789,797],{"__ignoreMap":101},[106,776,777],{"class":108,"line":109},[106,778,779],{"class":233},"# pnpm-workspace.yaml\n",[106,781,782,786],{"class":108,"line":135},[106,783,785],{"class":784},"s9eBZ","packages",[106,787,788],{"class":112},":\n",[106,790,791,794],{"class":108,"line":249},[106,792,793],{"class":112},"  - ",[106,795,796],{"class":226},"\"packages\u002F*\"\n",[106,798,799,801],{"class":108,"line":262},[106,800,793],{"class":112},[106,802,803],{"class":226},"\"apps\u002F*\"\n",[96,805,807],{"className":118,"code":806,"language":120,"meta":101,"style":101},"pnpm --filter @my\u002Fapp dev   # 在指定包中运行\npnpm -r run build            # 在所有包中运行\n",[103,808,809,824],{"__ignoreMap":101},[106,810,811,813,816,819,821],{"class":108,"line":109},[106,812,518],{"class":127},[106,814,815],{"class":131}," --filter",[106,817,818],{"class":226}," @my\u002Fapp",[106,820,652],{"class":226},[106,822,823],{"class":233},"   # 在指定包中运行\n",[106,825,826,828,831,834,837],{"class":108,"line":135},[106,827,518],{"class":127},[106,829,830],{"class":131}," -r",[106,832,833],{"class":226}," run",[106,835,836],{"class":226}," build",[106,838,839],{"class":233},"            # 在所有包中运行\n",[22,841,842,845],{},[103,843,844],{},"workspace"," 是 monorepo 的核心能力之一，但前提是团队已经能稳定维护单仓库结构。",[81,847,848],{"id":848},"配置镜像",[96,850,852],{"className":118,"code":851,"language":120,"meta":101,"style":101},"pnpm config set registry https:\u002F\u002Fregistry.npmmirror.com\n",[103,853,854],{"__ignoreMap":101},[106,855,856,858,860,862,864],{"class":108,"line":109},[106,857,518],{"class":127},[106,859,471],{"class":226},[106,861,474],{"class":226},[106,863,477],{"class":226},[106,865,480],{"class":226},[26,867,869],{"id":868},"bun-运行时","Bun 运行时",[22,871,872,876],{},[88,873,56],{"href":874,"rel":875},"https:\u002F\u002Fbun.sh",[92]," 是极速的 JavaScript 运行时，内置打包器、测试运行器和包管理器。",[22,878,879],{},"它很强，但不代表所有项目都该直接切过去。对已有 Node 项目，先把 Bun 当作包管理器或辅助工具试用，通常更稳。",[81,881,528],{"id":882},"安装-1",[96,884,886],{"className":98,"code":885,"language":100,"meta":101,"style":101},"powershell -c \"irm bun.sh\u002Finstall.ps1 | iex\"\n",[103,887,888],{"__ignoreMap":101},[106,889,890,893,895,898],{"class":108,"line":109},[106,891,892],{"class":112},"powershell ",[106,894,191],{"class":184},[106,896,897],{"class":112},"c ",[106,899,900],{"class":226},"\"irm bun.sh\u002Finstall.ps1 | iex\"\n",[22,902,115],{},[96,904,906],{"className":118,"code":905,"language":120,"meta":101,"style":101},"bun --version\n",[103,907,908],{"__ignoreMap":101},[106,909,910,913],{"class":108,"line":109},[106,911,912],{"class":127},"bun",[106,914,132],{"class":131},[81,916,591],{"id":917},"常用命令-1",[96,919,921],{"className":118,"code":920,"language":120,"meta":101,"style":101},"bun init               # 初始化项目\nbun install            # 安装依赖（比 npm 快很多）\nbun add vue            # 添加依赖\nbun run dev            # 运行脚本\nbun test               # 运行测试\nbun build .\u002Findex.ts   # 打包\n",[103,922,923,933,942,952,963,973],{"__ignoreMap":101},[106,924,925,927,930],{"class":108,"line":109},[106,926,912],{"class":127},[106,928,929],{"class":226}," init",[106,931,932],{"class":233},"               # 初始化项目\n",[106,934,935,937,939],{"class":108,"line":135},[106,936,912],{"class":127},[106,938,227],{"class":226},[106,940,941],{"class":233},"            # 安装依赖（比 npm 快很多）\n",[106,943,944,946,948,950],{"class":108,"line":249},[106,945,912],{"class":127},[106,947,612],{"class":226},[106,949,615],{"class":226},[106,951,618],{"class":233},[106,953,954,956,958,960],{"class":108,"line":262},[106,955,912],{"class":127},[106,957,833],{"class":226},[106,959,652],{"class":226},[106,961,962],{"class":233},"            # 运行脚本\n",[106,964,965,967,970],{"class":108,"line":273},[106,966,912],{"class":127},[106,968,969],{"class":226}," test",[106,971,972],{"class":233},"               # 运行测试\n",[106,974,975,977,979,982],{"class":108,"line":379},[106,976,912],{"class":127},[106,978,836],{"class":226},[106,980,981],{"class":226}," .\u002Findex.ts",[106,983,984],{"class":233},"   # 打包\n",[81,986,988],{"id":987},"为什么选择-bun","为什么选择 Bun",[30,990,991,994,997,1000],{},[33,992,993],{},"启动速度极快（比 Node.js 快数倍）",[33,995,996],{},"内置 TypeScript 支持，无需额外配置",[33,998,999],{},"兼容大部分 Node.js API 和 npm 包",[33,1001,1002],{},"内置包管理器、打包器、测试运行器",[81,1004,1006],{"id":1005},"进阶bun-作为包管理器","进阶：Bun 作为包管理器",[22,1008,1009],{},"即使不用 Bun 运行代码，也可以用它替代 npm\u002Fyarn 来安装依赖：",[96,1011,1013],{"className":118,"code":1012,"language":120,"meta":101,"style":101},"# 在现有 Node.js 项目中使用 Bun 安装依赖\nbun install\n\n# 生成的 bun.lockb 是二进制格式，比 package-lock.json 更快\n",[103,1014,1015,1020,1027,1031],{"__ignoreMap":101},[106,1016,1017],{"class":108,"line":109},[106,1018,1019],{"class":233},"# 在现有 Node.js 项目中使用 Bun 安装依赖\n",[106,1021,1022,1024],{"class":108,"line":135},[106,1023,912],{"class":127},[106,1025,1026],{"class":226}," install\n",[106,1028,1029],{"class":108,"line":249},[106,1030,486],{"emptyLinePlaceholder":485},[106,1032,1033],{"class":108,"line":262},[106,1034,1035],{"class":233},"# 生成的 bun.lockb 是二进制格式，比 package-lock.json 更快\n",[26,1037,1038],{"id":1038},"实际建议",[81,1040,1041],{"id":1041},"个人开发机",[30,1043,1044,1055,1060],{},[33,1045,1046,1047,1049,1050,1049,1052,1054],{},"版本管理：",[103,1048,154],{}," \u002F ",[103,1051,445],{},[103,1053,449],{}," 三选一",[33,1056,1057,1058],{},"包管理：优先 ",[103,1059,518],{},[33,1061,1062],{},"运行时：默认 Node，按需尝试 Bun",[81,1064,1065],{"id":1065},"团队项目",[30,1067,1068,1071,1074],{},[33,1069,1070],{},"仓库里明确写版本管理策略",[33,1072,1073],{},"固定唯一锁文件",[33,1075,1076,1077,1079,1080,1079,1082,1084],{},"不要让 ",[103,1078,138],{},"、",[103,1081,518],{},[103,1083,912],{}," 混装同一项目依赖",[26,1086,1087],{"id":1087},"常见问题",[81,1089,1090],{"id":1090},"为什么一个项目会出现多个锁文件",[22,1092,1093],{},"通常是不同成员用了不同包管理器。长期看这会直接带来依赖树漂移和 CI 差异。",[81,1095,1097],{"id":1096},"bun-能不能直接替代-node","Bun 能不能直接替代 Node",[22,1099,1100],{},"有些项目可以，但不是默认都适合。涉及原生模块、老生态包或复杂构建链时，先验证兼容性再决定。",[81,1102,1104],{"id":1103},"该选-fnmvolta-还是-mise","该选 fnm、Volta 还是 mise",[30,1106,1107,1112,1117],{},[33,1108,1109,1110],{},"只想轻量切 Node 版本：",[103,1111,154],{},[33,1113,1114,1115],{},"以 JS 工具链为中心：",[103,1116,445],{},[33,1118,1119,1120],{},"想统一多语言：",[103,1121,449],{},[26,1123,1124],{"id":1124},"参考链接",[30,1126,1127,1134,1141,1149,1156,1164,1172,1180,1187,1195],{},[33,1128,1129,1133],{},[88,1130,1132],{"href":1131},"\u002Fsetup","Windows 重装部署清单"," — 重装后的主清单入口",[33,1135,1136,1140],{},[88,1137,1139],{"href":1138},"\u002Fdocs\u002Fwindows-machine-log","Windows 重装部署清单（详情）"," — 逐项版本与下载链接",[33,1142,1143,1148],{},[88,1144,1147],{"href":1145,"rel":1146},"https:\u002F\u002Fnodejs.org\u002F",[92],"Node.js 官网"," — 下载与文档",[33,1150,1151,1155],{},[88,1152,1154],{"href":152,"rel":1153},[92],"fnm GitHub"," — 版本管理器",[33,1157,1158,1163],{},[88,1159,1162],{"href":1160,"rel":1161},"https:\u002F\u002Fpnpm.io\u002Fzh\u002F",[92],"pnpm 官网"," — 中文文档",[33,1165,1166,1171],{},[88,1167,1170],{"href":1168,"rel":1169},"https:\u002F\u002Fgithub.com\u002Fpnpm\u002Fpnpm",[92],"pnpm GitHub"," — 源码",[33,1173,1174,1179],{},[88,1175,1178],{"href":1176,"rel":1177},"https:\u002F\u002Fbun.sh\u002F",[92],"Bun 官网"," — 文档与 API",[33,1181,1182,1171],{},[88,1183,1186],{"href":1184,"rel":1185},"https:\u002F\u002Fgithub.com\u002Foven-sh\u002Fbun",[92],"Bun GitHub",[33,1188,1189,1194],{},[88,1190,1193],{"href":1191,"rel":1192},"https:\u002F\u002Fnpmmirror.com\u002F",[92],"npmmirror"," — 淘宝 npm 镜像",[33,1196,1197,1201],{},[88,1198,1200],{"href":1199},"\u002Fdocs\u002Fvolta-guide","Volta Node 版本管理"," — 如果你更关心项目级固定工具链",[1203,1204,1205],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":101,"searchDepth":135,"depth":135,"links":1207},[1208,1209,1210,1216,1223,1229,1233,1238],{"id":28,"depth":135,"text":28},{"id":60,"depth":135,"text":60},{"id":78,"depth":135,"text":79,"children":1211},[1212,1213,1214,1215],{"id":83,"depth":249,"text":83},{"id":146,"depth":249,"text":147},{"id":289,"depth":249,"text":290},{"id":453,"depth":249,"text":454},{"id":510,"depth":135,"text":511,"children":1217},[1218,1219,1220,1221,1222],{"id":528,"depth":249,"text":528},{"id":591,"depth":249,"text":591},{"id":684,"depth":249,"text":685},{"id":766,"depth":249,"text":767},{"id":848,"depth":249,"text":848},{"id":868,"depth":135,"text":869,"children":1224},[1225,1226,1227,1228],{"id":882,"depth":249,"text":528},{"id":917,"depth":249,"text":591},{"id":987,"depth":249,"text":988},{"id":1005,"depth":249,"text":1006},{"id":1038,"depth":135,"text":1038,"children":1230},[1231,1232],{"id":1041,"depth":249,"text":1041},{"id":1065,"depth":249,"text":1065},{"id":1087,"depth":135,"text":1087,"children":1234},[1235,1236,1237],{"id":1090,"depth":249,"text":1090},{"id":1096,"depth":249,"text":1097},{"id":1103,"depth":249,"text":1104},{"id":1124,"depth":135,"text":1124},{"path":1240,"title":1241,"description":1242,"docType":8,"resourceKind":9,"categoryId":1243,"categoryLabel":1244,"updatedAt":1245,"publishedAt":1245,"icon":1246},"\u002Fdocs\u002Fvscode-setup","VS Code 配置指南","Visual Studio Code 安装、常用扩展、实用配置与进阶技巧","dev-environment","开发环境","2026-01-09","i-carbon-code",{"path":1248,"title":1249,"description":1250,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1251,"publishedAt":1251,"icon":13},"\u002Fdocs\u002Fpython-setup","Python 环境配置","Python 安装、uv 包管理器、虚拟环境与 VS Code 配置","2025-12-29",[1253,1254,1255],"希望把零散经验整理成长期可复用工作流的人","想先建立认知，再决定是否深入实践的人","希望阅读时顺手建立自己的操作清单或收藏体系的人",[1257,1258,1259],"先浏览标题、摘要和目录，带着问题阅读会更高效","顺手记录真正对你有用的命令、链接和注意事项，避免重复搜索","如果页面里提到相关文档，尽量一起打开对照，效果通常更完整",[1261,1266,1270,1274],{"path":1262,"title":1263,"description":1264,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1265,"publishedAt":1265,"icon":13},"\u002Fdocs\u002Ftesting-guide","前端测试指南","Vitest 单元测试、Playwright E2E 测试、测试策略与最佳实践","2026-02-28",{"path":1267,"title":1268,"description":1269,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1265,"publishedAt":1265,"icon":13},"\u002Fdocs\u002Fbun-deno","Bun 与 Deno 运行时","Bun 和 Deno 的安装使用、与 Node.js 对比、包管理与实用命令",{"path":1271,"title":1272,"description":1273,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1265,"publishedAt":1265,"icon":13},"\u002Fdocs\u002Fcss-tricks","CSS 实用技巧","现代 CSS 特性、布局技巧、动画、暗色模式与常用代码片段",{"path":1275,"title":1276,"description":1277,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1265,"publishedAt":1265,"icon":13},"\u002Fdocs\u002Fredis-guide","Redis 使用指南","Redis 安装、数据类型、常用命令、缓存策略与 Node.js 集成",1776215713750]