[{"data":1,"prerenderedAt":1554},["ShallowReactive",2],{"doc-page:\u002Fdocs\u002Fbun-deno":3},{"doc":4,"prev":1514,"next":1521,"resolvedType":8,"readingMinutes":113,"audience":1528,"checklist":1532,"related":1536},{"path":5,"title":6,"description":7,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13,"body":14},"\u002Fdocs\u002Fbun-deno","Bun 与 Deno 运行时","Bun 和 Deno 的安装使用、与 Node.js 对比、包管理与实用命令","article",null,"programming-languages","编程语言","2026-02-28","i-carbon-application",{"type":15,"value":16,"toc":1484},"minimark",[17,21,25,29,62,66,75,79,170,173,219,222,297,304,308,322,326,600,603,625,705,708,755,759,766,769,823,826,897,900,903,993,996,1090,1116,1123,1142,1146,1173,1176,1246,1249,1348,1351,1354,1369,1372,1376,1379,1393,1397,1400,1404,1407,1410,1421,1424,1456,1459,1480],[18,19,6],"h1",{"id":20},"bun-与-deno-运行时",[22,23,24],"p",{},"这页适合作为“Node.js 之外现代 JavaScript 运行时的入门比较”。Bun 和 Deno 都很强，但它们适合解决的问题并不完全一样；先按项目目标选，比单纯追新更重要。",[26,27,28],"h2",{"id":28},"先按场景选",[30,31,32,40,45,51,56],"ul",{},[33,34,35,39],"li",{},[36,37,38],"strong",{},"想在 Node 生态里提速","：优先 Bun",[33,41,42,39],{},[36,43,44],{},"想一套工具同时管运行、测试、打包",[33,46,47,50],{},[36,48,49],{},"想要默认权限隔离与更强约束","：优先 Deno",[33,52,53,50],{},[36,54,55],{},"想要标准 Web API 风格和内置工具链",[33,57,58,61],{},[36,59,60],{},"已有大型 Node 项目要稳妥迁移","：先小范围尝试，不要整仓库直接切",[26,63,65],{"id":64},"bun","Bun",[22,67,68,74],{},[69,70,65],"a",{"href":71,"rel":72},"https:\u002F\u002Fbun.sh\u002F",[73],"nofollow"," 是用 Zig 编写的高性能 JavaScript 运行时，集成了包管理器、打包器和测试运行器。",[76,77,78],"h3",{"id":78},"安装",[80,81,86],"pre",{"className":82,"code":83,"language":84,"meta":85,"style":85},"language-powershell shiki shiki-themes github-light github-dark","# Windows\nscoop install bun\n# 或\npowershell -c \"irm bun.sh\u002Finstall.ps1 | iex\"\n\n# macOS\u002FLinux\ncurl -fsSL https:\u002F\u002Fbun.sh\u002Finstall | bash\n","powershell","",[87,88,89,98,105,111,128,135,141],"code",{"__ignoreMap":85},[90,91,94],"span",{"class":92,"line":93},"line",1,[90,95,97],{"class":96},"sJ8bj","# Windows\n",[90,99,101],{"class":92,"line":100},2,[90,102,104],{"class":103},"sVt8B","scoop install bun\n",[90,106,108],{"class":92,"line":107},3,[90,109,110],{"class":96},"# 或\n",[90,112,114,117,121,124],{"class":92,"line":113},4,[90,115,116],{"class":103},"powershell ",[90,118,120],{"class":119},"szBVR","-",[90,122,123],{"class":103},"c ",[90,125,127],{"class":126},"sZZnC","\"irm bun.sh\u002Finstall.ps1 | iex\"\n",[90,129,131],{"class":92,"line":130},5,[90,132,134],{"emptyLinePlaceholder":133},true,"\n",[90,136,138],{"class":92,"line":137},6,[90,139,140],{"class":96},"# macOS\u002FLinux\n",[90,142,144,147,149,152,155,158,161,164,167],{"class":92,"line":143},7,[90,145,146],{"class":103},"curl ",[90,148,120],{"class":119},[90,150,151],{"class":103},"fsSL https:",[90,153,154],{"class":119},"\u002F\u002F",[90,156,157],{"class":103},"bun.sh",[90,159,160],{"class":119},"\u002F",[90,162,163],{"class":103},"install ",[90,165,166],{"class":119},"|",[90,168,169],{"class":103}," bash\n",[76,171,172],{"id":172},"运行脚本",[80,174,178],{"className":175,"code":176,"language":177,"meta":85,"style":85},"language-bash shiki shiki-themes github-light github-dark","bun run index.ts          # 直接运行 TypeScript\nbun run dev               # 运行 package.json scripts\nbun --watch index.ts      # 文件变更自动重启\n","bash",[87,179,180,194,206],{"__ignoreMap":85},[90,181,182,185,188,191],{"class":92,"line":93},[90,183,64],{"class":184},"sScJk",[90,186,187],{"class":126}," run",[90,189,190],{"class":126}," index.ts",[90,192,193],{"class":96},"          # 直接运行 TypeScript\n",[90,195,196,198,200,203],{"class":92,"line":100},[90,197,64],{"class":184},[90,199,187],{"class":126},[90,201,202],{"class":126}," dev",[90,204,205],{"class":96},"               # 运行 package.json scripts\n",[90,207,208,210,214,216],{"class":92,"line":107},[90,209,64],{"class":184},[90,211,213],{"class":212},"sj4cs"," --watch",[90,215,190],{"class":126},[90,217,218],{"class":96},"      # 文件变更自动重启\n",[76,220,221],{"id":221},"包管理",[80,223,225],{"className":175,"code":224,"language":177,"meta":85,"style":85},"bun init                  # 初始化项目\nbun add express           # 添加依赖\nbun add -d vitest         # 添加开发依赖\nbun remove express        # 移除\nbun install               # 安装所有依赖\nbun update                # 更新依赖\n",[87,226,227,237,250,265,277,287],{"__ignoreMap":85},[90,228,229,231,234],{"class":92,"line":93},[90,230,64],{"class":184},[90,232,233],{"class":126}," init",[90,235,236],{"class":96},"                  # 初始化项目\n",[90,238,239,241,244,247],{"class":92,"line":100},[90,240,64],{"class":184},[90,242,243],{"class":126}," add",[90,245,246],{"class":126}," express",[90,248,249],{"class":96},"           # 添加依赖\n",[90,251,252,254,256,259,262],{"class":92,"line":107},[90,253,64],{"class":184},[90,255,243],{"class":126},[90,257,258],{"class":212}," -d",[90,260,261],{"class":126}," vitest",[90,263,264],{"class":96},"         # 添加开发依赖\n",[90,266,267,269,272,274],{"class":92,"line":113},[90,268,64],{"class":184},[90,270,271],{"class":126}," remove",[90,273,246],{"class":126},[90,275,276],{"class":96},"        # 移除\n",[90,278,279,281,284],{"class":92,"line":130},[90,280,64],{"class":184},[90,282,283],{"class":126}," install",[90,285,286],{"class":96},"               # 安装所有依赖\n",[90,288,289,291,294],{"class":92,"line":137},[90,290,64],{"class":184},[90,292,293],{"class":126}," update",[90,295,296],{"class":96},"                # 更新依赖\n",[22,298,299,300,303],{},"Bun 使用 ",[87,301,302],{},"bun.lock","（二进制格式），速度远快于 npm\u002Fpnpm。",[76,305,307],{"id":306},"bun-更适合什么","Bun 更适合什么",[30,309,310,313,316,319],{},[33,311,312],{},"前端工具链",[33,314,315],{},"本地脚本和 CLI",[33,317,318],{},"追求安装速度、测试速度和开发反馈速度的项目",[33,320,321],{},"与 Node.js 兼容度要求高，但想减少工具碎片化的团队",[76,323,325],{"id":324},"内置-api","内置 API",[80,327,331],{"className":328,"code":329,"language":330,"meta":85,"style":85},"language-typescript shiki shiki-themes github-light github-dark","\u002F\u002F 文件操作\nconst file = Bun.file(\"data.json\");\nconst text = await file.text();\nawait Bun.write(\"output.txt\", \"hello\");\n\n\u002F\u002F HTTP 服务器\nBun.serve({\n  port: 3000,\n  fetch(req) {\n    return new Response(\"Hello Bun!\");\n  },\n});\n\n\u002F\u002F 密码哈希\nconst hash = await Bun.password.hash(\"mypassword\");\nconst valid = await Bun.password.verify(\"mypassword\", hash);\n\n\u002F\u002F Shell\nimport { $ } from \"bun\";\nconst result = await $`ls -la`.text();\n","typescript",[87,332,333,338,364,385,408,412,417,428,440,455,474,480,486,491,497,522,546,551,557,575],{"__ignoreMap":85},[90,334,335],{"class":92,"line":93},[90,336,337],{"class":96},"\u002F\u002F 文件操作\n",[90,339,340,343,346,349,352,355,358,361],{"class":92,"line":100},[90,341,342],{"class":119},"const",[90,344,345],{"class":212}," file",[90,347,348],{"class":119}," =",[90,350,351],{"class":103}," Bun.",[90,353,354],{"class":184},"file",[90,356,357],{"class":103},"(",[90,359,360],{"class":126},"\"data.json\"",[90,362,363],{"class":103},");\n",[90,365,366,368,371,373,376,379,382],{"class":92,"line":107},[90,367,342],{"class":119},[90,369,370],{"class":212}," text",[90,372,348],{"class":119},[90,374,375],{"class":119}," await",[90,377,378],{"class":103}," file.",[90,380,381],{"class":184},"text",[90,383,384],{"class":103},"();\n",[90,386,387,390,392,395,397,400,403,406],{"class":92,"line":113},[90,388,389],{"class":119},"await",[90,391,351],{"class":103},[90,393,394],{"class":184},"write",[90,396,357],{"class":103},[90,398,399],{"class":126},"\"output.txt\"",[90,401,402],{"class":103},", ",[90,404,405],{"class":126},"\"hello\"",[90,407,363],{"class":103},[90,409,410],{"class":92,"line":130},[90,411,134],{"emptyLinePlaceholder":133},[90,413,414],{"class":92,"line":137},[90,415,416],{"class":96},"\u002F\u002F HTTP 服务器\n",[90,418,419,422,425],{"class":92,"line":143},[90,420,421],{"class":103},"Bun.",[90,423,424],{"class":184},"serve",[90,426,427],{"class":103},"({\n",[90,429,431,434,437],{"class":92,"line":430},8,[90,432,433],{"class":103},"  port: ",[90,435,436],{"class":212},"3000",[90,438,439],{"class":103},",\n",[90,441,443,446,448,452],{"class":92,"line":442},9,[90,444,445],{"class":184},"  fetch",[90,447,357],{"class":103},[90,449,451],{"class":450},"s4XuR","req",[90,453,454],{"class":103},") {\n",[90,456,458,461,464,467,469,472],{"class":92,"line":457},10,[90,459,460],{"class":119},"    return",[90,462,463],{"class":119}," new",[90,465,466],{"class":184}," Response",[90,468,357],{"class":103},[90,470,471],{"class":126},"\"Hello Bun!\"",[90,473,363],{"class":103},[90,475,477],{"class":92,"line":476},11,[90,478,479],{"class":103},"  },\n",[90,481,483],{"class":92,"line":482},12,[90,484,485],{"class":103},"});\n",[90,487,489],{"class":92,"line":488},13,[90,490,134],{"emptyLinePlaceholder":133},[90,492,494],{"class":92,"line":493},14,[90,495,496],{"class":96},"\u002F\u002F 密码哈希\n",[90,498,500,502,505,507,509,512,515,517,520],{"class":92,"line":499},15,[90,501,342],{"class":119},[90,503,504],{"class":212}," hash",[90,506,348],{"class":119},[90,508,375],{"class":119},[90,510,511],{"class":103}," Bun.password.",[90,513,514],{"class":184},"hash",[90,516,357],{"class":103},[90,518,519],{"class":126},"\"mypassword\"",[90,521,363],{"class":103},[90,523,525,527,530,532,534,536,539,541,543],{"class":92,"line":524},16,[90,526,342],{"class":119},[90,528,529],{"class":212}," valid",[90,531,348],{"class":119},[90,533,375],{"class":119},[90,535,511],{"class":103},[90,537,538],{"class":184},"verify",[90,540,357],{"class":103},[90,542,519],{"class":126},[90,544,545],{"class":103},", hash);\n",[90,547,549],{"class":92,"line":548},17,[90,550,134],{"emptyLinePlaceholder":133},[90,552,554],{"class":92,"line":553},18,[90,555,556],{"class":96},"\u002F\u002F Shell\n",[90,558,560,563,566,569,572],{"class":92,"line":559},19,[90,561,562],{"class":119},"import",[90,564,565],{"class":103}," { $ } ",[90,567,568],{"class":119},"from",[90,570,571],{"class":126}," \"bun\"",[90,573,574],{"class":103},";\n",[90,576,578,580,583,585,587,590,593,596,598],{"class":92,"line":577},20,[90,579,342],{"class":119},[90,581,582],{"class":212}," result",[90,584,348],{"class":119},[90,586,375],{"class":119},[90,588,589],{"class":184}," $",[90,591,592],{"class":126},"`ls -la`",[90,594,595],{"class":103},".",[90,597,381],{"class":184},[90,599,384],{"class":103},[76,601,602],{"id":602},"测试",[80,604,606],{"className":175,"code":605,"language":177,"meta":85,"style":85},"bun test\nbun test --watch\n",[87,607,608,615],{"__ignoreMap":85},[90,609,610,612],{"class":92,"line":93},[90,611,64],{"class":184},[90,613,614],{"class":126}," test\n",[90,616,617,619,622],{"class":92,"line":100},[90,618,64],{"class":184},[90,620,621],{"class":126}," test",[90,623,624],{"class":212}," --watch\n",[80,626,628],{"className":328,"code":627,"language":330,"meta":85,"style":85},"\u002F\u002F test.ts\nimport { expect, test } from \"bun:test\";\n\ntest(\"2 + 2\", () => {\n  expect(2 + 2).toBe(4);\n});\n",[87,629,630,635,649,653,672,701],{"__ignoreMap":85},[90,631,632],{"class":92,"line":93},[90,633,634],{"class":96},"\u002F\u002F test.ts\n",[90,636,637,639,642,644,647],{"class":92,"line":100},[90,638,562],{"class":119},[90,640,641],{"class":103}," { expect, test } ",[90,643,568],{"class":119},[90,645,646],{"class":126}," \"bun:test\"",[90,648,574],{"class":103},[90,650,651],{"class":92,"line":107},[90,652,134],{"emptyLinePlaceholder":133},[90,654,655,658,660,663,666,669],{"class":92,"line":113},[90,656,657],{"class":184},"test",[90,659,357],{"class":103},[90,661,662],{"class":126},"\"2 + 2\"",[90,664,665],{"class":103},", () ",[90,667,668],{"class":119},"=>",[90,670,671],{"class":103}," {\n",[90,673,674,677,679,682,685,688,691,694,696,699],{"class":92,"line":130},[90,675,676],{"class":184},"  expect",[90,678,357],{"class":103},[90,680,681],{"class":212},"2",[90,683,684],{"class":119}," +",[90,686,687],{"class":212}," 2",[90,689,690],{"class":103},").",[90,692,693],{"class":184},"toBe",[90,695,357],{"class":103},[90,697,698],{"class":212},"4",[90,700,363],{"class":103},[90,702,703],{"class":92,"line":137},[90,704,485],{"class":103},[76,706,707],{"id":707},"打包",[80,709,711],{"className":175,"code":710,"language":177,"meta":85,"style":85},"bun build .\u002Fsrc\u002Findex.ts --outdir .\u002Fdist --target browser\nbun build .\u002Fsrc\u002Findex.ts --outdir .\u002Fdist --target node --minify\n",[87,712,713,735],{"__ignoreMap":85},[90,714,715,717,720,723,726,729,732],{"class":92,"line":93},[90,716,64],{"class":184},[90,718,719],{"class":126}," build",[90,721,722],{"class":126}," .\u002Fsrc\u002Findex.ts",[90,724,725],{"class":212}," --outdir",[90,727,728],{"class":126}," .\u002Fdist",[90,730,731],{"class":212}," --target",[90,733,734],{"class":126}," browser\n",[90,736,737,739,741,743,745,747,749,752],{"class":92,"line":100},[90,738,64],{"class":184},[90,740,719],{"class":126},[90,742,722],{"class":126},[90,744,725],{"class":212},[90,746,728],{"class":126},[90,748,731],{"class":212},[90,750,751],{"class":126}," node",[90,753,754],{"class":212}," --minify\n",[26,756,758],{"id":757},"deno","Deno",[22,760,761,765],{},[69,762,758],{"href":763,"rel":764},"https:\u002F\u002Fdeno.com\u002F",[73]," 是 Node.js 创始人 Ryan Dahl 的新运行时，默认安全、原生 TypeScript。",[76,767,78],{"id":768},"安装-1",[80,770,772],{"className":82,"code":771,"language":84,"meta":85,"style":85},"# Windows\nscoop install deno\n# 或\nwinget install DenoLand.Deno\n\n# macOS\u002FLinux\ncurl -fsSL https:\u002F\u002Fdeno.land\u002Finstall.sh | sh\n",[87,773,774,778,783,787,792,796,800],{"__ignoreMap":85},[90,775,776],{"class":92,"line":93},[90,777,97],{"class":96},[90,779,780],{"class":92,"line":100},[90,781,782],{"class":103},"scoop install deno\n",[90,784,785],{"class":92,"line":107},[90,786,110],{"class":96},[90,788,789],{"class":92,"line":113},[90,790,791],{"class":103},"winget install DenoLand.Deno\n",[90,793,794],{"class":92,"line":130},[90,795,134],{"emptyLinePlaceholder":133},[90,797,798],{"class":92,"line":137},[90,799,140],{"class":96},[90,801,802,804,806,808,810,813,815,818,820],{"class":92,"line":143},[90,803,146],{"class":103},[90,805,120],{"class":119},[90,807,151],{"class":103},[90,809,154],{"class":119},[90,811,812],{"class":103},"deno.land",[90,814,160],{"class":119},[90,816,817],{"class":103},"install.sh ",[90,819,166],{"class":119},[90,821,822],{"class":103}," sh\n",[76,824,825],{"id":825},"运行",[80,827,829],{"className":175,"code":828,"language":177,"meta":85,"style":85},"deno run index.ts                    # 运行（无权限）\ndeno run --allow-net index.ts        # 允许网络\ndeno run --allow-read --allow-write index.ts\ndeno run -A index.ts                 # 允许所有权限\ndeno task dev                        # 运行 deno.json 中的 task\n",[87,830,831,842,856,871,885],{"__ignoreMap":85},[90,832,833,835,837,839],{"class":92,"line":93},[90,834,757],{"class":184},[90,836,187],{"class":126},[90,838,190],{"class":126},[90,840,841],{"class":96},"                    # 运行（无权限）\n",[90,843,844,846,848,851,853],{"class":92,"line":100},[90,845,757],{"class":184},[90,847,187],{"class":126},[90,849,850],{"class":212}," --allow-net",[90,852,190],{"class":126},[90,854,855],{"class":96},"        # 允许网络\n",[90,857,858,860,862,865,868],{"class":92,"line":107},[90,859,757],{"class":184},[90,861,187],{"class":126},[90,863,864],{"class":212}," --allow-read",[90,866,867],{"class":212}," --allow-write",[90,869,870],{"class":126}," index.ts\n",[90,872,873,875,877,880,882],{"class":92,"line":113},[90,874,757],{"class":184},[90,876,187],{"class":126},[90,878,879],{"class":212}," -A",[90,881,190],{"class":126},[90,883,884],{"class":96},"                 # 允许所有权限\n",[90,886,887,889,892,894],{"class":92,"line":130},[90,888,757],{"class":184},[90,890,891],{"class":126}," task",[90,893,202],{"class":126},[90,895,896],{"class":96},"                        # 运行 deno.json 中的 task\n",[76,898,899],{"id":899},"权限模型",[22,901,902],{},"Deno 默认不允许任何系统访问：",[904,905,906,919],"table",{},[907,908,909],"thead",{},[910,911,912,916],"tr",{},[913,914,915],"th",{},"权限",[913,917,918],{},"说明",[920,921,922,933,943,953,963,973,983],"tbody",{},[910,923,924,930],{},[925,926,927],"td",{},[87,928,929],{},"--allow-net",[925,931,932],{},"网络访问",[910,934,935,940],{},[925,936,937],{},[87,938,939],{},"--allow-read",[925,941,942],{},"文件读取",[910,944,945,950],{},[925,946,947],{},[87,948,949],{},"--allow-write",[925,951,952],{},"文件写入",[910,954,955,960],{},[925,956,957],{},[87,958,959],{},"--allow-env",[925,961,962],{},"环境变量",[910,964,965,970],{},[925,966,967],{},[87,968,969],{},"--allow-run",[925,971,972],{},"运行子进程",[910,974,975,980],{},[925,976,977],{},[87,978,979],{},"--allow-ffi",[925,981,982],{},"外部函数接口",[910,984,985,990],{},[925,986,987],{},[87,988,989],{},"-A",[925,991,992],{},"所有权限",[76,994,221],{"id":995},"包管理-1",[80,997,1001],{"className":998,"code":999,"language":1000,"meta":85,"style":85},"language-jsonc shiki shiki-themes github-light github-dark","\u002F\u002F deno.json\n{\n  \"imports\": {\n    \"oak\": \"jsr:@oak\u002Foak@^17\",\n    \"std\u002F\": \"jsr:@std\u002F\",\n  },\n  \"tasks\": {\n    \"dev\": \"deno run --watch -A main.ts\",\n    \"build\": \"deno compile -A main.ts\",\n  },\n}\n","jsonc",[87,1002,1003,1008,1013,1021,1034,1046,1050,1057,1069,1081,1085],{"__ignoreMap":85},[90,1004,1005],{"class":92,"line":93},[90,1006,1007],{"class":96},"\u002F\u002F deno.json\n",[90,1009,1010],{"class":92,"line":100},[90,1011,1012],{"class":103},"{\n",[90,1014,1015,1018],{"class":92,"line":107},[90,1016,1017],{"class":212},"  \"imports\"",[90,1019,1020],{"class":103},": {\n",[90,1022,1023,1026,1029,1032],{"class":92,"line":113},[90,1024,1025],{"class":212},"    \"oak\"",[90,1027,1028],{"class":103},": ",[90,1030,1031],{"class":126},"\"jsr:@oak\u002Foak@^17\"",[90,1033,439],{"class":103},[90,1035,1036,1039,1041,1044],{"class":92,"line":130},[90,1037,1038],{"class":212},"    \"std\u002F\"",[90,1040,1028],{"class":103},[90,1042,1043],{"class":126},"\"jsr:@std\u002F\"",[90,1045,439],{"class":103},[90,1047,1048],{"class":92,"line":137},[90,1049,479],{"class":103},[90,1051,1052,1055],{"class":92,"line":143},[90,1053,1054],{"class":212},"  \"tasks\"",[90,1056,1020],{"class":103},[90,1058,1059,1062,1064,1067],{"class":92,"line":430},[90,1060,1061],{"class":212},"    \"dev\"",[90,1063,1028],{"class":103},[90,1065,1066],{"class":126},"\"deno run --watch -A main.ts\"",[90,1068,439],{"class":103},[90,1070,1071,1074,1076,1079],{"class":92,"line":442},[90,1072,1073],{"class":212},"    \"build\"",[90,1075,1028],{"class":103},[90,1077,1078],{"class":126},"\"deno compile -A main.ts\"",[90,1080,439],{"class":103},[90,1082,1083],{"class":92,"line":457},[90,1084,479],{"class":103},[90,1086,1087],{"class":92,"line":476},[90,1088,1089],{"class":103},"}\n",[80,1091,1093],{"className":175,"code":1092,"language":177,"meta":85,"style":85},"deno add jsr:@oak\u002Foak       # 添加依赖\ndeno install                 # 安装依赖\n",[87,1094,1095,1107],{"__ignoreMap":85},[90,1096,1097,1099,1101,1104],{"class":92,"line":93},[90,1098,757],{"class":184},[90,1100,243],{"class":126},[90,1102,1103],{"class":126}," jsr:@oak\u002Foak",[90,1105,1106],{"class":96},"       # 添加依赖\n",[90,1108,1109,1111,1113],{"class":92,"line":100},[90,1110,757],{"class":184},[90,1112,283],{"class":126},[90,1114,1115],{"class":96},"                 # 安装依赖\n",[22,1117,1118,1119,1122],{},"Deno 2.x 也支持 ",[87,1120,1121],{},"npm:"," 前缀直接使用 npm 包：",[80,1124,1126],{"className":328,"code":1125,"language":330,"meta":85,"style":85},"import express from \"npm:express\";\n",[87,1127,1128],{"__ignoreMap":85},[90,1129,1130,1132,1135,1137,1140],{"class":92,"line":93},[90,1131,562],{"class":119},[90,1133,1134],{"class":103}," express ",[90,1136,568],{"class":119},[90,1138,1139],{"class":126}," \"npm:express\"",[90,1141,574],{"class":103},[76,1143,1145],{"id":1144},"deno-更适合什么","Deno 更适合什么",[30,1147,1148,1151,1167,1170],{},[33,1149,1150],{},"对权限边界敏感的脚本和服务",[33,1152,1153,1154,1157,1158,1157,1161,1157,1163,1166],{},"希望默认集成 ",[87,1155,1156],{},"fmt","、",[87,1159,1160],{},"lint",[87,1162,657],{},[87,1164,1165],{},"compile"," 的项目",[33,1168,1169],{},"偏标准 Web API 和现代运行时体验的团队",[33,1171,1172],{},"想把单文件工具直接编译成可执行文件的场景",[76,1174,1175],{"id":1175},"内置工具",[80,1177,1179],{"className":175,"code":1178,"language":177,"meta":85,"style":85},"deno fmt                     # 格式化\ndeno lint                    # Lint\ndeno test                    # 测试\ndeno bench                   # 基准测试\ndeno compile main.ts         # 编译为单文件可执行\ndeno doc mod.ts              # 生成文档\n",[87,1180,1181,1191,1201,1210,1220,1233],{"__ignoreMap":85},[90,1182,1183,1185,1188],{"class":92,"line":93},[90,1184,757],{"class":184},[90,1186,1187],{"class":126}," fmt",[90,1189,1190],{"class":96},"                     # 格式化\n",[90,1192,1193,1195,1198],{"class":92,"line":100},[90,1194,757],{"class":184},[90,1196,1197],{"class":126}," lint",[90,1199,1200],{"class":96},"                    # Lint\n",[90,1202,1203,1205,1207],{"class":92,"line":107},[90,1204,757],{"class":184},[90,1206,621],{"class":126},[90,1208,1209],{"class":96},"                    # 测试\n",[90,1211,1212,1214,1217],{"class":92,"line":113},[90,1213,757],{"class":184},[90,1215,1216],{"class":126}," bench",[90,1218,1219],{"class":96},"                   # 基准测试\n",[90,1221,1222,1224,1227,1230],{"class":92,"line":130},[90,1223,757],{"class":184},[90,1225,1226],{"class":126}," compile",[90,1228,1229],{"class":126}," main.ts",[90,1231,1232],{"class":96},"         # 编译为单文件可执行\n",[90,1234,1235,1237,1240,1243],{"class":92,"line":137},[90,1236,757],{"class":184},[90,1238,1239],{"class":126}," doc",[90,1241,1242],{"class":126}," mod.ts",[90,1244,1245],{"class":96},"              # 生成文档\n",[26,1247,1248],{"id":1248},"对比",[904,1250,1251,1265],{},[907,1252,1253],{},[910,1254,1255,1258,1261,1263],{},[913,1256,1257],{},"特性",[913,1259,1260],{},"Node.js",[913,1262,65],{},[913,1264,758],{},[920,1266,1267,1281,1294,1307,1320,1334],{},[910,1268,1269,1272,1275,1278],{},[925,1270,1271],{},"语言",[925,1273,1274],{},"C++",[925,1276,1277],{},"Zig",[925,1279,1280],{},"Rust",[910,1282,1283,1286,1289,1292],{},[925,1284,1285],{},"TypeScript",[925,1287,1288],{},"需要编译",[925,1290,1291],{},"原生支持",[925,1293,1291],{},[910,1295,1296,1298,1301,1304],{},[925,1297,221],{},[925,1299,1300],{},"npm\u002Fpnpm\u002Fyarn",[925,1302,1303],{},"bun（内置）",[925,1305,1306],{},"deno add \u002F npm",[910,1308,1309,1312,1315,1317],{},[925,1310,1311],{},"安全模型",[925,1313,1314],{},"无限制",[925,1316,1314],{},[925,1318,1319],{},"默认沙箱",[910,1321,1322,1325,1328,1331],{},[925,1323,1324],{},"兼容性",[925,1326,1327],{},"生态最大",[925,1329,1330],{},"高度兼容 Node",[925,1332,1333],{},"兼容 Node\u002Fnpm",[910,1335,1336,1339,1342,1345],{},[925,1337,1338],{},"速度",[925,1340,1341],{},"基准",[925,1343,1344],{},"最快",[925,1346,1347],{},"快",[26,1349,1350],{"id":1350},"推荐落地顺序",[22,1352,1353],{},"建议不要一开始就“主项目整体迁移”。更稳的做法是：",[1355,1356,1357,1360,1363,1366],"ol",{},[33,1358,1359],{},"先拿小脚本或新建工具项目试运行时",[33,1361,1362],{},"再验证依赖兼容性、测试工具和构建流程",[33,1364,1365],{},"再决定是否扩大到服务或前端项目",[33,1367,1368],{},"最后才考虑作为团队默认运行时",[26,1370,1371],{"id":1371},"常见问题",[76,1373,1375],{"id":1374},"bun-能不能完全替代-nodejs","Bun 能不能完全替代 Node.js",[22,1377,1378],{},"很多项目可以部分替代，但不代表所有项目都该马上切。重点要看：",[30,1380,1381,1384,1387,1390],{},[33,1382,1383],{},"依赖兼容性",[33,1385,1386],{},"CI\u002FCD 环境",[33,1388,1389],{},"原生模块需求",[33,1391,1392],{},"团队对 Node 工具链的绑定程度",[76,1394,1396],{"id":1395},"deno-默认权限很烦吗","Deno 默认权限很烦吗",[22,1398,1399],{},"刚开始会有一点约束感，但这正是它的价值之一。对脚本、自动化和边界敏感场景来说，这种显式授权反而更清晰。",[76,1401,1403],{"id":1402},"一个仓库里能不能同时有-nodebundeno","一个仓库里能不能同时有 Node、Bun、Deno",[22,1405,1406],{},"可以，但要有明确边界。比如主应用仍用 Node，单独工具脚本用 Bun 或 Deno。最怕的是没人知道哪个命令该用哪个运行时。",[26,1408,1409],{"id":1409},"风险提醒",[30,1411,1412,1415,1418],{},[33,1413,1414],{},"不要为了“新”而迁移成熟项目",[33,1416,1417],{},"锁文件和 CI 运行时要统一",[33,1419,1420],{},"运行时切换前先验证第三方依赖、测试和部署链路",[26,1422,1423],{"id":1423},"延伸阅读",[30,1425,1426,1432,1438,1444,1450],{},[33,1427,1428],{},[69,1429,1431],{"href":1430},"\u002Fsetup","Windows 重装部署清单",[33,1433,1434],{},[69,1435,1437],{"href":1436},"\u002Fdocs\u002Fwindows-machine-log","Windows 重装部署清单（详情）",[33,1439,1440],{},[69,1441,1443],{"href":1442},"\u002Fdocs\u002Fnodejs-ecosystem","Node.js 生态概览",[33,1445,1446],{},[69,1447,1449],{"href":1448},"\u002Fdocs\u002Ftypescript-tips","TypeScript 实用技巧",[33,1451,1452],{},[69,1453,1455],{"href":1454},"\u002Fdocs\u002Fshell-scripting","Shell 脚本基础",[26,1457,1458],{"id":1458},"参考链接",[30,1460,1461,1467,1472],{},[33,1462,1463,1466],{},[69,1464,65],{"href":71,"rel":1465},[73]," — 官网与文档",[33,1468,1469,1466],{},[69,1470,758],{"href":763,"rel":1471},[73],[33,1473,1474,1479],{},[69,1475,1478],{"href":1476,"rel":1477},"https:\u002F\u002Fjsr.io\u002F",[73],"JSR"," — Deno 包仓库",[1481,1482,1483],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":85,"searchDepth":100,"depth":100,"links":1485},[1486,1487,1496,1504,1505,1506,1511,1512,1513],{"id":28,"depth":100,"text":28},{"id":64,"depth":100,"text":65,"children":1488},[1489,1490,1491,1492,1493,1494,1495],{"id":78,"depth":107,"text":78},{"id":172,"depth":107,"text":172},{"id":221,"depth":107,"text":221},{"id":306,"depth":107,"text":307},{"id":324,"depth":107,"text":325},{"id":602,"depth":107,"text":602},{"id":707,"depth":107,"text":707},{"id":757,"depth":100,"text":758,"children":1497},[1498,1499,1500,1501,1502,1503],{"id":768,"depth":107,"text":78},{"id":825,"depth":107,"text":825},{"id":899,"depth":107,"text":899},{"id":995,"depth":107,"text":221},{"id":1144,"depth":107,"text":1145},{"id":1175,"depth":107,"text":1175},{"id":1248,"depth":100,"text":1248},{"id":1350,"depth":100,"text":1350},{"id":1371,"depth":100,"text":1371,"children":1507},[1508,1509,1510],{"id":1374,"depth":107,"text":1375},{"id":1395,"depth":107,"text":1396},{"id":1402,"depth":107,"text":1403},{"id":1409,"depth":100,"text":1409},{"id":1423,"depth":100,"text":1423},{"id":1458,"depth":100,"text":1458},{"path":1515,"title":1516,"description":1517,"docType":8,"resourceKind":9,"categoryId":1518,"categoryLabel":1519,"updatedAt":12,"publishedAt":12,"icon":1520},"\u002Fdocs\u002Fandroid-debloat","Android 精简与优化","ADB 卸载预装应用、Universal Android Debloater、自定义设置与省电技巧","entertainment-resources","娱乐与资源","i-carbon-game-console",{"path":1522,"title":1523,"description":1524,"docType":8,"resourceKind":9,"categoryId":1525,"categoryLabel":1526,"updatedAt":12,"publishedAt":12,"icon":1527},"\u002Fdocs\u002Fcloudflare-pages-deploy","Cloudflare Pages 部署指南","Cloudflare Pages 项目部署、自定义域名、环境变量、重定向与 Functions","infra-deployment","服务器与部署","i-carbon-cloud",[1529,1530,1531],"希望把零散经验整理成长期可复用工作流的人","想先建立认知，再决定是否深入实践的人","希望阅读时顺手建立自己的操作清单或收藏体系的人",[1533,1534,1535],"先浏览标题、摘要和目录，带着问题阅读会更高效","顺手记录真正对你有用的命令、链接和注意事项，避免重复搜索","如果页面里提到相关文档，尽量一起打开对照，效果通常更完整",[1537,1541,1545,1549],{"path":1538,"title":1539,"description":1540,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"\u002Fdocs\u002Ftesting-guide","前端测试指南","Vitest 单元测试、Playwright E2E 测试、测试策略与最佳实践",{"path":1542,"title":1543,"description":1544,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"\u002Fdocs\u002Fcss-tricks","CSS 实用技巧","现代 CSS 特性、布局技巧、动画、暗色模式与常用代码片段",{"path":1546,"title":1547,"description":1548,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"\u002Fdocs\u002Fredis-guide","Redis 使用指南","Redis 安装、数据类型、常用命令、缓存策略与 Node.js 集成",{"path":1550,"title":1551,"description":1552,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1553,"publishedAt":1553,"icon":13},"\u002Fdocs\u002Fdatabase-basics","数据库基础速查","SQLite、PostgreSQL、MySQL 常用操作、SQL 语法与 GUI 工具推荐","2026-02-27",1776215711812]