[{"data":1,"prerenderedAt":2995},["ShallowReactive",2],{"sidebar-page":3,"page-\u002Fnode-package-managers-memo-2026-09-25":4},null,{"id":5,"title":6,"author":7,"body":8,"cover":3,"date":2985,"description":14,"extension":2986,"meta":2987,"navigation":60,"path":2988,"seo":2989,"stem":2990,"tags":2991,"__hash__":2994},"content\u002Fnode-package-managers-memo-2026-09-25.md","Node包管理器备忘录","AeYunDian",{"type":9,"value":10,"toc":2923},"minimark",[11,15,20,25,152,156,286,290,360,374,378,430,434,441,473,479,483,486,514,524,528,548,551,585,589,672,676,687,691,697,723,734,739,755,759,789,793,823,827,846,853,857,896,900,917,921,980,984,1294,1298,1350,1356,1359,1441,1445,1477,1490,1494,1569,1573,1576,1654,1657,1735,1739,1743,1748,1812,1816,1860,1864,1909,1912,1981,1985,2141,2145,2148,2187,2228,2231,2268,2273,2277,2280,2302,2305,2424,2427,2454,2514,2518,2543,2547,2555,2558,2580,2588,2594,2645,2653,2682,2686,2689,2718,2721,2725,2731,2743,2747,2766,2770,2804,2812,2818,2851,2855,2878,2881,2884,2919],[12,13,14],"p",{},"日常高频命令 + 国内换源方案。命令对照无差异时只写 npm。",[16,17,19],"h2",{"id":18},"一换源","一、换源",[21,22,24],"h3",{"id":23},"_11-一键切换nrm","1.1 一键切换：nrm",[26,27,32],"pre",{"className":28,"code":29,"language":30,"meta":31,"style":31},"language-bash shiki shiki-themes monokai","npm install -g nrm\n\nnrm ls                            # 列出所有源\nnrm use taobao                    # 切到淘宝源\nnrm use npm                       # 切回官方\nnrm current                       # 查看当前\nnrm test                          # 测速\nnrm add company http:\u002F\u002Fnpm.company.com\u002F    # 加私有源\nnrm del company\n","bash","",[33,34,35,55,62,75,89,102,113,124,141],"code",{"__ignoreMap":31},[36,37,40,44,48,52],"span",{"class":38,"line":39},"line",1,[36,41,43],{"class":42},"sHkqI","npm",[36,45,47],{"class":46},"s_Ekj"," install",[36,49,51],{"class":50},"s7s5_"," -g",[36,53,54],{"class":46}," nrm\n",[36,56,58],{"class":38,"line":57},2,[36,59,61],{"emptyLinePlaceholder":60},true,"\n",[36,63,65,68,71],{"class":38,"line":64},3,[36,66,67],{"class":42},"nrm",[36,69,70],{"class":46}," ls",[36,72,74],{"class":73},"snpHw","                            # 列出所有源\n",[36,76,78,80,83,86],{"class":38,"line":77},4,[36,79,67],{"class":42},[36,81,82],{"class":46}," use",[36,84,85],{"class":46}," taobao",[36,87,88],{"class":73},"                    # 切到淘宝源\n",[36,90,92,94,96,99],{"class":38,"line":91},5,[36,93,67],{"class":42},[36,95,82],{"class":46},[36,97,98],{"class":46}," npm",[36,100,101],{"class":73},"                       # 切回官方\n",[36,103,105,107,110],{"class":38,"line":104},6,[36,106,67],{"class":42},[36,108,109],{"class":46}," current",[36,111,112],{"class":73},"                       # 查看当前\n",[36,114,116,118,121],{"class":38,"line":115},7,[36,117,67],{"class":42},[36,119,120],{"class":46}," test",[36,122,123],{"class":73},"                          # 测速\n",[36,125,127,129,132,135,138],{"class":38,"line":126},8,[36,128,67],{"class":42},[36,130,131],{"class":46}," add",[36,133,134],{"class":46}," company",[36,136,137],{"class":46}," http:\u002F\u002Fnpm.company.com\u002F",[36,139,140],{"class":73},"    # 加私有源\n",[36,142,144,146,149],{"class":38,"line":143},9,[36,145,67],{"class":42},[36,147,148],{"class":46}," del",[36,150,151],{"class":46}," company\n",[21,153,155],{"id":154},"_12-手动切换","1.2 手动切换",[26,157,159],{"className":28,"code":158,"language":30,"meta":31,"style":31},"# npm\nnpm config set registry https:\u002F\u002Fregistry.npmmirror.com\nnpm config get registry\nnpm config delete registry        # 恢复默认\n\n# yarn v1\nyarn config set registry https:\u002F\u002Fregistry.npmmirror.com\nyarn config get registry\nyarn config delete registry\n\n# pnpm\npnpm config set registry https:\u002F\u002Fregistry.npmmirror.com\npnpm config get registry\n",[33,160,161,166,182,194,208,212,217,230,240,250,255,261,275],{"__ignoreMap":31},[36,162,163],{"class":38,"line":39},[36,164,165],{"class":73},"# npm\n",[36,167,168,170,173,176,179],{"class":38,"line":57},[36,169,43],{"class":42},[36,171,172],{"class":46}," config",[36,174,175],{"class":46}," set",[36,177,178],{"class":46}," registry",[36,180,181],{"class":46}," https:\u002F\u002Fregistry.npmmirror.com\n",[36,183,184,186,188,191],{"class":38,"line":64},[36,185,43],{"class":42},[36,187,172],{"class":46},[36,189,190],{"class":46}," get",[36,192,193],{"class":46}," registry\n",[36,195,196,198,200,203,205],{"class":38,"line":77},[36,197,43],{"class":42},[36,199,172],{"class":46},[36,201,202],{"class":46}," delete",[36,204,178],{"class":46},[36,206,207],{"class":73},"        # 恢复默认\n",[36,209,210],{"class":38,"line":91},[36,211,61],{"emptyLinePlaceholder":60},[36,213,214],{"class":38,"line":104},[36,215,216],{"class":73},"# yarn v1\n",[36,218,219,222,224,226,228],{"class":38,"line":115},[36,220,221],{"class":42},"yarn",[36,223,172],{"class":46},[36,225,175],{"class":46},[36,227,178],{"class":46},[36,229,181],{"class":46},[36,231,232,234,236,238],{"class":38,"line":126},[36,233,221],{"class":42},[36,235,172],{"class":46},[36,237,190],{"class":46},[36,239,193],{"class":46},[36,241,242,244,246,248],{"class":38,"line":143},[36,243,221],{"class":42},[36,245,172],{"class":46},[36,247,202],{"class":46},[36,249,193],{"class":46},[36,251,253],{"class":38,"line":252},10,[36,254,61],{"emptyLinePlaceholder":60},[36,256,258],{"class":38,"line":257},11,[36,259,260],{"class":73},"# pnpm\n",[36,262,264,267,269,271,273],{"class":38,"line":263},12,[36,265,266],{"class":42},"pnpm",[36,268,172],{"class":46},[36,270,175],{"class":46},[36,272,178],{"class":46},[36,274,181],{"class":46},[36,276,278,280,282,284],{"class":38,"line":277},13,[36,279,266],{"class":42},[36,281,172],{"class":46},[36,283,190],{"class":46},[36,285,193],{"class":46},[21,287,289],{"id":288},"_13-常用镜像源","1.3 常用镜像源",[291,292,293,306],"table",{},[294,295,296],"thead",{},[297,298,299,303],"tr",{},[300,301,302],"th",{},"源",[300,304,305],{},"URL",[307,308,309,320,330,340,350],"tbody",{},[297,310,311,315],{},[312,313,314],"td",{},"官方",[312,316,317],{},[33,318,319],{},"https:\u002F\u002Fregistry.npmjs.org",[297,321,322,325],{},[312,323,324],{},"淘宝 \u002F npmmirror（推荐）",[312,326,327],{},[33,328,329],{},"https:\u002F\u002Fregistry.npmmirror.com",[297,331,332,335],{},[312,333,334],{},"腾讯云",[312,336,337],{},[33,338,339],{},"https:\u002F\u002Fmirrors.cloud.tencent.com\u002Fnpm\u002F",[297,341,342,345],{},[312,343,344],{},"华为云",[312,346,347],{},[33,348,349],{},"https:\u002F\u002Fmirrors.huaweicloud.com\u002Frepository\u002Fnpm\u002F",[297,351,352,355],{},[312,353,354],{},"cnpmjs",[312,356,357],{},[33,358,359],{},"https:\u002F\u002Fregistry.cnpmjs.org",[361,362,363],"blockquote",{},[12,364,365,366,369,370,373],{},"淘宝源域名 ",[33,367,368],{},"registry.npm.taobao.org"," 已废弃，新域名为 ",[33,371,372],{},"registry.npmmirror.com","。",[21,375,377],{"id":376},"_14-一次性使用不改配置","1.4 一次性使用（不改配置）",[26,379,381],{"className":28,"code":380,"language":30,"meta":31,"style":31},"npm install --registry=https:\u002F\u002Fregistry.npmmirror.com\nyarn add \u003Cpkg> --registry=https:\u002F\u002Fregistry.npmmirror.com\npnpm add \u003Cpkg> --registry=https:\u002F\u002Fregistry.npmmirror.com\n",[33,382,383,392,414],{"__ignoreMap":31},[36,384,385,387,389],{"class":38,"line":39},[36,386,43],{"class":42},[36,388,47],{"class":46},[36,390,391],{"class":50}," --registry=https:\u002F\u002Fregistry.npmmirror.com\n",[36,393,394,396,398,402,405,409,412],{"class":38,"line":57},[36,395,221],{"class":42},[36,397,131],{"class":46},[36,399,401],{"class":400},"s8I7P"," \u003C",[36,403,404],{"class":46},"pk",[36,406,408],{"class":407},"sCdxs","g",[36,410,411],{"class":400},">",[36,413,391],{"class":50},[36,415,416,418,420,422,424,426,428],{"class":38,"line":64},[36,417,266],{"class":42},[36,419,131],{"class":46},[36,421,401],{"class":400},[36,423,404],{"class":46},[36,425,408],{"class":407},[36,427,411],{"class":400},[36,429,391],{"class":50},[21,431,433],{"id":432},"_15-项目级-npmrc","1.5 项目级 .npmrc",[12,435,436,440],{},[437,438,439],"strong",{},"只在当前项目生效","，适合团队统一配置。放项目根目录：",[26,442,446],{"className":443,"code":444,"language":445,"meta":31,"style":31},"language-ini shiki shiki-themes monokai","# .npmrc\nregistry=https:\u002F\u002Fregistry.npmmirror.com\nstrict-ssl=true\nsave-exact=true\nengine-strict=true\n","ini",[33,447,448,453,458,463,468],{"__ignoreMap":31},[36,449,450],{"class":38,"line":39},[36,451,452],{},"# .npmrc\n",[36,454,455],{"class":38,"line":57},[36,456,457],{},"registry=https:\u002F\u002Fregistry.npmmirror.com\n",[36,459,460],{"class":38,"line":64},[36,461,462],{},"strict-ssl=true\n",[36,464,465],{"class":38,"line":77},[36,466,467],{},"save-exact=true\n",[36,469,470],{"class":38,"line":91},[36,471,472],{},"engine-strict=true\n",[12,474,475,478],{},[437,476,477],{},"提交到 Git","，让所有成员和 CI 用同一套源。",[21,480,482],{"id":481},"_16-私有源-公共源混用scoped-registry","1.6 私有源 + 公共源混用（scoped registry）",[12,484,485],{},"公司包放私有源，公共包走镜像：",[26,487,489],{"className":443,"code":488,"language":445,"meta":31,"style":31},"# .npmrc\nregistry=https:\u002F\u002Fregistry.npmmirror.com\n@company:registry=https:\u002F\u002Fnpm.company.com\u002F\n\u002F\u002Fnpm.company.com\u002F:_authToken=${NPM_TOKEN}\n\u002F\u002Fregistry.npmmirror.com\u002F:always-auth=false\n",[33,490,491,495,499,504,509],{"__ignoreMap":31},[36,492,493],{"class":38,"line":39},[36,494,452],{},[36,496,497],{"class":38,"line":57},[36,498,457],{},[36,500,501],{"class":38,"line":64},[36,502,503],{},"@company:registry=https:\u002F\u002Fnpm.company.com\u002F\n",[36,505,506],{"class":38,"line":77},[36,507,508],{},"\u002F\u002Fnpm.company.com\u002F:_authToken=${NPM_TOKEN}\n",[36,510,511],{"class":38,"line":91},[36,512,513],{},"\u002F\u002Fregistry.npmmirror.com\u002F:always-auth=false\n",[12,515,516,519,520,523],{},[33,517,518],{},"@company"," 开头的包（如 ",[33,521,522],{},"@company\u002Fui","）走私有源，其余走淘宝源。",[21,525,527],{"id":526},"_17-认证-token-配置","1.7 认证 Token 配置",[26,529,531],{"className":443,"code":530,"language":445,"meta":31,"style":31},"# ~\u002F.npmrc\n\u002F\u002Fregistry.npmjs.org\u002F:_authToken=npm_xxxxxxxxxxxx\n\u002F\u002Fnpm.pkg.github.com\u002F:_authToken=ghp_xxxxxxxxxxxx\n",[33,532,533,538,543],{"__ignoreMap":31},[36,534,535],{"class":38,"line":39},[36,536,537],{},"# ~\u002F.npmrc\n",[36,539,540],{"class":38,"line":57},[36,541,542],{},"\u002F\u002Fregistry.npmjs.org\u002F:_authToken=npm_xxxxxxxxxxxx\n",[36,544,545],{"class":38,"line":64},[36,546,547],{},"\u002F\u002Fnpm.pkg.github.com\u002F:_authToken=ghp_xxxxxxxxxxxx\n",[12,549,550],{},"或用环境变量（推荐 CI 使用）：",[26,552,554],{"className":28,"code":553,"language":30,"meta":31,"style":31},"export NPM_TOKEN=xxxxx\n# .npmrc 里写\n\u002F\u002Fregistry.npmjs.org\u002F:_authToken=${NPM_TOKEN}\n",[33,555,556,570,575],{"__ignoreMap":31},[36,557,558,561,564,567],{"class":38,"line":39},[36,559,560],{"class":400},"export",[36,562,563],{"class":407}," NPM_TOKEN",[36,565,566],{"class":400},"=",[36,568,569],{"class":407},"xxxxx\n",[36,571,572],{"class":38,"line":57},[36,573,574],{"class":73},"# .npmrc 里写\n",[36,576,577,580,582],{"class":38,"line":64},[36,578,579],{"class":42},"\u002F\u002Fregistry.npmjs.org\u002F:_authToken",[36,581,566],{"class":46},[36,583,584],{"class":407},"${NPM_TOKEN}\n",[21,586,588],{"id":587},"_18-换源失败的排查","1.8 换源失败的排查",[26,590,592],{"className":28,"code":591,"language":30,"meta":31,"style":31},"# 1. 确认当前源\nnpm config get registry\n\n# 2. 直接 curl 试\ncurl -I https:\u002F\u002Fregistry.npmmirror.com\u002Fvue\n\n# 3. 清除 npm 缓存\nnpm cache clean --force\n\n# 4. 检查是否有多个 .npmrc 冲突\nnpm config list --show-origin\n",[33,593,594,599,609,613,618,629,633,638,651,655,660],{"__ignoreMap":31},[36,595,596],{"class":38,"line":39},[36,597,598],{"class":73},"# 1. 确认当前源\n",[36,600,601,603,605,607],{"class":38,"line":57},[36,602,43],{"class":42},[36,604,172],{"class":46},[36,606,190],{"class":46},[36,608,193],{"class":46},[36,610,611],{"class":38,"line":64},[36,612,61],{"emptyLinePlaceholder":60},[36,614,615],{"class":38,"line":77},[36,616,617],{"class":73},"# 2. 直接 curl 试\n",[36,619,620,623,626],{"class":38,"line":91},[36,621,622],{"class":42},"curl",[36,624,625],{"class":50}," -I",[36,627,628],{"class":46}," https:\u002F\u002Fregistry.npmmirror.com\u002Fvue\n",[36,630,631],{"class":38,"line":104},[36,632,61],{"emptyLinePlaceholder":60},[36,634,635],{"class":38,"line":115},[36,636,637],{"class":73},"# 3. 清除 npm 缓存\n",[36,639,640,642,645,648],{"class":38,"line":126},[36,641,43],{"class":42},[36,643,644],{"class":46}," cache",[36,646,647],{"class":46}," clean",[36,649,650],{"class":50}," --force\n",[36,652,653],{"class":38,"line":143},[36,654,61],{"emptyLinePlaceholder":60},[36,656,657],{"class":38,"line":252},[36,658,659],{"class":73},"# 4. 检查是否有多个 .npmrc 冲突\n",[36,661,662,664,666,669],{"class":38,"line":257},[36,663,43],{"class":42},[36,665,172],{"class":46},[36,667,668],{"class":46}," list",[36,670,671],{"class":50}," --show-origin\n",[16,673,675],{"id":674},"二其他-binary-镜像换源只改-npm-包不改-binary","二、其他 binary 镜像（换源只改 npm 包，不改 binary）",[12,677,678,679,682,683,686],{},"很多包在 ",[33,680,681],{},"postinstall"," 阶段会下载",[437,684,685],{},"非 npm 的二进制","，换 registry 没用。这些要单独配：",[21,688,690],{"id":689},"_21-node-版本管理器镜像","2.1 Node 版本管理器镜像",[12,692,693,696],{},[437,694,695],{},"nvm","：",[26,698,700],{"className":28,"code":699,"language":30,"meta":31,"style":31},"export NVM_NODEJS_ORG_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode\nnvm install 20\n",[33,701,702,714],{"__ignoreMap":31},[36,703,704,706,709,711],{"class":38,"line":39},[36,705,560],{"class":400},[36,707,708],{"class":407}," NVM_NODEJS_ORG_MIRROR",[36,710,566],{"class":400},[36,712,713],{"class":407},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode\n",[36,715,716,718,720],{"class":38,"line":57},[36,717,695],{"class":42},[36,719,47],{"class":46},[36,721,722],{"class":50}," 20\n",[12,724,725,726,729,730,733],{},"写入 ",[33,727,728],{},"~\u002F.bashrc"," 或 ",[33,731,732],{},"~\u002F.zshrc"," 永久生效。",[12,735,736,696],{},[437,737,738],{},"fnm",[26,740,742],{"className":28,"code":741,"language":30,"meta":31,"style":31},"export FNM_NODE_DIST_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode\n",[33,743,744],{"__ignoreMap":31},[36,745,746,748,751,753],{"class":38,"line":39},[36,747,560],{"class":400},[36,749,750],{"class":407}," FNM_NODE_DIST_MIRROR",[36,752,566],{"class":400},[36,754,713],{"class":407},[21,756,758],{"id":757},"_22-electron","2.2 Electron",[26,760,762],{"className":28,"code":761,"language":30,"meta":31,"style":31},"# 项目 .npmrc\nelectron_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron\u002F\nelectron_builder_binaries_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron-builder-binaries\u002F\n",[33,763,764,769,779],{"__ignoreMap":31},[36,765,766],{"class":38,"line":39},[36,767,768],{"class":73},"# 项目 .npmrc\n",[36,770,771,774,776],{"class":38,"line":57},[36,772,773],{"class":407},"electron_mirror",[36,775,566],{"class":400},[36,777,778],{"class":46},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron\u002F\n",[36,780,781,784,786],{"class":38,"line":64},[36,782,783],{"class":407},"electron_builder_binaries_mirror",[36,785,566],{"class":400},[36,787,788],{"class":46},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron-builder-binaries\u002F\n",[21,790,792],{"id":791},"_23-puppeteer-playwright","2.3 Puppeteer \u002F Playwright",[26,794,796],{"className":28,"code":795,"language":30,"meta":31,"style":31},"# .npmrc 或环境变量\npuppeteer_download_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\nPLAYWRIGHT_DOWNLOAD_HOST=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fplaywright\n",[33,797,798,803,813],{"__ignoreMap":31},[36,799,800],{"class":38,"line":39},[36,801,802],{"class":73},"# .npmrc 或环境变量\n",[36,804,805,808,810],{"class":38,"line":57},[36,806,807],{"class":407},"puppeteer_download_host",[36,809,566],{"class":400},[36,811,812],{"class":46},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\n",[36,814,815,818,820],{"class":38,"line":64},[36,816,817],{"class":407},"PLAYWRIGHT_DOWNLOAD_HOST",[36,819,566],{"class":400},[36,821,822],{"class":46},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fplaywright\n",[21,824,826],{"id":825},"_24-node-sass-sass-embedded","2.4 node-sass \u002F sass-embedded",[26,828,830],{"className":28,"code":829,"language":30,"meta":31,"style":31},"# .npmrc\nsass_binary_site=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-sass\n",[33,831,832,836],{"__ignoreMap":31},[36,833,834],{"class":38,"line":39},[36,835,452],{"class":73},[36,837,838,841,843],{"class":38,"line":57},[36,839,840],{"class":407},"sass_binary_site",[36,842,566],{"class":400},[36,844,845],{"class":46},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-sass\n",[12,847,848,849,852],{},"现在多用 ",[33,850,851],{},"sass","（dart-sass 纯 JS 实现），无需 binary。",[21,854,856],{"id":855},"_25-sharp-canvas","2.5 sharp \u002F canvas",[26,858,860],{"className":28,"code":859,"language":30,"meta":31,"style":31},"# .npmrc\nsharp_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp\nsharp_libvips_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp-libvips\ncanvas_binary_host_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-canvas-prebuilt\u002F\n",[33,861,862,866,876,886],{"__ignoreMap":31},[36,863,864],{"class":38,"line":39},[36,865,452],{"class":73},[36,867,868,871,873],{"class":38,"line":57},[36,869,870],{"class":407},"sharp_binary_host",[36,872,566],{"class":400},[36,874,875],{"class":46},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp\n",[36,877,878,881,883],{"class":38,"line":64},[36,879,880],{"class":407},"sharp_libvips_binary_host",[36,882,566],{"class":400},[36,884,885],{"class":46},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp-libvips\n",[36,887,888,891,893],{"class":38,"line":77},[36,889,890],{"class":407},"canvas_binary_host_mirror",[36,892,566],{"class":400},[36,894,895],{"class":46},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-canvas-prebuilt\u002F\n",[21,897,899],{"id":898},"_26-cypress","2.6 Cypress",[26,901,903],{"className":28,"code":902,"language":30,"meta":31,"style":31},"export CYPRESS_DOWNLOAD_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fcypress\n",[33,904,905],{"__ignoreMap":31},[36,906,907,909,912,914],{"class":38,"line":39},[36,908,560],{"class":400},[36,910,911],{"class":407}," CYPRESS_DOWNLOAD_MIRROR",[36,913,566],{"class":400},[36,915,916],{"class":407},"https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fcypress\n",[21,918,920],{"id":919},"_27-全家桶模板","2.7 全家桶模板",[26,922,924],{"className":443,"code":923,"language":445,"meta":31,"style":31},"# ~\u002F.npmrc 一份全搞定\nregistry=https:\u002F\u002Fregistry.npmmirror.com\nelectron_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron\u002F\nelectron_builder_binaries_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron-builder-binaries\u002F\npuppeteer_download_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\nPLAYWRIGHT_DOWNLOAD_HOST=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fplaywright\nsass_binary_site=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-sass\nsharp_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp\nsharp_libvips_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp-libvips\ncanvas_binary_host_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-canvas-prebuilt\u002F\nCYPRESS_DOWNLOAD_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fcypress\n",[33,925,926,931,935,940,945,950,955,960,965,970,975],{"__ignoreMap":31},[36,927,928],{"class":38,"line":39},[36,929,930],{},"# ~\u002F.npmrc 一份全搞定\n",[36,932,933],{"class":38,"line":57},[36,934,457],{},[36,936,937],{"class":38,"line":64},[36,938,939],{},"electron_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron\u002F\n",[36,941,942],{"class":38,"line":77},[36,943,944],{},"electron_builder_binaries_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Felectron-builder-binaries\u002F\n",[36,946,947],{"class":38,"line":91},[36,948,949],{},"puppeteer_download_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\n",[36,951,952],{"class":38,"line":104},[36,953,954],{},"PLAYWRIGHT_DOWNLOAD_HOST=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fplaywright\n",[36,956,957],{"class":38,"line":115},[36,958,959],{},"sass_binary_site=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-sass\n",[36,961,962],{"class":38,"line":126},[36,963,964],{},"sharp_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp\n",[36,966,967],{"class":38,"line":143},[36,968,969],{},"sharp_libvips_binary_host=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fsharp-libvips\n",[36,971,972],{"class":38,"line":252},[36,973,974],{},"canvas_binary_host_mirror=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fnode-canvas-prebuilt\u002F\n",[36,976,977],{"class":38,"line":257},[36,978,979],{},"CYPRESS_DOWNLOAD_MIRROR=https:\u002F\u002Fnpmmirror.com\u002Fmirrors\u002Fcypress\n",[16,981,983],{"id":982},"三命令对照速查","三、命令对照速查",[291,985,986,1000],{},[294,987,988],{},[297,989,990,993,995,998],{},[300,991,992],{},"操作",[300,994,43],{},[300,996,997],{},"yarn (v1)",[300,999,266],{},[307,1001,1002,1021,1041,1061,1081,1096,1116,1136,1156,1176,1196,1214,1234,1254,1274],{},[297,1003,1004,1007,1012,1016],{},[312,1005,1006],{},"安装全部",[312,1008,1009],{},[33,1010,1011],{},"npm install",[312,1013,1014],{},[33,1015,221],{},[312,1017,1018],{},[33,1019,1020],{},"pnpm install",[297,1022,1023,1026,1031,1036],{},[312,1024,1025],{},"安装生产依赖",[312,1027,1028],{},[33,1029,1030],{},"npm i \u003Cpkg>",[312,1032,1033],{},[33,1034,1035],{},"yarn add \u003Cpkg>",[312,1037,1038],{},[33,1039,1040],{},"pnpm add \u003Cpkg>",[297,1042,1043,1046,1051,1056],{},[312,1044,1045],{},"安装开发依赖",[312,1047,1048],{},[33,1049,1050],{},"npm i -D \u003Cpkg>",[312,1052,1053],{},[33,1054,1055],{},"yarn add -D \u003Cpkg>",[312,1057,1058],{},[33,1059,1060],{},"pnpm add -D \u003Cpkg>",[297,1062,1063,1066,1071,1076],{},[312,1064,1065],{},"安装全局",[312,1067,1068],{},[33,1069,1070],{},"npm i -g \u003Cpkg>",[312,1072,1073],{},[33,1074,1075],{},"yarn global add \u003Cpkg>",[312,1077,1078],{},[33,1079,1080],{},"pnpm add -g \u003Cpkg>",[297,1082,1083,1086,1091,1094],{},[312,1084,1085],{},"安装指定版本",[312,1087,1088],{},[33,1089,1090],{},"npm i \u003Cpkg>@1.2.3",[312,1092,1093],{},"同",[312,1095,1093],{},[297,1097,1098,1101,1106,1111],{},[312,1099,1100],{},"卸载",[312,1102,1103],{},[33,1104,1105],{},"npm uninstall \u003Cpkg>",[312,1107,1108],{},[33,1109,1110],{},"yarn remove \u003Cpkg>",[312,1112,1113],{},[33,1114,1115],{},"pnpm remove \u003Cpkg>",[297,1117,1118,1121,1126,1131],{},[312,1119,1120],{},"卸载全局",[312,1122,1123],{},[33,1124,1125],{},"npm uninstall -g \u003Cpkg>",[312,1127,1128],{},[33,1129,1130],{},"yarn global remove \u003Cpkg>",[312,1132,1133],{},[33,1134,1135],{},"pnpm remove -g \u003Cpkg>",[297,1137,1138,1141,1146,1151],{},[312,1139,1140],{},"更新全部",[312,1142,1143],{},[33,1144,1145],{},"npm update",[312,1147,1148],{},[33,1149,1150],{},"yarn upgrade",[312,1152,1153],{},[33,1154,1155],{},"pnpm update",[297,1157,1158,1161,1166,1171],{},[312,1159,1160],{},"运行脚本",[312,1162,1163],{},[33,1164,1165],{},"npm run \u003Cs>",[312,1167,1168],{},[33,1169,1170],{},"yarn \u003Cs>",[312,1172,1173],{},[33,1174,1175],{},"pnpm \u003Cs>",[297,1177,1178,1181,1186,1191],{},[312,1179,1180],{},"执行本地二进制",[312,1182,1183],{},[33,1184,1185],{},"npx \u003Cbin>",[312,1187,1188],{},[33,1189,1190],{},"yarn \u003Cbin>",[312,1192,1193],{},[33,1194,1195],{},"pnpm exec \u003Cbin>",[297,1197,1198,1201,1206,1209],{},[312,1199,1200],{},"执行远程包",[312,1202,1203],{},[33,1204,1205],{},"npx \u003Cpkg>",[312,1207,1208],{},"—",[312,1210,1211],{},[33,1212,1213],{},"pnpm dlx \u003Cpkg>",[297,1215,1216,1219,1224,1229],{},[312,1217,1218],{},"查看顶层依赖",[312,1220,1221],{},[33,1222,1223],{},"npm ls --depth=0",[312,1225,1226],{},[33,1227,1228],{},"yarn list --depth=0",[312,1230,1231],{},[33,1232,1233],{},"pnpm list --depth=0",[297,1235,1236,1239,1244,1249],{},[312,1237,1238],{},"查过时依赖",[312,1240,1241],{},[33,1242,1243],{},"npm outdated",[312,1245,1246],{},[33,1247,1248],{},"yarn outdated",[312,1250,1251],{},[33,1252,1253],{},"pnpm outdated",[297,1255,1256,1259,1264,1269],{},[312,1257,1258],{},"清缓存",[312,1260,1261],{},[33,1262,1263],{},"npm cache clean --force",[312,1265,1266],{},[33,1267,1268],{},"yarn cache clean",[312,1270,1271],{},[33,1272,1273],{},"pnpm store prune",[297,1275,1276,1279,1284,1289],{},[312,1277,1278],{},"查看为什么装了某包",[312,1280,1281],{},[33,1282,1283],{},"npm why \u003Cpkg>",[312,1285,1286],{},[33,1287,1288],{},"yarn why \u003Cpkg>",[312,1290,1291],{},[33,1292,1293],{},"pnpm why \u003Cpkg>",[16,1295,1297],{"id":1296},"四锁文件","四、锁文件",[291,1299,1300,1313],{},[294,1301,1302],{},[297,1303,1304,1307,1310],{},[300,1305,1306],{},"包管理器",[300,1308,1309],{},"锁文件",[300,1311,1312],{},"提交 Git",[307,1314,1315,1327,1339],{},[297,1316,1317,1319,1324],{},[312,1318,43],{},[312,1320,1321],{},[33,1322,1323],{},"package-lock.json",[312,1325,1326],{},"✅",[297,1328,1329,1332,1337],{},[312,1330,1331],{},"yarn v1",[312,1333,1334],{},[33,1335,1336],{},"yarn.lock",[312,1338,1326],{},[297,1340,1341,1343,1348],{},[312,1342,266],{},[312,1344,1345],{},[33,1346,1347],{},"pnpm-lock.yaml",[312,1349,1326],{},[12,1351,1352,1355],{},[437,1353,1354],{},"同一仓库只保留一种锁文件","。混用会导致依赖树不一致。",[21,1357,1358],{"id":1358},"清理重装",[26,1360,1362],{"className":28,"code":1361,"language":30,"meta":31,"style":31},"# npm\nrm -rf node_modules package-lock.json && npm install\n\n# yarn\nrm -rf node_modules yarn.lock && yarn install\n\n# pnpm\nrm -rf node_modules pnpm-lock.yaml && pnpm install\n",[33,1363,1364,1368,1390,1394,1399,1416,1420,1424],{"__ignoreMap":31},[36,1365,1366],{"class":38,"line":39},[36,1367,165],{"class":73},[36,1369,1370,1373,1376,1379,1382,1385,1387],{"class":38,"line":57},[36,1371,1372],{"class":42},"rm",[36,1374,1375],{"class":50}," -rf",[36,1377,1378],{"class":46}," node_modules",[36,1380,1381],{"class":46}," package-lock.json",[36,1383,1384],{"class":407}," && ",[36,1386,43],{"class":42},[36,1388,1389],{"class":46}," install\n",[36,1391,1392],{"class":38,"line":64},[36,1393,61],{"emptyLinePlaceholder":60},[36,1395,1396],{"class":38,"line":77},[36,1397,1398],{"class":73},"# yarn\n",[36,1400,1401,1403,1405,1407,1410,1412,1414],{"class":38,"line":91},[36,1402,1372],{"class":42},[36,1404,1375],{"class":50},[36,1406,1378],{"class":46},[36,1408,1409],{"class":46}," yarn.lock",[36,1411,1384],{"class":407},[36,1413,221],{"class":42},[36,1415,1389],{"class":46},[36,1417,1418],{"class":38,"line":104},[36,1419,61],{"emptyLinePlaceholder":60},[36,1421,1422],{"class":38,"line":115},[36,1423,260],{"class":73},[36,1425,1426,1428,1430,1432,1435,1437,1439],{"class":38,"line":126},[36,1427,1372],{"class":42},[36,1429,1375],{"class":50},[36,1431,1378],{"class":46},[36,1433,1434],{"class":46}," pnpm-lock.yaml",[36,1436,1384],{"class":407},[36,1438,266],{"class":42},[36,1440,1389],{"class":46},[21,1442,1444],{"id":1443},"ci-严格安装","CI 严格安装",[26,1446,1448],{"className":28,"code":1447,"language":30,"meta":31,"style":31},"npm ci                            # 严格按 lock 装，不更新\npnpm install --frozen-lockfile\nyarn install --frozen-lockfile\n",[33,1449,1450,1460,1469],{"__ignoreMap":31},[36,1451,1452,1454,1457],{"class":38,"line":39},[36,1453,43],{"class":42},[36,1455,1456],{"class":46}," ci",[36,1458,1459],{"class":73},"                            # 严格按 lock 装，不更新\n",[36,1461,1462,1464,1466],{"class":38,"line":57},[36,1463,266],{"class":42},[36,1465,47],{"class":46},[36,1467,1468],{"class":50}," --frozen-lockfile\n",[36,1470,1471,1473,1475],{"class":38,"line":64},[36,1472,221],{"class":42},[36,1474,47],{"class":46},[36,1476,1468],{"class":50},[12,1478,1479,1482,1483,1485,1486,1489],{},[33,1480,1481],{},"npm ci"," 要求 ",[33,1484,1323],{}," 与 ",[33,1487,1488],{},"package.json"," 完全一致，否则直接报错退出。",[16,1491,1493],{"id":1492},"五依赖版本语义","五、依赖版本语义",[291,1495,1496,1506],{},[294,1497,1498],{},[297,1499,1500,1503],{},[300,1501,1502],{},"写法",[300,1504,1505],{},"允许升级范围",[307,1507,1508,1518,1530,1542,1555],{},[297,1509,1510,1515],{},[312,1511,1512],{},[33,1513,1514],{},"1.2.3",[312,1516,1517],{},"精确，不升级",[297,1519,1520,1525],{},[312,1521,1522],{},[33,1523,1524],{},"~1.2.3",[312,1526,1527],{},[33,1528,1529],{},">=1.2.3 \u003C1.3.0",[297,1531,1532,1537],{},[312,1533,1534],{},[33,1535,1536],{},"^1.2.3",[312,1538,1539],{},[33,1540,1541],{},">=1.2.3 \u003C2.0.0",[297,1543,1544,1549],{},[312,1545,1546],{},[33,1547,1548],{},"^0.2.3",[312,1550,1551,1554],{},[33,1552,1553],{},">=0.2.3 \u003C0.3.0","（0.x 例外，锁次版本）",[297,1556,1557,1566],{},[312,1558,1559,1562,1563],{},[33,1560,1561],{},"*"," \u002F ",[33,1564,1565],{},"latest",[312,1567,1568],{},"不限（不推荐）",[16,1570,1572],{"id":1571},"六脚本scripts","六、脚本（scripts）",[21,1574,1575],{"id":1575},"钩子",[291,1577,1578,1587],{},[294,1579,1580],{},[297,1581,1582,1584],{},[300,1583,1575],{},[300,1585,1586],{},"触发时机",[307,1588,1589,1599,1608,1618,1632,1644],{},[297,1590,1591,1596],{},[312,1592,1593],{},[33,1594,1595],{},"preinstall",[312,1597,1598],{},"install 之前",[297,1600,1601,1605],{},[312,1602,1603],{},[33,1604,681],{},[312,1606,1607],{},"install 之后",[297,1609,1610,1615],{},[312,1611,1612],{},[33,1613,1614],{},"prepare",[312,1616,1617],{},"install 和 publish 之前都触发（husky 常用）",[297,1619,1620,1625],{},[312,1621,1622],{},[33,1623,1624],{},"prepublishOnly",[312,1626,1627,1628,1631],{},"仅 ",[33,1629,1630],{},"npm publish"," 之前",[297,1633,1634,1639],{},[312,1635,1636],{},[33,1637,1638],{},"pre\u003Cscript>",[312,1640,1641,1631],{},[33,1642,1643],{},"npm run \u003Cscript>",[297,1645,1646,1651],{},[312,1647,1648],{},[33,1649,1650],{},"post\u003Cscript>",[312,1652,1653],{},"执行之后",[21,1655,1656],{"id":1656},"传参与环境变量",[26,1658,1660],{"className":28,"code":1659,"language":30,"meta":31,"style":31},"npm run build -- --mode production\nyarn build --mode production\npnpm build --mode production\n\n# 跨平台环境变量\nnpm i -D cross-env\n\"build\": \"cross-env NODE_ENV=production vite build\"\n",[33,1661,1662,1681,1691,1701,1705,1710,1723],{"__ignoreMap":31},[36,1663,1664,1666,1669,1672,1675,1678],{"class":38,"line":39},[36,1665,43],{"class":42},[36,1667,1668],{"class":46}," run",[36,1670,1671],{"class":46}," build",[36,1673,1674],{"class":50}," --",[36,1676,1677],{"class":50}," --mode",[36,1679,1680],{"class":46}," production\n",[36,1682,1683,1685,1687,1689],{"class":38,"line":57},[36,1684,221],{"class":42},[36,1686,1671],{"class":46},[36,1688,1677],{"class":50},[36,1690,1680],{"class":46},[36,1692,1693,1695,1697,1699],{"class":38,"line":64},[36,1694,266],{"class":42},[36,1696,1671],{"class":46},[36,1698,1677],{"class":50},[36,1700,1680],{"class":46},[36,1702,1703],{"class":38,"line":77},[36,1704,61],{"emptyLinePlaceholder":60},[36,1706,1707],{"class":38,"line":91},[36,1708,1709],{"class":73},"# 跨平台环境变量\n",[36,1711,1712,1714,1717,1720],{"class":38,"line":104},[36,1713,43],{"class":42},[36,1715,1716],{"class":46}," i",[36,1718,1719],{"class":50}," -D",[36,1721,1722],{"class":46}," cross-env\n",[36,1724,1725,1728,1732],{"class":38,"line":115},[36,1726,1727],{"class":42},"\"build\"",[36,1729,1731],{"class":1730},"sYf5A",":",[36,1733,1734],{"class":46}," \"cross-env NODE_ENV=production vite build\"\n",[16,1736,1738],{"id":1737},"七依赖管理","七、依赖管理",[21,1740,1742],{"id":1741},"overrides-resolutions强制覆盖版本","overrides \u002F resolutions（强制覆盖版本）",[12,1744,1745,696],{},[437,1746,1747],{},"npm (>= 8.3)",[26,1749,1753],{"className":1750,"code":1751,"language":1752,"meta":31,"style":31},"language-json shiki shiki-themes monokai","{\n  \"overrides\": {\n    \"lodash\": \"4.17.21\",\n    \"some-pkg\": { \"lodash\": \"4.17.21\" }\n  }\n}\n","json",[33,1754,1755,1760,1769,1784,1802,1807],{"__ignoreMap":31},[36,1756,1757],{"class":38,"line":39},[36,1758,1759],{"class":407},"{\n",[36,1761,1762,1766],{"class":38,"line":57},[36,1763,1765],{"class":1764},"sOx1s","  \"overrides\"",[36,1767,1768],{"class":407},": {\n",[36,1770,1771,1774,1777,1781],{"class":38,"line":64},[36,1772,1773],{"class":1764},"    \"lodash\"",[36,1775,1776],{"class":407},": ",[36,1778,1780],{"class":1779},"susgL","\"4.17.21\"",[36,1782,1783],{"class":407},",\n",[36,1785,1786,1789,1792,1795,1797,1799],{"class":38,"line":77},[36,1787,1788],{"class":1764},"    \"some-pkg\"",[36,1790,1791],{"class":407},": { ",[36,1793,1794],{"class":1764},"\"lodash\"",[36,1796,1776],{"class":407},[36,1798,1780],{"class":1779},[36,1800,1801],{"class":407}," }\n",[36,1803,1804],{"class":38,"line":91},[36,1805,1806],{"class":407},"  }\n",[36,1808,1809],{"class":38,"line":104},[36,1810,1811],{"class":407},"}\n",[12,1813,1814,696],{},[437,1815,1331],{},[26,1817,1819],{"className":1750,"code":1818,"language":1752,"meta":31,"style":31},"{\n  \"resolutions\": {\n    \"lodash\": \"4.17.21\",\n    \"**\u002Flodash\": \"4.17.21\"\n  }\n}\n",[33,1820,1821,1825,1832,1842,1852,1856],{"__ignoreMap":31},[36,1822,1823],{"class":38,"line":39},[36,1824,1759],{"class":407},[36,1826,1827,1830],{"class":38,"line":57},[36,1828,1829],{"class":1764},"  \"resolutions\"",[36,1831,1768],{"class":407},[36,1833,1834,1836,1838,1840],{"class":38,"line":64},[36,1835,1773],{"class":1764},[36,1837,1776],{"class":407},[36,1839,1780],{"class":1779},[36,1841,1783],{"class":407},[36,1843,1844,1847,1849],{"class":38,"line":77},[36,1845,1846],{"class":1764},"    \"**\u002Flodash\"",[36,1848,1776],{"class":407},[36,1850,1851],{"class":1779},"\"4.17.21\"\n",[36,1853,1854],{"class":38,"line":91},[36,1855,1806],{"class":407},[36,1857,1858],{"class":38,"line":104},[36,1859,1811],{"class":407},[12,1861,1862,696],{},[437,1863,266],{},[26,1865,1867],{"className":1750,"code":1866,"language":1752,"meta":31,"style":31},"{\n  \"pnpm\": {\n    \"overrides\": {\n      \"lodash\": \"4.17.21\"\n    }\n  }\n}\n",[33,1868,1869,1873,1880,1887,1896,1901,1905],{"__ignoreMap":31},[36,1870,1871],{"class":38,"line":39},[36,1872,1759],{"class":407},[36,1874,1875,1878],{"class":38,"line":57},[36,1876,1877],{"class":1764},"  \"pnpm\"",[36,1879,1768],{"class":407},[36,1881,1882,1885],{"class":38,"line":64},[36,1883,1884],{"class":1764},"    \"overrides\"",[36,1886,1768],{"class":407},[36,1888,1889,1892,1894],{"class":38,"line":77},[36,1890,1891],{"class":1764},"      \"lodash\"",[36,1893,1776],{"class":407},[36,1895,1851],{"class":1779},[36,1897,1898],{"class":38,"line":91},[36,1899,1900],{"class":407},"    }\n",[36,1902,1903],{"class":38,"line":104},[36,1904,1806],{"class":407},[36,1906,1907],{"class":38,"line":115},[36,1908,1811],{"class":407},[21,1910,1911],{"id":1911},"依赖分析",[26,1913,1915],{"className":28,"code":1914,"language":30,"meta":31,"style":31},"npm ls \u003Cpkg>                      # 谁依赖了它\nnpm why \u003Cpkg>                     # 同上（npm 8+）\npnpm why \u003Cpkg>\nyarn why \u003Cpkg>\n",[33,1916,1917,1934,1952,1967],{"__ignoreMap":31},[36,1918,1919,1921,1923,1925,1927,1929,1931],{"class":38,"line":39},[36,1920,43],{"class":42},[36,1922,70],{"class":46},[36,1924,401],{"class":400},[36,1926,404],{"class":46},[36,1928,408],{"class":407},[36,1930,411],{"class":400},[36,1932,1933],{"class":73},"                      # 谁依赖了它\n",[36,1935,1936,1938,1941,1943,1945,1947,1949],{"class":38,"line":57},[36,1937,43],{"class":42},[36,1939,1940],{"class":46}," why",[36,1942,401],{"class":400},[36,1944,404],{"class":46},[36,1946,408],{"class":407},[36,1948,411],{"class":400},[36,1950,1951],{"class":73},"                     # 同上（npm 8+）\n",[36,1953,1954,1956,1958,1960,1962,1964],{"class":38,"line":64},[36,1955,266],{"class":42},[36,1957,1940],{"class":46},[36,1959,401],{"class":400},[36,1961,404],{"class":46},[36,1963,408],{"class":407},[36,1965,1966],{"class":400},">\n",[36,1968,1969,1971,1973,1975,1977,1979],{"class":38,"line":77},[36,1970,221],{"class":42},[36,1972,1940],{"class":46},[36,1974,401],{"class":400},[36,1976,404],{"class":46},[36,1978,408],{"class":407},[36,1980,1966],{"class":400},[16,1982,1984],{"id":1983},"八npm-专属","八、npm 专属",[26,1986,1988],{"className":28,"code":1987,"language":30,"meta":31,"style":31},"npm view \u003Cpkg>                    # 包信息\nnpm view \u003Cpkg> versions           # 所有版本\nnpm view \u003Cpkg> dist-tags          # 标签\nnpm info \u003Cpkg> repository.url     # 仓库地址\n\nnpm login\nnpm publish                       # 发布\nnpm publish --access public       # scoped 包首次发布\nnpm publish --tag beta            # 打标签\nnpm unpublish \u003Cpkg>@1.0.0         # 撤销（24h 内）\n",[33,1989,1990,2008,2028,2048,2069,2073,2080,2090,2105,2120],{"__ignoreMap":31},[36,1991,1992,1994,1997,1999,2001,2003,2005],{"class":38,"line":39},[36,1993,43],{"class":42},[36,1995,1996],{"class":46}," view",[36,1998,401],{"class":400},[36,2000,404],{"class":46},[36,2002,408],{"class":407},[36,2004,411],{"class":400},[36,2006,2007],{"class":73},"                    # 包信息\n",[36,2009,2010,2012,2014,2016,2018,2020,2022,2025],{"class":38,"line":57},[36,2011,43],{"class":42},[36,2013,1996],{"class":46},[36,2015,401],{"class":400},[36,2017,404],{"class":46},[36,2019,408],{"class":407},[36,2021,411],{"class":400},[36,2023,2024],{"class":46}," versions",[36,2026,2027],{"class":73},"           # 所有版本\n",[36,2029,2030,2032,2034,2036,2038,2040,2042,2045],{"class":38,"line":64},[36,2031,43],{"class":42},[36,2033,1996],{"class":46},[36,2035,401],{"class":400},[36,2037,404],{"class":46},[36,2039,408],{"class":407},[36,2041,411],{"class":400},[36,2043,2044],{"class":46}," dist-tags",[36,2046,2047],{"class":73},"          # 标签\n",[36,2049,2050,2052,2055,2057,2059,2061,2063,2066],{"class":38,"line":77},[36,2051,43],{"class":42},[36,2053,2054],{"class":46}," info",[36,2056,401],{"class":400},[36,2058,404],{"class":46},[36,2060,408],{"class":407},[36,2062,411],{"class":400},[36,2064,2065],{"class":46}," repository.url",[36,2067,2068],{"class":73},"     # 仓库地址\n",[36,2070,2071],{"class":38,"line":91},[36,2072,61],{"emptyLinePlaceholder":60},[36,2074,2075,2077],{"class":38,"line":104},[36,2076,43],{"class":42},[36,2078,2079],{"class":46}," login\n",[36,2081,2082,2084,2087],{"class":38,"line":115},[36,2083,43],{"class":42},[36,2085,2086],{"class":46}," publish",[36,2088,2089],{"class":73},"                       # 发布\n",[36,2091,2092,2094,2096,2099,2102],{"class":38,"line":126},[36,2093,43],{"class":42},[36,2095,2086],{"class":46},[36,2097,2098],{"class":50}," --access",[36,2100,2101],{"class":46}," public",[36,2103,2104],{"class":73},"       # scoped 包首次发布\n",[36,2106,2107,2109,2111,2114,2117],{"class":38,"line":143},[36,2108,43],{"class":42},[36,2110,2086],{"class":46},[36,2112,2113],{"class":50}," --tag",[36,2115,2116],{"class":46}," beta",[36,2118,2119],{"class":73},"            # 打标签\n",[36,2121,2122,2124,2127,2129,2131,2133,2135,2138],{"class":38,"line":252},[36,2123,43],{"class":42},[36,2125,2126],{"class":46}," unpublish",[36,2128,401],{"class":400},[36,2130,404],{"class":46},[36,2132,408],{"class":407},[36,2134,411],{"class":400},[36,2136,2137],{"class":46},"@1.0.0",[36,2139,2140],{"class":73},"         # 撤销（24h 内）\n",[16,2142,2144],{"id":2143},"九yarn-v1-专属","九、yarn v1 专属",[21,2146,2147],{"id":2147},"workspaces",[26,2149,2151],{"className":1750,"code":2150,"language":1752,"meta":31,"style":31},"{\n  \"private\": true,\n  \"workspaces\": [\"packages\u002F*\"]\n}\n",[33,2152,2153,2157,2169,2183],{"__ignoreMap":31},[36,2154,2155],{"class":38,"line":39},[36,2156,1759],{"class":407},[36,2158,2159,2162,2164,2167],{"class":38,"line":57},[36,2160,2161],{"class":1764},"  \"private\"",[36,2163,1776],{"class":407},[36,2165,2166],{"class":50},"true",[36,2168,1783],{"class":407},[36,2170,2171,2174,2177,2180],{"class":38,"line":64},[36,2172,2173],{"class":1764},"  \"workspaces\"",[36,2175,2176],{"class":407},": [",[36,2178,2179],{"class":1779},"\"packages\u002F*\"",[36,2181,2182],{"class":407},"]\n",[36,2184,2185],{"class":38,"line":77},[36,2186,1811],{"class":407},[26,2188,2190],{"className":28,"code":2189,"language":30,"meta":31,"style":31},"yarn workspace \u003Cpkg> add \u003Cdep>\nyarn workspaces info\n",[33,2191,2192,2218],{"__ignoreMap":31},[36,2193,2194,2196,2199,2201,2203,2205,2207,2209,2211,2214,2216],{"class":38,"line":39},[36,2195,221],{"class":42},[36,2197,2198],{"class":46}," workspace",[36,2200,401],{"class":400},[36,2202,404],{"class":46},[36,2204,408],{"class":407},[36,2206,411],{"class":400},[36,2208,131],{"class":46},[36,2210,401],{"class":400},[36,2212,2213],{"class":46},"de",[36,2215,12],{"class":407},[36,2217,1966],{"class":400},[36,2219,2220,2222,2225],{"class":38,"line":57},[36,2221,221],{"class":42},[36,2223,2224],{"class":46}," workspaces",[36,2226,2227],{"class":46}," info\n",[21,2229,2230],{"id":2230},"常用",[26,2232,2234],{"className":28,"code":2233,"language":30,"meta":31,"style":31},"yarn licenses list                # 许可证\nyarn audit                        # 安全审计\nyarn autoclean --init\n",[33,2235,2236,2248,2258],{"__ignoreMap":31},[36,2237,2238,2240,2243,2245],{"class":38,"line":39},[36,2239,221],{"class":42},[36,2241,2242],{"class":46}," licenses",[36,2244,668],{"class":46},[36,2246,2247],{"class":73},"                # 许可证\n",[36,2249,2250,2252,2255],{"class":38,"line":57},[36,2251,221],{"class":42},[36,2253,2254],{"class":46}," audit",[36,2256,2257],{"class":73},"                        # 安全审计\n",[36,2259,2260,2262,2265],{"class":38,"line":64},[36,2261,221],{"class":42},[36,2263,2264],{"class":46}," autoclean",[36,2266,2267],{"class":50}," --init\n",[361,2269,2270],{},[12,2271,2272],{},"yarn v1 已停止新功能开发，长期建议迁移到 pnpm 或 yarn berry (v2+)。",[16,2274,2276],{"id":2275},"十pnpm-专属","十、pnpm 专属",[21,2278,2279],{"id":2279},"核心优势",[2281,2282,2283,2290,2296],"ul",{},[2284,2285,2286,2289],"li",{},[437,2287,2288],{},"硬链接 + 内容寻址存储","：磁盘只存一份包实体，多项目共享。",[2284,2291,2292,2295],{},[437,2293,2294],{},"非扁平化 node_modules","：只有直接依赖可见，杜绝幽灵依赖。",[2284,2297,2298,2301],{},[437,2299,2300],{},"严格 peerDependencies","：不隐式提升未声明依赖。",[21,2303,2230],{"id":2304},"常用-1",[26,2306,2308],{"className":28,"code":2307,"language":30,"meta":31,"style":31},"pnpm store path                   # store 位置\npnpm store prune                  # 清缓存\npnpm dedupe                       # 去重\npnpm patch \u003Cpkg>                  # 打补丁\npnpm patch-commit \u003Cpath>\n\npnpm add -O \u003Cpkg>                 # optionalDependencies\npnpm add -P \u003Cpkg>                 # peerDependencies\n",[33,2309,2310,2323,2335,2345,2363,2380,2384,2404],{"__ignoreMap":31},[36,2311,2312,2314,2317,2320],{"class":38,"line":39},[36,2313,266],{"class":42},[36,2315,2316],{"class":46}," store",[36,2318,2319],{"class":46}," path",[36,2321,2322],{"class":73},"                   # store 位置\n",[36,2324,2325,2327,2329,2332],{"class":38,"line":57},[36,2326,266],{"class":42},[36,2328,2316],{"class":46},[36,2330,2331],{"class":46}," prune",[36,2333,2334],{"class":73},"                  # 清缓存\n",[36,2336,2337,2339,2342],{"class":38,"line":64},[36,2338,266],{"class":42},[36,2340,2341],{"class":46}," dedupe",[36,2343,2344],{"class":73},"                       # 去重\n",[36,2346,2347,2349,2352,2354,2356,2358,2360],{"class":38,"line":77},[36,2348,266],{"class":42},[36,2350,2351],{"class":46}," patch",[36,2353,401],{"class":400},[36,2355,404],{"class":46},[36,2357,408],{"class":407},[36,2359,411],{"class":400},[36,2361,2362],{"class":73},"                  # 打补丁\n",[36,2364,2365,2367,2370,2372,2375,2378],{"class":38,"line":91},[36,2366,266],{"class":42},[36,2368,2369],{"class":46}," patch-commit",[36,2371,401],{"class":400},[36,2373,2374],{"class":46},"pat",[36,2376,2377],{"class":407},"h",[36,2379,1966],{"class":400},[36,2381,2382],{"class":38,"line":104},[36,2383,61],{"emptyLinePlaceholder":60},[36,2385,2386,2388,2390,2393,2395,2397,2399,2401],{"class":38,"line":115},[36,2387,266],{"class":42},[36,2389,131],{"class":46},[36,2391,2392],{"class":50}," -O",[36,2394,401],{"class":400},[36,2396,404],{"class":46},[36,2398,408],{"class":407},[36,2400,411],{"class":400},[36,2402,2403],{"class":73},"                 # optionalDependencies\n",[36,2405,2406,2408,2410,2413,2415,2417,2419,2421],{"class":38,"line":126},[36,2407,266],{"class":42},[36,2409,131],{"class":46},[36,2411,2412],{"class":50}," -P",[36,2414,401],{"class":400},[36,2416,404],{"class":46},[36,2418,408],{"class":407},[36,2420,411],{"class":400},[36,2422,2423],{"class":73},"                 # peerDependencies\n",[21,2425,2426],{"id":2426},"工作区",[26,2428,2432],{"className":2429,"code":2430,"language":2431,"meta":31,"style":31},"language-yaml shiki shiki-themes monokai","# pnpm-workspace.yaml\npackages:\n  - \"packages\u002F*\"\n  - \"apps\u002F*\"\n","yaml",[33,2433,2434,2439,2444,2449],{"__ignoreMap":31},[36,2435,2436],{"class":38,"line":39},[36,2437,2438],{},"# pnpm-workspace.yaml\n",[36,2440,2441],{"class":38,"line":57},[36,2442,2443],{},"packages:\n",[36,2445,2446],{"class":38,"line":64},[36,2447,2448],{},"  - \"packages\u002F*\"\n",[36,2450,2451],{"class":38,"line":77},[36,2452,2453],{},"  - \"apps\u002F*\"\n",[26,2455,2457],{"className":28,"code":2456,"language":30,"meta":31,"style":31},"pnpm -r build                     # 递归所有包\npnpm --filter web build           # 只跑 web\npnpm --filter \"web...\" build      # web 及其依赖\npnpm --filter \"...web\" build      # web 及其被依赖者\n",[33,2458,2459,2471,2486,2500],{"__ignoreMap":31},[36,2460,2461,2463,2466,2468],{"class":38,"line":39},[36,2462,266],{"class":42},[36,2464,2465],{"class":50}," -r",[36,2467,1671],{"class":46},[36,2469,2470],{"class":73},"                     # 递归所有包\n",[36,2472,2473,2475,2478,2481,2483],{"class":38,"line":57},[36,2474,266],{"class":42},[36,2476,2477],{"class":50}," --filter",[36,2479,2480],{"class":46}," web",[36,2482,1671],{"class":46},[36,2484,2485],{"class":73},"           # 只跑 web\n",[36,2487,2488,2490,2492,2495,2497],{"class":38,"line":64},[36,2489,266],{"class":42},[36,2491,2477],{"class":50},[36,2493,2494],{"class":46}," \"web...\"",[36,2496,1671],{"class":46},[36,2498,2499],{"class":73},"      # web 及其依赖\n",[36,2501,2502,2504,2506,2509,2511],{"class":38,"line":77},[36,2503,266],{"class":42},[36,2505,2477],{"class":50},[36,2507,2508],{"class":46}," \"...web\"",[36,2510,1671],{"class":46},[36,2512,2513],{"class":73},"      # web 及其被依赖者\n",[21,2515,2517],{"id":2516},"npmrc-常用",".npmrc 常用",[26,2519,2521],{"className":443,"code":2520,"language":445,"meta":31,"style":31},"shamefully-hoist=true             # 兼容老包（临时用）\nstrict-peer-dependencies=false\nauto-install-peers=true\nnode-linker=hoisted               # 扁平常见兼容方案\n",[33,2522,2523,2528,2533,2538],{"__ignoreMap":31},[36,2524,2525],{"class":38,"line":39},[36,2526,2527],{},"shamefully-hoist=true             # 兼容老包（临时用）\n",[36,2529,2530],{"class":38,"line":57},[36,2531,2532],{},"strict-peer-dependencies=false\n",[36,2534,2535],{"class":38,"line":64},[36,2536,2537],{},"auto-install-peers=true\n",[36,2539,2540],{"class":38,"line":77},[36,2541,2542],{},"node-linker=hoisted               # 扁平常见兼容方案\n",[16,2544,2546],{"id":2545},"十一常见问题","十一、常见问题",[21,2548,2550,2551,2554],{"id":2549},"_1-err_ossl_evp_unsupportednode-17","1. ",[33,2552,2553],{},"ERR_OSSL_EVP_UNSUPPORTED","（Node 17+）",[12,2556,2557],{},"老项目 + 新 Node，OpenSSL 3 引起。",[26,2559,2561],{"className":28,"code":2560,"language":30,"meta":31,"style":31},"export NODE_OPTIONS=--openssl-legacy-provider\n# 或降级 Node 16\n",[33,2562,2563,2575],{"__ignoreMap":31},[36,2564,2565,2567,2570,2572],{"class":38,"line":39},[36,2566,560],{"class":400},[36,2568,2569],{"class":407}," NODE_OPTIONS",[36,2571,566],{"class":400},[36,2573,2574],{"class":407},"--openssl-legacy-provider\n",[36,2576,2577],{"class":38,"line":57},[36,2578,2579],{"class":73},"# 或降级 Node 16\n",[21,2581,2583,2584,2587],{"id":2582},"_2-eacces-权限错误","2. ",[33,2585,2586],{},"EACCES"," 权限错误",[12,2589,2590,2593],{},[437,2591,2592],{},"别用 sudo","，改 npm 全局目录：",[26,2595,2597],{"className":28,"code":2596,"language":30,"meta":31,"style":31},"mkdir -p ~\u002F.npm-global\nnpm config set prefix '~\u002F.npm-global'\necho 'export PATH=~\u002F.npm-global\u002Fbin:$PATH' >> ~\u002F.bashrc\nsource ~\u002F.bashrc\n",[33,2598,2599,2610,2624,2638],{"__ignoreMap":31},[36,2600,2601,2604,2607],{"class":38,"line":39},[36,2602,2603],{"class":42},"mkdir",[36,2605,2606],{"class":50}," -p",[36,2608,2609],{"class":46}," ~\u002F.npm-global\n",[36,2611,2612,2614,2616,2618,2621],{"class":38,"line":57},[36,2613,43],{"class":42},[36,2615,172],{"class":46},[36,2617,175],{"class":46},[36,2619,2620],{"class":46}," prefix",[36,2622,2623],{"class":46}," '~\u002F.npm-global'\n",[36,2625,2626,2629,2632,2635],{"class":38,"line":64},[36,2627,2628],{"class":1730},"echo",[36,2630,2631],{"class":46}," 'export PATH=~\u002F.npm-global\u002Fbin:$PATH'",[36,2633,2634],{"class":400}," >>",[36,2636,2637],{"class":46}," ~\u002F.bashrc\n",[36,2639,2640,2643],{"class":38,"line":77},[36,2641,2642],{"class":1730},"source",[36,2644,2637],{"class":46},[21,2646,2648,2649,2652],{"id":2647},"_3-peer-dep-冲突npm-7","3. ",[33,2650,2651],{},"peer dep"," 冲突（npm 7+）",[26,2654,2656],{"className":28,"code":2655,"language":30,"meta":31,"style":31},"npm install --legacy-peer-deps    # 按 npm 6 行为忽略 peer 冲突\nnpm install --force               # 强制（危险）\n",[33,2657,2658,2670],{"__ignoreMap":31},[36,2659,2660,2662,2664,2667],{"class":38,"line":39},[36,2661,43],{"class":42},[36,2663,47],{"class":46},[36,2665,2666],{"class":50}," --legacy-peer-deps",[36,2668,2669],{"class":73},"    # 按 npm 6 行为忽略 peer 冲突\n",[36,2671,2672,2674,2676,2679],{"class":38,"line":57},[36,2673,43],{"class":42},[36,2675,47],{"class":46},[36,2677,2678],{"class":50}," --force",[36,2680,2681],{"class":73},"               # 强制（危险）\n",[21,2683,2685],{"id":2684},"_4-安装慢","4. 安装慢",[12,2687,2688],{},"先换源（见第一节）。如果还慢，看是不是在下载 binary：",[26,2690,2692],{"className":28,"code":2691,"language":30,"meta":31,"style":31},"npm install --verbose 2>&1 | grep -i \"http\"\n",[33,2693,2694],{"__ignoreMap":31},[36,2695,2696,2698,2700,2703,2706,2709,2712,2715],{"class":38,"line":39},[36,2697,43],{"class":42},[36,2699,47],{"class":46},[36,2701,2702],{"class":50}," --verbose",[36,2704,2705],{"class":400}," 2>&1",[36,2707,2708],{"class":400}," |",[36,2710,2711],{"class":42}," grep",[36,2713,2714],{"class":50}," -i",[36,2716,2717],{"class":46}," \"http\"\n",[12,2719,2720],{},"看到下载 electron \u002F puppeteer 之类的，就要配对应的 binary 镜像。",[21,2722,2724],{"id":2723},"_5-幽灵依赖","5. 幽灵依赖",[12,2726,2727,2728,2730],{},"代码用了没在 ",[33,2729,1488],{}," 里声明的包（因为被提升到顶层才碰巧能用）。",[12,2732,2733,2736,2737,696,2740,2742],{},[437,2734,2735],{},"根治","：用 pnpm。",[437,2738,2739],{},"缓解",[33,2741,1223],{}," 核对，把用到的都显式声明。",[21,2744,2746],{"id":2745},"_6-ci-报-lock-不一致","6. CI 报 lock 不一致",[12,2748,2749,2750,1562,2752,2755,2756,2758,2759,2761,2762,2765],{},"用 ",[33,2751,1481],{},[33,2753,2754],{},"pnpm install --frozen-lockfile"," 时，",[33,2757,1488],{}," 与 lock 必须同步。本地改完 ",[33,2760,1488],{}," 一定要重跑一次 ",[33,2763,2764],{},"install"," 让 lock 更新，再提交。",[21,2767,2769],{"id":2768},"_7-强制项目使用某个包管理器","7. 强制项目使用某个包管理器",[26,2771,2773],{"className":1750,"code":2772,"language":1752,"meta":31,"style":31},"{\n  \"scripts\": {\n    \"preinstall\": \"npx only-allow pnpm\"\n  }\n}\n",[33,2774,2775,2779,2786,2796,2800],{"__ignoreMap":31},[36,2776,2777],{"class":38,"line":39},[36,2778,1759],{"class":407},[36,2780,2781,2784],{"class":38,"line":57},[36,2782,2783],{"class":1764},"  \"scripts\"",[36,2785,1768],{"class":407},[36,2787,2788,2791,2793],{"class":38,"line":64},[36,2789,2790],{"class":1764},"    \"preinstall\"",[36,2792,1776],{"class":407},[36,2794,2795],{"class":1779},"\"npx only-allow pnpm\"\n",[36,2797,2798],{"class":38,"line":77},[36,2799,1806],{"class":407},[36,2801,2802],{"class":38,"line":91},[36,2803,1811],{"class":407},[21,2805,2807,2808,2811],{"id":2806},"_8-npm-audit-fix-force-引入-breaking-change","8. ",[33,2809,2810],{},"npm audit fix --force"," 引入 breaking change",[12,2813,2814,2817],{},[33,2815,2816],{},"--force"," 会跨越主版本升级。先看不 force 能修多少：",[26,2819,2821],{"className":28,"code":2820,"language":30,"meta":31,"style":31},"npm audit\nnpm audit fix\nnpm audit --production            # 只看生产依赖\n",[33,2822,2823,2830,2839],{"__ignoreMap":31},[36,2824,2825,2827],{"class":38,"line":39},[36,2826,43],{"class":42},[36,2828,2829],{"class":46}," audit\n",[36,2831,2832,2834,2836],{"class":38,"line":57},[36,2833,43],{"class":42},[36,2835,2254],{"class":46},[36,2837,2838],{"class":46}," fix\n",[36,2840,2841,2843,2845,2848],{"class":38,"line":64},[36,2842,43],{"class":42},[36,2844,2254],{"class":46},[36,2846,2847],{"class":50}," --production",[36,2849,2850],{"class":73},"            # 只看生产依赖\n",[16,2852,2854],{"id":2853},"十二安全审计","十二、安全审计",[26,2856,2858],{"className":28,"code":2857,"language":30,"meta":31,"style":31},"npm audit\nyarn audit\npnpm audit\n",[33,2859,2860,2866,2872],{"__ignoreMap":31},[36,2861,2862,2864],{"class":38,"line":39},[36,2863,43],{"class":42},[36,2865,2829],{"class":46},[36,2867,2868,2870],{"class":38,"line":57},[36,2869,221],{"class":42},[36,2871,2829],{"class":46},[36,2873,2874,2876],{"class":38,"line":64},[36,2875,266],{"class":42},[36,2877,2829],{"class":46},[2879,2880],"hr",{},[16,2882,2883],{"id":2883},"参考",[2281,2885,2886,2898,2905,2912],{},[2284,2887,2888,2889],{},"npm 文档：",[2890,2891,2892],"a",{"href":2892,"rel":2893,"target":2897},"https:\u002F\u002Fdocs.npmjs.com\u002F",[2894,2895,2896],"nofollow","noopener","noreferrer","_blank",[2284,2899,2900,2901],{},"yarn v1：",[2890,2902,2903],{"href":2903,"rel":2904,"target":2897},"https:\u002F\u002Fclassic.yarnpkg.com\u002F",[2894,2895,2896],[2284,2906,2907,2908],{},"pnpm：",[2890,2909,2910],{"href":2910,"rel":2911,"target":2897},"https:\u002F\u002Fpnpm.io\u002Fzh\u002F",[2894,2895,2896],[2284,2913,2914,2915],{},"npmmirror：",[2890,2916,2917],{"href":2917,"rel":2918,"target":2897},"https:\u002F\u002Fnpmmirror.com\u002F",[2894,2895,2896],[2920,2921,2922],"style",{},"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 pre.shiki code .sHkqI, html code.shiki .sHkqI{--shiki-default:#A6E22E}html pre.shiki code .s_Ekj, html code.shiki .s_Ekj{--shiki-default:#E6DB74}html pre.shiki code .s7s5_, html code.shiki .s7s5_{--shiki-default:#AE81FF}html pre.shiki code .snpHw, html code.shiki .snpHw{--shiki-default:#88846F}html pre.shiki code .s8I7P, html code.shiki .s8I7P{--shiki-default:#F92672}html pre.shiki code .sCdxs, html code.shiki .sCdxs{--shiki-default:#F8F8F2}html pre.shiki code .sYf5A, html code.shiki .sYf5A{--shiki-default:#66D9EF}html pre.shiki code .sOx1s, html code.shiki .sOx1s{--shiki-default:#66D9EF;--shiki-default-font-style:italic}html pre.shiki code .susgL, html code.shiki .susgL{--shiki-default:#CFCFC2}",{"title":31,"searchDepth":57,"depth":57,"links":2924},[2925,2935,2944,2945,2949,2950,2954,2958,2959,2963,2969,2983,2984],{"id":18,"depth":57,"text":19,"children":2926},[2927,2928,2929,2930,2931,2932,2933,2934],{"id":23,"depth":64,"text":24},{"id":154,"depth":64,"text":155},{"id":288,"depth":64,"text":289},{"id":376,"depth":64,"text":377},{"id":432,"depth":64,"text":433},{"id":481,"depth":64,"text":482},{"id":526,"depth":64,"text":527},{"id":587,"depth":64,"text":588},{"id":674,"depth":57,"text":675,"children":2936},[2937,2938,2939,2940,2941,2942,2943],{"id":689,"depth":64,"text":690},{"id":757,"depth":64,"text":758},{"id":791,"depth":64,"text":792},{"id":825,"depth":64,"text":826},{"id":855,"depth":64,"text":856},{"id":898,"depth":64,"text":899},{"id":919,"depth":64,"text":920},{"id":982,"depth":57,"text":983},{"id":1296,"depth":57,"text":1297,"children":2946},[2947,2948],{"id":1358,"depth":64,"text":1358},{"id":1443,"depth":64,"text":1444},{"id":1492,"depth":57,"text":1493},{"id":1571,"depth":57,"text":1572,"children":2951},[2952,2953],{"id":1575,"depth":64,"text":1575},{"id":1656,"depth":64,"text":1656},{"id":1737,"depth":57,"text":1738,"children":2955},[2956,2957],{"id":1741,"depth":64,"text":1742},{"id":1911,"depth":64,"text":1911},{"id":1983,"depth":57,"text":1984},{"id":2143,"depth":57,"text":2144,"children":2960},[2961,2962],{"id":2147,"depth":64,"text":2147},{"id":2230,"depth":64,"text":2230},{"id":2275,"depth":57,"text":2276,"children":2964},[2965,2966,2967,2968],{"id":2279,"depth":64,"text":2279},{"id":2304,"depth":64,"text":2230},{"id":2426,"depth":64,"text":2426},{"id":2516,"depth":64,"text":2517},{"id":2545,"depth":57,"text":2546,"children":2970},[2971,2973,2975,2977,2978,2979,2980,2981],{"id":2549,"depth":64,"text":2972},"1. ERR_OSSL_EVP_UNSUPPORTED（Node 17+）",{"id":2582,"depth":64,"text":2974},"2. EACCES 权限错误",{"id":2647,"depth":64,"text":2976},"3. peer dep 冲突（npm 7+）",{"id":2684,"depth":64,"text":2685},{"id":2723,"depth":64,"text":2724},{"id":2745,"depth":64,"text":2746},{"id":2768,"depth":64,"text":2769},{"id":2806,"depth":64,"text":2982},"8. npm audit fix --force 引入 breaking change",{"id":2853,"depth":57,"text":2854},{"id":2883,"depth":57,"text":2883},"2026-09-25","md",{},"\u002Fnode-package-managers-memo-2026-09-25",{"title":6,"description":14},"node-package-managers-memo-2026-09-25",[43,221,266,2992,2993],"包管理","备忘录","JkdpCYfPGT7iWzYMx8X-4vzuHBW9MP1FBF9nLBNfuew",1794733997155]