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