[{"data":1,"prerenderedAt":1320},["ShallowReactive",2],{"doc-page:\u002Fdocs\u002Fnpm-scripts":3},{"doc":4,"prev":1280,"next":1287,"resolvedType":8,"readingMinutes":93,"audience":1294,"checklist":1298,"related":1302},{"path":5,"title":6,"description":7,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13,"body":14},"\u002Fdocs\u002Fnpm-scripts","npm scripts 与工具链","package.json scripts 配置、常用构建工具、Monorepo 管理与发包流程","article",null,"programming-languages","编程语言","2026-02-27","i-carbon-application",{"type":15,"value":16,"toc":1253},"minimark",[17,21,29,33,59,63,234,238,318,327,330,369,372,376,397,403,472,476,492,497,555,559,562,593,598,649,654,667,670,752,756,772,777,861,864,868,945,948,1025,1029,1136,1139,1142,1175,1178,1181,1185,1191,1194,1197,1201,1204,1249],[18,19,6],"h1",{"id":20},"npm-scripts-与工具链",[22,23,24,28],"p",{},[25,26,27],"code",{},"scripts"," 的价值不只是“把命令写短一点”，而是把团队真正需要反复执行的动作收敛成统一入口。这样本地开发、CI 和新成员上手都会更稳。",[30,31,32],"h2",{"id":32},"推荐设计原则",[34,35,36,50,53,56],"ul",{},[37,38,39,40,43,44,43,47],"li",{},"常用动作用清晰短名，如 ",[25,41,42],{},"dev","、",[25,45,46],{},"build",[25,48,49],{},"test",[37,51,52],{},"不要把特别复杂的逻辑硬塞进一行 shell",[37,54,55],{},"本地和 CI 尽量复用同一组脚本名",[37,57,58],{},"项目只保留一套主要包管理器入口",[30,60,62],{"id":61},"packagejson-scripts","package.json scripts",[64,65,70],"pre",{"className":66,"code":67,"language":68,"meta":69,"style":69},"language-json shiki shiki-themes github-light github-dark","{\n  \"scripts\": {\n    \"dev\": \"nuxt dev\",\n    \"build\": \"nuxt build\",\n    \"preview\": \"nuxt preview\",\n    \"lint\": \"eslint .\",\n    \"lint:fix\": \"eslint . --fix\",\n    \"format\": \"prettier --write .\",\n    \"typecheck\": \"nuxi typecheck\",\n    \"test\": \"vitest\",\n    \"test:run\": \"vitest run\",\n    \"prepare\": \"husky\"\n  }\n}\n","json","",[25,71,72,81,91,107,120,133,146,159,172,185,198,211,222,228],{"__ignoreMap":69},[73,74,77],"span",{"class":75,"line":76},"line",1,[73,78,80],{"class":79},"sVt8B","{\n",[73,82,84,88],{"class":75,"line":83},2,[73,85,87],{"class":86},"sj4cs","  \"scripts\"",[73,89,90],{"class":79},": {\n",[73,92,94,97,100,104],{"class":75,"line":93},3,[73,95,96],{"class":86},"    \"dev\"",[73,98,99],{"class":79},": ",[73,101,103],{"class":102},"sZZnC","\"nuxt dev\"",[73,105,106],{"class":79},",\n",[73,108,110,113,115,118],{"class":75,"line":109},4,[73,111,112],{"class":86},"    \"build\"",[73,114,99],{"class":79},[73,116,117],{"class":102},"\"nuxt build\"",[73,119,106],{"class":79},[73,121,123,126,128,131],{"class":75,"line":122},5,[73,124,125],{"class":86},"    \"preview\"",[73,127,99],{"class":79},[73,129,130],{"class":102},"\"nuxt preview\"",[73,132,106],{"class":79},[73,134,136,139,141,144],{"class":75,"line":135},6,[73,137,138],{"class":86},"    \"lint\"",[73,140,99],{"class":79},[73,142,143],{"class":102},"\"eslint .\"",[73,145,106],{"class":79},[73,147,149,152,154,157],{"class":75,"line":148},7,[73,150,151],{"class":86},"    \"lint:fix\"",[73,153,99],{"class":79},[73,155,156],{"class":102},"\"eslint . --fix\"",[73,158,106],{"class":79},[73,160,162,165,167,170],{"class":75,"line":161},8,[73,163,164],{"class":86},"    \"format\"",[73,166,99],{"class":79},[73,168,169],{"class":102},"\"prettier --write .\"",[73,171,106],{"class":79},[73,173,175,178,180,183],{"class":75,"line":174},9,[73,176,177],{"class":86},"    \"typecheck\"",[73,179,99],{"class":79},[73,181,182],{"class":102},"\"nuxi typecheck\"",[73,184,106],{"class":79},[73,186,188,191,193,196],{"class":75,"line":187},10,[73,189,190],{"class":86},"    \"test\"",[73,192,99],{"class":79},[73,194,195],{"class":102},"\"vitest\"",[73,197,106],{"class":79},[73,199,201,204,206,209],{"class":75,"line":200},11,[73,202,203],{"class":86},"    \"test:run\"",[73,205,99],{"class":79},[73,207,208],{"class":102},"\"vitest run\"",[73,210,106],{"class":79},[73,212,214,217,219],{"class":75,"line":213},12,[73,215,216],{"class":86},"    \"prepare\"",[73,218,99],{"class":79},[73,220,221],{"class":102},"\"husky\"\n",[73,223,225],{"class":75,"line":224},13,[73,226,227],{"class":79},"  }\n",[73,229,231],{"class":75,"line":230},14,[73,232,233],{"class":79},"}\n",[235,236,237],"h3",{"id":237},"生命周期钩子",[64,239,241],{"className":66,"code":240,"language":68,"meta":69,"style":69},"{\n  \"scripts\": {\n    \"prebuild\": \"rm -rf dist\",\n    \"build\": \"tsc\",\n    \"postbuild\": \"echo 'Build complete'\",\n    \"preinstall\": \"npx only-allow pnpm\",\n    \"postinstall\": \"nuxt prepare\"\n  }\n}\n",[25,242,243,247,253,265,276,288,300,310,314],{"__ignoreMap":69},[73,244,245],{"class":75,"line":76},[73,246,80],{"class":79},[73,248,249,251],{"class":75,"line":83},[73,250,87],{"class":86},[73,252,90],{"class":79},[73,254,255,258,260,263],{"class":75,"line":93},[73,256,257],{"class":86},"    \"prebuild\"",[73,259,99],{"class":79},[73,261,262],{"class":102},"\"rm -rf dist\"",[73,264,106],{"class":79},[73,266,267,269,271,274],{"class":75,"line":109},[73,268,112],{"class":86},[73,270,99],{"class":79},[73,272,273],{"class":102},"\"tsc\"",[73,275,106],{"class":79},[73,277,278,281,283,286],{"class":75,"line":122},[73,279,280],{"class":86},"    \"postbuild\"",[73,282,99],{"class":79},[73,284,285],{"class":102},"\"echo 'Build complete'\"",[73,287,106],{"class":79},[73,289,290,293,295,298],{"class":75,"line":135},[73,291,292],{"class":86},"    \"preinstall\"",[73,294,99],{"class":79},[73,296,297],{"class":102},"\"npx only-allow pnpm\"",[73,299,106],{"class":79},[73,301,302,305,307],{"class":75,"line":148},[73,303,304],{"class":86},"    \"postinstall\"",[73,306,99],{"class":79},[73,308,309],{"class":102},"\"nuxt prepare\"\n",[73,311,312],{"class":75,"line":161},[73,313,227],{"class":79},[73,315,316],{"class":75,"line":174},[73,317,233],{"class":79},[22,319,320,322,323,326],{},[25,321,64],{}," 和 ",[25,324,325],{},"post"," 前缀会在对应脚本前后自动执行。",[235,328,329],{"id":329},"传递参数",[64,331,335],{"className":332,"code":333,"language":334,"meta":69,"style":69},"language-bash shiki shiki-themes github-light github-dark","npm run test -- --watch\npnpm test --watch          # pnpm 不需要 --\n","bash",[25,336,337,355],{"__ignoreMap":69},[73,338,339,343,346,349,352],{"class":75,"line":76},[73,340,342],{"class":341},"sScJk","npm",[73,344,345],{"class":102}," run",[73,347,348],{"class":102}," test",[73,350,351],{"class":86}," --",[73,353,354],{"class":86}," --watch\n",[73,356,357,360,362,365],{"class":75,"line":83},[73,358,359],{"class":341},"pnpm",[73,361,348],{"class":102},[73,363,364],{"class":86}," --watch",[73,366,368],{"class":367},"sJ8bj","          # pnpm 不需要 --\n",[30,370,371],{"id":371},"代码质量工具",[235,373,375],{"id":374},"eslint","ESLint",[64,377,379],{"className":332,"code":378,"language":334,"meta":69,"style":69},"pnpm add -D eslint @antfu\u002Feslint-config\n",[25,380,381],{"__ignoreMap":69},[73,382,383,385,388,391,394],{"class":75,"line":76},[73,384,359],{"class":341},[73,386,387],{"class":102}," add",[73,389,390],{"class":86}," -D",[73,392,393],{"class":102}," eslint",[73,395,396],{"class":102}," @antfu\u002Feslint-config\n",[22,398,399,402],{},[25,400,401],{},"eslint.config.mjs","：",[64,404,408],{"className":405,"code":406,"language":407,"meta":69,"style":69},"language-javascript shiki shiki-themes github-light github-dark","import antfu from \"@antfu\u002Feslint-config\";\n\nexport default antfu({\n  vue: true,\n  typescript: true,\n});\n","javascript",[25,409,410,428,434,448,458,467],{"__ignoreMap":69},[73,411,412,416,419,422,425],{"class":75,"line":76},[73,413,415],{"class":414},"szBVR","import",[73,417,418],{"class":79}," antfu ",[73,420,421],{"class":414},"from",[73,423,424],{"class":102}," \"@antfu\u002Feslint-config\"",[73,426,427],{"class":79},";\n",[73,429,430],{"class":75,"line":83},[73,431,433],{"emptyLinePlaceholder":432},true,"\n",[73,435,436,439,442,445],{"class":75,"line":93},[73,437,438],{"class":414},"export",[73,440,441],{"class":414}," default",[73,443,444],{"class":341}," antfu",[73,446,447],{"class":79},"({\n",[73,449,450,453,456],{"class":75,"line":109},[73,451,452],{"class":79},"  vue: ",[73,454,455],{"class":86},"true",[73,457,106],{"class":79},[73,459,460,463,465],{"class":75,"line":122},[73,461,462],{"class":79},"  typescript: ",[73,464,455],{"class":86},[73,466,106],{"class":79},[73,468,469],{"class":75,"line":135},[73,470,471],{"class":79},"});\n",[235,473,475],{"id":474},"prettier","Prettier",[64,477,479],{"className":332,"code":478,"language":334,"meta":69,"style":69},"pnpm add -D prettier\n",[25,480,481],{"__ignoreMap":69},[73,482,483,485,487,489],{"class":75,"line":76},[73,484,359],{"class":341},[73,486,387],{"class":102},[73,488,390],{"class":86},[73,490,491],{"class":102}," prettier\n",[22,493,494,402],{},[25,495,496],{},".prettierrc",[64,498,500],{"className":66,"code":499,"language":68,"meta":69,"style":69},"{\n  \"semi\": false,\n  \"singleQuote\": true,\n  \"trailingComma\": \"all\",\n  \"printWidth\": 100\n}\n",[25,501,502,506,518,529,541,551],{"__ignoreMap":69},[73,503,504],{"class":75,"line":76},[73,505,80],{"class":79},[73,507,508,511,513,516],{"class":75,"line":83},[73,509,510],{"class":86},"  \"semi\"",[73,512,99],{"class":79},[73,514,515],{"class":86},"false",[73,517,106],{"class":79},[73,519,520,523,525,527],{"class":75,"line":93},[73,521,522],{"class":86},"  \"singleQuote\"",[73,524,99],{"class":79},[73,526,455],{"class":86},[73,528,106],{"class":79},[73,530,531,534,536,539],{"class":75,"line":109},[73,532,533],{"class":86},"  \"trailingComma\"",[73,535,99],{"class":79},[73,537,538],{"class":102},"\"all\"",[73,540,106],{"class":79},[73,542,543,546,548],{"class":75,"line":122},[73,544,545],{"class":86},"  \"printWidth\"",[73,547,99],{"class":79},[73,549,550],{"class":86},"100\n",[73,552,553],{"class":75,"line":135},[73,554,233],{"class":79},[235,556,558],{"id":557},"lint-staged-husky","lint-staged + Husky",[22,560,561],{},"提交前自动检查：",[64,563,565],{"className":332,"code":564,"language":334,"meta":69,"style":69},"pnpm add -D husky lint-staged\npnpm exec husky init\n",[25,566,567,581],{"__ignoreMap":69},[73,568,569,571,573,575,578],{"class":75,"line":76},[73,570,359],{"class":341},[73,572,387],{"class":102},[73,574,390],{"class":86},[73,576,577],{"class":102}," husky",[73,579,580],{"class":102}," lint-staged\n",[73,582,583,585,588,590],{"class":75,"line":83},[73,584,359],{"class":341},[73,586,587],{"class":102}," exec",[73,589,577],{"class":102},[73,591,592],{"class":102}," init\n",[22,594,595,402],{},[25,596,597],{},"package.json",[64,599,601],{"className":66,"code":600,"language":68,"meta":69,"style":69},"{\n  \"lint-staged\": {\n    \"*.{ts,vue}\": [\"eslint --fix\"],\n    \"*.{json,md,css}\": [\"prettier --write\"]\n  }\n}\n",[25,602,603,607,614,628,641,645],{"__ignoreMap":69},[73,604,605],{"class":75,"line":76},[73,606,80],{"class":79},[73,608,609,612],{"class":75,"line":83},[73,610,611],{"class":86},"  \"lint-staged\"",[73,613,90],{"class":79},[73,615,616,619,622,625],{"class":75,"line":93},[73,617,618],{"class":86},"    \"*.{ts,vue}\"",[73,620,621],{"class":79},": [",[73,623,624],{"class":102},"\"eslint --fix\"",[73,626,627],{"class":79},"],\n",[73,629,630,633,635,638],{"class":75,"line":109},[73,631,632],{"class":86},"    \"*.{json,md,css}\"",[73,634,621],{"class":79},[73,636,637],{"class":102},"\"prettier --write\"",[73,639,640],{"class":79},"]\n",[73,642,643],{"class":75,"line":122},[73,644,227],{"class":79},[73,646,647],{"class":75,"line":135},[73,648,233],{"class":79},[22,650,651,402],{},[25,652,653],{},".husky\u002Fpre-commit",[64,655,657],{"className":332,"code":656,"language":334,"meta":69,"style":69},"pnpm exec lint-staged\n",[25,658,659],{"__ignoreMap":69},[73,660,661,663,665],{"class":75,"line":76},[73,662,359],{"class":341},[73,664,587],{"class":102},[73,666,580],{"class":102},[30,668,669],{"id":669},"构建工具",[671,672,673,686],"table",{},[674,675,676],"thead",{},[677,678,679,683],"tr",{},[680,681,682],"th",{},"工具",[680,684,685],{},"适用场景",[687,688,689,704,716,728,740],"tbody",{},[677,690,691,701],{},[692,693,694],"td",{},[695,696,700],"a",{"href":697,"rel":698},"https:\u002F\u002Fvite.dev\u002F",[699],"nofollow","Vite",[692,702,703],{},"前端应用开发",[677,705,706,713],{},[692,707,708],{},[695,709,712],{"href":710,"rel":711},"https:\u002F\u002Ftsup.egoist.dev\u002F",[699],"tsup",[692,714,715],{},"TypeScript 库打包",[677,717,718,725],{},[692,719,720],{},[695,721,724],{"href":722,"rel":723},"https:\u002F\u002Fgithub.com\u002Funjs\u002Funbuild",[699],"unbuild",[692,726,727],{},"通用库打包",[677,729,730,737],{},[692,731,732],{},[695,733,736],{"href":734,"rel":735},"https:\u002F\u002Frollupjs.org\u002F",[699],"Rollup",[692,738,739],{},"底层打包器",[677,741,742,749],{},[692,743,744],{},[695,745,748],{"href":746,"rel":747},"https:\u002F\u002Fesbuild.github.io\u002F",[699],"esbuild",[692,750,751],{},"极速打包\u002F转译",[235,753,755],{"id":754},"tsup-示例","tsup 示例",[64,757,759],{"className":332,"code":758,"language":334,"meta":69,"style":69},"pnpm add -D tsup\n",[25,760,761],{"__ignoreMap":69},[73,762,763,765,767,769],{"class":75,"line":76},[73,764,359],{"class":341},[73,766,387],{"class":102},[73,768,390],{"class":86},[73,770,771],{"class":102}," tsup\n",[22,773,774,402],{},[25,775,776],{},"tsup.config.ts",[64,778,782],{"className":779,"code":780,"language":781,"meta":69,"style":69},"language-typescript shiki shiki-themes github-light github-dark","import { defineConfig } from \"tsup\";\n\nexport default defineConfig({\n  entry: [\"src\u002Findex.ts\"],\n  format: [\"cjs\", \"esm\"],\n  dts: true,\n  clean: true,\n});\n","typescript",[25,783,784,798,802,813,823,839,848,857],{"__ignoreMap":69},[73,785,786,788,791,793,796],{"class":75,"line":76},[73,787,415],{"class":414},[73,789,790],{"class":79}," { defineConfig } ",[73,792,421],{"class":414},[73,794,795],{"class":102}," \"tsup\"",[73,797,427],{"class":79},[73,799,800],{"class":75,"line":83},[73,801,433],{"emptyLinePlaceholder":432},[73,803,804,806,808,811],{"class":75,"line":93},[73,805,438],{"class":414},[73,807,441],{"class":414},[73,809,810],{"class":341}," defineConfig",[73,812,447],{"class":79},[73,814,815,818,821],{"class":75,"line":109},[73,816,817],{"class":79},"  entry: [",[73,819,820],{"class":102},"\"src\u002Findex.ts\"",[73,822,627],{"class":79},[73,824,825,828,831,834,837],{"class":75,"line":122},[73,826,827],{"class":79},"  format: [",[73,829,830],{"class":102},"\"cjs\"",[73,832,833],{"class":79},", ",[73,835,836],{"class":102},"\"esm\"",[73,838,627],{"class":79},[73,840,841,844,846],{"class":75,"line":135},[73,842,843],{"class":79},"  dts: ",[73,845,455],{"class":86},[73,847,106],{"class":79},[73,849,850,853,855],{"class":75,"line":148},[73,851,852],{"class":79},"  clean: ",[73,854,455],{"class":86},[73,856,106],{"class":79},[73,858,859],{"class":75,"line":161},[73,860,471],{"class":79},[30,862,863],{"id":863},"版本管理与发包",[235,865,867],{"id":866},"changesets","Changesets",[64,869,871],{"className":332,"code":870,"language":334,"meta":69,"style":69},"pnpm add -D @changesets\u002Fcli\npnpm changeset init\n\n# 添加变更记录\npnpm changeset\n\n# 更新版本号\npnpm changeset version\n\n# 发布\npnpm changeset publish\n",[25,872,873,884,893,897,902,909,913,918,927,931,936],{"__ignoreMap":69},[73,874,875,877,879,881],{"class":75,"line":76},[73,876,359],{"class":341},[73,878,387],{"class":102},[73,880,390],{"class":86},[73,882,883],{"class":102}," @changesets\u002Fcli\n",[73,885,886,888,891],{"class":75,"line":83},[73,887,359],{"class":341},[73,889,890],{"class":102}," changeset",[73,892,592],{"class":102},[73,894,895],{"class":75,"line":93},[73,896,433],{"emptyLinePlaceholder":432},[73,898,899],{"class":75,"line":109},[73,900,901],{"class":367},"# 添加变更记录\n",[73,903,904,906],{"class":75,"line":122},[73,905,359],{"class":341},[73,907,908],{"class":102}," changeset\n",[73,910,911],{"class":75,"line":135},[73,912,433],{"emptyLinePlaceholder":432},[73,914,915],{"class":75,"line":148},[73,916,917],{"class":367},"# 更新版本号\n",[73,919,920,922,924],{"class":75,"line":161},[73,921,359],{"class":341},[73,923,890],{"class":102},[73,925,926],{"class":102}," version\n",[73,928,929],{"class":75,"line":174},[73,930,433],{"emptyLinePlaceholder":432},[73,932,933],{"class":75,"line":187},[73,934,935],{"class":367},"# 发布\n",[73,937,938,940,942],{"class":75,"line":200},[73,939,359],{"class":341},[73,941,890],{"class":102},[73,943,944],{"class":102}," publish\n",[235,946,947],{"id":947},"手动发包",[64,949,951],{"className":332,"code":950,"language":334,"meta":69,"style":69},"# 更新版本\nnpm version patch    # 0.0.1 -> 0.0.2\nnpm version minor    # 0.0.2 -> 0.1.0\nnpm version major    # 0.1.0 -> 1.0.0\n\n# 发布\nnpm publish\nnpm publish --access public  # Scoped 包\n",[25,952,953,958,971,983,995,999,1003,1009],{"__ignoreMap":69},[73,954,955],{"class":75,"line":76},[73,956,957],{"class":367},"# 更新版本\n",[73,959,960,962,965,968],{"class":75,"line":83},[73,961,342],{"class":341},[73,963,964],{"class":102}," version",[73,966,967],{"class":102}," patch",[73,969,970],{"class":367},"    # 0.0.1 -> 0.0.2\n",[73,972,973,975,977,980],{"class":75,"line":93},[73,974,342],{"class":341},[73,976,964],{"class":102},[73,978,979],{"class":102}," minor",[73,981,982],{"class":367},"    # 0.0.2 -> 0.1.0\n",[73,984,985,987,989,992],{"class":75,"line":109},[73,986,342],{"class":341},[73,988,964],{"class":102},[73,990,991],{"class":102}," major",[73,993,994],{"class":367},"    # 0.1.0 -> 1.0.0\n",[73,996,997],{"class":75,"line":122},[73,998,433],{"emptyLinePlaceholder":432},[73,1000,1001],{"class":75,"line":135},[73,1002,935],{"class":367},[73,1004,1005,1007],{"class":75,"line":148},[73,1006,342],{"class":341},[73,1008,944],{"class":102},[73,1010,1011,1013,1016,1019,1022],{"class":75,"line":161},[73,1012,342],{"class":341},[73,1014,1015],{"class":102}," publish",[73,1017,1018],{"class":86}," --access",[73,1020,1021],{"class":102}," public",[73,1023,1024],{"class":367},"  # Scoped 包\n",[30,1026,1028],{"id":1027},"实用-npxdlx-命令","实用 npx\u002Fdlx 命令",[64,1030,1032],{"className":332,"code":1031,"language":334,"meta":69,"style":69},"# 创建项目\npnpm dlx create-vite\npnpm dlx nuxi init my-app\npnpm dlx create-next-app\n\n# 一次性工具\npnpm dlx taze          # 检查依赖更新\npnpm dlx depcheck      # 检查未使用依赖\npnpm dlx npm-check-updates -u  # 更新 package.json\npnpm dlx serve dist    # 快速启动静态服务器\n",[25,1033,1034,1039,1049,1064,1073,1077,1082,1094,1106,1121],{"__ignoreMap":69},[73,1035,1036],{"class":75,"line":76},[73,1037,1038],{"class":367},"# 创建项目\n",[73,1040,1041,1043,1046],{"class":75,"line":83},[73,1042,359],{"class":341},[73,1044,1045],{"class":102}," dlx",[73,1047,1048],{"class":102}," create-vite\n",[73,1050,1051,1053,1055,1058,1061],{"class":75,"line":93},[73,1052,359],{"class":341},[73,1054,1045],{"class":102},[73,1056,1057],{"class":102}," nuxi",[73,1059,1060],{"class":102}," init",[73,1062,1063],{"class":102}," my-app\n",[73,1065,1066,1068,1070],{"class":75,"line":109},[73,1067,359],{"class":341},[73,1069,1045],{"class":102},[73,1071,1072],{"class":102}," create-next-app\n",[73,1074,1075],{"class":75,"line":122},[73,1076,433],{"emptyLinePlaceholder":432},[73,1078,1079],{"class":75,"line":135},[73,1080,1081],{"class":367},"# 一次性工具\n",[73,1083,1084,1086,1088,1091],{"class":75,"line":148},[73,1085,359],{"class":341},[73,1087,1045],{"class":102},[73,1089,1090],{"class":102}," taze",[73,1092,1093],{"class":367},"          # 检查依赖更新\n",[73,1095,1096,1098,1100,1103],{"class":75,"line":161},[73,1097,359],{"class":341},[73,1099,1045],{"class":102},[73,1101,1102],{"class":102}," depcheck",[73,1104,1105],{"class":367},"      # 检查未使用依赖\n",[73,1107,1108,1110,1112,1115,1118],{"class":75,"line":174},[73,1109,359],{"class":341},[73,1111,1045],{"class":102},[73,1113,1114],{"class":102}," npm-check-updates",[73,1116,1117],{"class":86}," -u",[73,1119,1120],{"class":367},"  # 更新 package.json\n",[73,1122,1123,1125,1127,1130,1133],{"class":75,"line":187},[73,1124,359],{"class":341},[73,1126,1045],{"class":102},[73,1128,1129],{"class":102}," serve",[73,1131,1132],{"class":102}," dist",[73,1134,1135],{"class":367},"    # 快速启动静态服务器\n",[30,1137,1138],{"id":1138},"参考链接",[30,1140,1141],{"id":1141},"推荐的最小脚本集",[34,1143,1144,1148,1152,1161,1165,1170],{},[37,1145,1146],{},[25,1147,42],{},[37,1149,1150],{},[25,1151,46],{},[37,1153,1154,1157,1158],{},[25,1155,1156],{},"preview"," 或 ",[25,1159,1160],{},"start",[37,1162,1163],{},[25,1164,49],{},[37,1166,1167],{},[25,1168,1169],{},"lint",[37,1171,1172],{},[25,1173,1174],{},"typecheck",[22,1176,1177],{},"这套最小集合已经能覆盖大多数现代前端或 Node 项目的日常工作流。",[30,1179,1180],{"id":1180},"常见问题",[235,1182,1184],{"id":1183},"为什么脚本在我电脑能跑在-ci-不行","为什么脚本在我电脑能跑，在 CI 不行",[22,1186,1187,1188,1190],{},"通常是环境变量、路径、Shell 差异或依赖安装方式不一致。优先让 CI 也调用同名 ",[25,1189,27],{},"，而不是写两套命令。",[235,1192,1193],{"id":1193},"脚本越来越长怎么办",[22,1195,1196],{},"当一条脚本开始塞很多条件、循环和平台分支时，通常就该把它拆到独立脚本文件里。",[235,1198,1200],{"id":1199},"npmpnpmbun-的脚本要不要混着写","npm、pnpm、bun 的脚本要不要混着写",[22,1202,1203],{},"不建议。项目里最好明确主入口，避免不同成员执行出不同依赖树和行为。",[34,1205,1206,1214,1221,1227,1235,1242],{},[37,1207,1208,1213],{},[695,1209,1212],{"href":1210,"rel":1211},"https:\u002F\u002Fdocs.npmjs.com\u002Fcli\u002Fusing-npm\u002Fscripts",[699],"npm scripts 文档"," — 官方文档",[37,1215,1216,1220],{},[695,1217,375],{"href":1218,"rel":1219},"https:\u002F\u002Feslint.org\u002F",[699]," — 官网",[37,1222,1223,1220],{},[695,1224,475],{"href":1225,"rel":1226},"https:\u002F\u002Fprettier.io\u002F",[699],[37,1228,1229,1234],{},[695,1230,1233],{"href":1231,"rel":1232},"https:\u002F\u002Ftypicode.github.io\u002Fhusky\u002F",[699],"Husky"," — Git Hooks",[37,1236,1237,1241],{},[695,1238,867],{"href":1239,"rel":1240},"https:\u002F\u002Fgithub.com\u002Fchangesets\u002Fchangesets",[699]," — 版本管理",[37,1243,1244,1248],{},[695,1245,1247],{"href":1246},"\u002Fdocs\u002Fnodejs-ecosystem","Node.js 生态工具链"," — 如果你还没统一版本管理器和包管理器",[1250,1251,1252],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":69,"searchDepth":83,"depth":83,"links":1254},[1255,1256,1260,1265,1268,1272,1273,1274,1275],{"id":32,"depth":83,"text":32},{"id":61,"depth":83,"text":62,"children":1257},[1258,1259],{"id":237,"depth":93,"text":237},{"id":329,"depth":93,"text":329},{"id":371,"depth":83,"text":371,"children":1261},[1262,1263,1264],{"id":374,"depth":93,"text":375},{"id":474,"depth":93,"text":475},{"id":557,"depth":93,"text":558},{"id":669,"depth":83,"text":669,"children":1266},[1267],{"id":754,"depth":93,"text":755},{"id":863,"depth":83,"text":863,"children":1269},[1270,1271],{"id":866,"depth":93,"text":867},{"id":947,"depth":93,"text":947},{"id":1027,"depth":83,"text":1028},{"id":1138,"depth":83,"text":1138},{"id":1141,"depth":83,"text":1141},{"id":1180,"depth":83,"text":1180,"children":1276},[1277,1278,1279],{"id":1183,"depth":93,"text":1184},{"id":1193,"depth":93,"text":1193},{"id":1199,"depth":93,"text":1200},{"path":1281,"title":1282,"description":1283,"docType":8,"resourceKind":9,"categoryId":1284,"categoryLabel":1285,"updatedAt":12,"publishedAt":12,"icon":1286},"\u002Fdocs\u002Fnginx-config","Nginx 配置指南","Nginx 安装、反向代理、HTTPS 配置、负载均衡与性能优化","infra-deployment","服务器与部署","i-carbon-cloud",{"path":1288,"title":1289,"description":1290,"docType":8,"resourceKind":9,"categoryId":1291,"categoryLabel":1292,"updatedAt":12,"publishedAt":12,"icon":1293},"\u002Fdocs\u002Fpowershell-tips","PowerShell 实用技巧","PowerShell 常用命令、脚本编写、文件操作、系统管理与自动化","dev-environment","开发环境","i-carbon-code",[1295,1296,1297],"希望把零散经验整理成长期可复用工作流的人","想先建立认知，再决定是否深入实践的人","希望阅读时顺手建立自己的操作清单或收藏体系的人",[1299,1300,1301],"先浏览标题、摘要和目录，带着问题阅读会更高效","顺手记录真正对你有用的命令、链接和注意事项，避免重复搜索","如果页面里提到相关文档，尽量一起打开对照，效果通常更完整",[1303,1308,1312,1316],{"path":1304,"title":1305,"description":1306,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1307,"publishedAt":1307,"icon":13},"\u002Fdocs\u002Ftesting-guide","前端测试指南","Vitest 单元测试、Playwright E2E 测试、测试策略与最佳实践","2026-02-28",{"path":1309,"title":1310,"description":1311,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1307,"publishedAt":1307,"icon":13},"\u002Fdocs\u002Fbun-deno","Bun 与 Deno 运行时","Bun 和 Deno 的安装使用、与 Node.js 对比、包管理与实用命令",{"path":1313,"title":1314,"description":1315,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1307,"publishedAt":1307,"icon":13},"\u002Fdocs\u002Fcss-tricks","CSS 实用技巧","现代 CSS 特性、布局技巧、动画、暗色模式与常用代码片段",{"path":1317,"title":1318,"description":1319,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1307,"publishedAt":1307,"icon":13},"\u002Fdocs\u002Fredis-guide","Redis 使用指南","Redis 安装、数据类型、常用命令、缓存策略与 Node.js 集成",1776215713790]