[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fbooklet\u002Fend\u002Fbun\u002Fhttp":3,"knowledge-related-\u002Fknowledge\u002Fbooklet\u002Fend\u002Fbun\u002Fhttp":1380,"knowledge-series-\u002Fknowledge\u002Fbooklet\u002Fend\u002Fbun\u002Fhttp":1405},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":14,"pinned":15,"draft":15,"body":16,"seo":1376,"stem":1377,"id":1378,"extension":1379},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fbun\u002Fhttp","HTTP 服务器","Bun 内置了高性能的 HTTP 服务器，通过 Bun.serve 可以轻松启动服务。从 Bun v1.2.3 开始，推荐使用 routes 对象来定义路由，更加直观和灵活。","技能小册",[12,13],"bun","http","2026-07-12",false,{"type":17,"value":18,"toc":1365},"minimark",[19,23,33,49,57,641,647,666,673,677,691,711,989,993,999,1075,1086,1110,1114,1117,1240,1247,1251,1354,1361],[20,21,8],"h1",{"id":22},"http-服务器",[24,25,27,28,32],"h2",{"id":26},"创建-http-服务器bunserve","创建 HTTP 服务器（",[29,30,31],"code",{},"Bun.serve","）",[34,35,36,37,39,40,44,45,48],"p",{},"Bun 内置了高性能的 HTTP 服务器，通过 ",[29,38,31],{}," 可以轻松启动服务。从 ",[41,42,43],"strong",{},"Bun v1.2.3"," 开始，推荐使用 ",[29,46,47],{},"routes"," 对象来定义路由，更加直观和灵活。",[50,51,53,54,56],"h3",{"id":52},"一基础示例routes-模式","一、基础示例（",[29,55,47],{}," 模式）",[58,59,64],"pre",{"className":60,"code":61,"language":62,"meta":63,"style":63},"language-typescript shiki shiki-themes material-theme-lighter github-light github-dark","\u002F\u002F server.ts\nconst server = Bun.serve({\n  routes: {\n    \u002F\u002F 静态路由\n    \"\u002Fapi\u002Fstatus\": new Response(\"OK\"),\n\n    \u002F\u002F 动态路由，参数自动注入到 req.params\n    \"\u002Fusers\u002F:id\": (req) => new Response(`Hello User ${req.params.id}!`),\n\n    \u002F\u002F 同一路径不同 HTTP 方法\n    \"\u002Fapi\u002Fposts\": {\n      GET: () => new Response(\"List posts\"),\n      POST: async (req) => {\n        const body = await req.json();\n        return Response.json({ created: true, ...body });\n      },\n    },\n\n    \u002F\u002F 通配符路由（以 \"\u002Fapi\u002F\" 开头的所有路径）\n    \"\u002Fapi\u002F*\": () => Response.json({ message: \"Not found\" }, { status: 404 }),\n\n    \u002F\u002F 重定向\n    \"\u002Fblog\u002Fhello\": Response.redirect(\"\u002Fblog\u002Fhello\u002Fworld\"),\n\n    \u002F\u002F 直接返回静态文件\n    \"\u002Ffavicon.ico\": Bun.file(\".\u002Ffavicon.ico\"),\n  },\n\n  \u002F\u002F 可选：fallback 处理所有未匹配的路由\n  \u002F\u002F fetch(req) {\n  \u002F\u002F   return new Response(\"Not Found\", { status: 404 });\n  \u002F\u002F },\n});\n\nconsole.log(`Server running at ${server.url}`);\n","typescript","",[29,65,66,75,108,121,127,165,172,178,241,246,252,266,296,317,346,388,394,400,405,411,471,476,482,514,519,525,557,563,568,574,580,586,592,601,606],{"__ignoreMap":63},[67,68,71],"span",{"class":69,"line":70},"line",1,[67,72,74],{"class":73},"sutJx","\u002F\u002F server.ts\n",[67,76,78,82,86,90,94,98,102,105],{"class":69,"line":77},2,[67,79,81],{"class":80},"sbsja","const",[67,83,85],{"class":84},"s_hVV"," server",[67,87,89],{"class":88},"smGrS"," =",[67,91,93],{"class":92},"su5hD"," Bun",[67,95,97],{"class":96},"sP7_E",".",[67,99,101],{"class":100},"sGLFI","serve",[67,103,104],{"class":92},"(",[67,106,107],{"class":96},"{\n",[67,109,111,115,118],{"class":69,"line":110},3,[67,112,114],{"class":113},"skxfh","  routes",[67,116,117],{"class":96},":",[67,119,120],{"class":96}," {\n",[67,122,124],{"class":69,"line":123},4,[67,125,126],{"class":73},"    \u002F\u002F 静态路由\n",[67,128,130,134,138,141,143,146,149,151,153,157,159,162],{"class":69,"line":129},5,[67,131,133],{"class":132},"sjJ54","    \"",[67,135,137],{"class":136},"sZUrc","\u002Fapi\u002Fstatus",[67,139,140],{"class":132},"\"",[67,142,117],{"class":96},[67,144,145],{"class":88}," new",[67,147,148],{"class":100}," Response",[67,150,104],{"class":92},[67,152,140],{"class":132},[67,154,156],{"class":155},"s_sjI","OK",[67,158,140],{"class":132},[67,160,161],{"class":92},")",[67,163,164],{"class":96},",\n",[67,166,168],{"class":69,"line":167},6,[67,169,171],{"emptyLinePlaceholder":170},true,"\n",[67,173,175],{"class":69,"line":174},7,[67,176,177],{"class":73},"    \u002F\u002F 动态路由，参数自动注入到 req.params\n",[67,179,181,183,186,188,190,193,197,199,202,204,206,208,211,214,217,219,221,224,226,229,232,235,237,239],{"class":69,"line":180},8,[67,182,133],{"class":132},[67,184,185],{"class":136},"\u002Fusers\u002F:id",[67,187,140],{"class":132},[67,189,117],{"class":96},[67,191,192],{"class":96}," (",[67,194,196],{"class":195},"s99_P","req",[67,198,161],{"class":96},[67,200,201],{"class":80}," =>",[67,203,145],{"class":88},[67,205,148],{"class":100},[67,207,104],{"class":92},[67,209,210],{"class":132},"`",[67,212,213],{"class":155},"Hello User ",[67,215,216],{"class":132},"${",[67,218,196],{"class":92},[67,220,97],{"class":132},[67,222,223],{"class":92},"params",[67,225,97],{"class":132},[67,227,228],{"class":92},"id",[67,230,231],{"class":132},"}",[67,233,234],{"class":155},"!",[67,236,210],{"class":132},[67,238,161],{"class":92},[67,240,164],{"class":96},[67,242,244],{"class":69,"line":243},9,[67,245,171],{"emptyLinePlaceholder":170},[67,247,249],{"class":69,"line":248},10,[67,250,251],{"class":73},"    \u002F\u002F 同一路径不同 HTTP 方法\n",[67,253,255,257,260,262,264],{"class":69,"line":254},11,[67,256,133],{"class":132},[67,258,259],{"class":136},"\u002Fapi\u002Fposts",[67,261,140],{"class":132},[67,263,117],{"class":96},[67,265,120],{"class":96},[67,267,269,272,274,277,279,281,283,285,287,290,292,294],{"class":69,"line":268},12,[67,270,271],{"class":100},"      GET",[67,273,117],{"class":96},[67,275,276],{"class":96}," ()",[67,278,201],{"class":80},[67,280,145],{"class":88},[67,282,148],{"class":100},[67,284,104],{"class":92},[67,286,140],{"class":132},[67,288,289],{"class":155},"List posts",[67,291,140],{"class":132},[67,293,161],{"class":92},[67,295,164],{"class":96},[67,297,299,302,304,307,309,311,313,315],{"class":69,"line":298},13,[67,300,301],{"class":100},"      POST",[67,303,117],{"class":96},[67,305,306],{"class":80}," async",[67,308,192],{"class":96},[67,310,196],{"class":195},[67,312,161],{"class":96},[67,314,201],{"class":80},[67,316,120],{"class":96},[67,318,320,323,326,328,332,335,337,340,343],{"class":69,"line":319},14,[67,321,322],{"class":80},"        const",[67,324,325],{"class":84}," body",[67,327,89],{"class":88},[67,329,331],{"class":330},"sVHd0"," await",[67,333,334],{"class":92}," req",[67,336,97],{"class":96},[67,338,339],{"class":100},"json",[67,341,342],{"class":113},"()",[67,344,345],{"class":96},";\n",[67,347,349,352,354,356,358,360,363,366,368,372,375,378,381,384,386],{"class":69,"line":348},15,[67,350,351],{"class":330},"        return",[67,353,148],{"class":92},[67,355,97],{"class":96},[67,357,339],{"class":100},[67,359,104],{"class":113},[67,361,362],{"class":96},"{",[67,364,365],{"class":113}," created",[67,367,117],{"class":96},[67,369,371],{"class":370},"syTEX"," true",[67,373,374],{"class":96},",",[67,376,377],{"class":88}," ...",[67,379,380],{"class":92},"body",[67,382,383],{"class":96}," }",[67,385,161],{"class":113},[67,387,345],{"class":96},[67,389,391],{"class":69,"line":390},16,[67,392,393],{"class":96},"      },\n",[67,395,397],{"class":69,"line":396},17,[67,398,399],{"class":96},"    },\n",[67,401,403],{"class":69,"line":402},18,[67,404,171],{"emptyLinePlaceholder":170},[67,406,408],{"class":69,"line":407},19,[67,409,410],{"class":73},"    \u002F\u002F 通配符路由（以 \"\u002Fapi\u002F\" 开头的所有路径）\n",[67,412,414,416,419,421,423,425,427,429,431,433,435,437,440,442,445,448,450,453,456,459,461,465,467,469],{"class":69,"line":413},20,[67,415,133],{"class":132},[67,417,418],{"class":136},"\u002Fapi\u002F*",[67,420,140],{"class":132},[67,422,117],{"class":96},[67,424,276],{"class":96},[67,426,201],{"class":80},[67,428,148],{"class":92},[67,430,97],{"class":96},[67,432,339],{"class":100},[67,434,104],{"class":92},[67,436,362],{"class":96},[67,438,439],{"class":113}," message",[67,441,117],{"class":96},[67,443,444],{"class":132}," \"",[67,446,447],{"class":155},"Not found",[67,449,140],{"class":132},[67,451,452],{"class":96}," },",[67,454,455],{"class":96}," {",[67,457,458],{"class":113}," status",[67,460,117],{"class":96},[67,462,464],{"class":463},"srdBf"," 404",[67,466,383],{"class":96},[67,468,161],{"class":92},[67,470,164],{"class":96},[67,472,474],{"class":69,"line":473},21,[67,475,171],{"emptyLinePlaceholder":170},[67,477,479],{"class":69,"line":478},22,[67,480,481],{"class":73},"    \u002F\u002F 重定向\n",[67,483,485,487,490,492,494,496,498,501,503,505,508,510,512],{"class":69,"line":484},23,[67,486,133],{"class":132},[67,488,489],{"class":136},"\u002Fblog\u002Fhello",[67,491,140],{"class":132},[67,493,117],{"class":96},[67,495,148],{"class":92},[67,497,97],{"class":96},[67,499,500],{"class":100},"redirect",[67,502,104],{"class":92},[67,504,140],{"class":132},[67,506,507],{"class":155},"\u002Fblog\u002Fhello\u002Fworld",[67,509,140],{"class":132},[67,511,161],{"class":92},[67,513,164],{"class":96},[67,515,517],{"class":69,"line":516},24,[67,518,171],{"emptyLinePlaceholder":170},[67,520,522],{"class":69,"line":521},25,[67,523,524],{"class":73},"    \u002F\u002F 直接返回静态文件\n",[67,526,528,530,533,535,537,539,541,544,546,548,551,553,555],{"class":69,"line":527},26,[67,529,133],{"class":132},[67,531,532],{"class":136},"\u002Ffavicon.ico",[67,534,140],{"class":132},[67,536,117],{"class":96},[67,538,93],{"class":92},[67,540,97],{"class":96},[67,542,543],{"class":100},"file",[67,545,104],{"class":92},[67,547,140],{"class":132},[67,549,550],{"class":155},".\u002Ffavicon.ico",[67,552,140],{"class":132},[67,554,161],{"class":92},[67,556,164],{"class":96},[67,558,560],{"class":69,"line":559},27,[67,561,562],{"class":96},"  },\n",[67,564,566],{"class":69,"line":565},28,[67,567,171],{"emptyLinePlaceholder":170},[67,569,571],{"class":69,"line":570},29,[67,572,573],{"class":73},"  \u002F\u002F 可选：fallback 处理所有未匹配的路由\n",[67,575,577],{"class":69,"line":576},30,[67,578,579],{"class":73},"  \u002F\u002F fetch(req) {\n",[67,581,583],{"class":69,"line":582},31,[67,584,585],{"class":73},"  \u002F\u002F   return new Response(\"Not Found\", { status: 404 });\n",[67,587,589],{"class":69,"line":588},32,[67,590,591],{"class":73},"  \u002F\u002F },\n",[67,593,595,597,599],{"class":69,"line":594},33,[67,596,231],{"class":96},[67,598,161],{"class":92},[67,600,345],{"class":96},[67,602,604],{"class":69,"line":603},34,[67,605,171],{"emptyLinePlaceholder":170},[67,607,609,612,614,617,619,621,624,626,629,631,634,637,639],{"class":69,"line":608},35,[67,610,611],{"class":92},"console",[67,613,97],{"class":96},[67,615,616],{"class":100},"log",[67,618,104],{"class":92},[67,620,210],{"class":132},[67,622,623],{"class":155},"Server running at ",[67,625,216],{"class":132},[67,627,628],{"class":92},"server",[67,630,97],{"class":132},[67,632,633],{"class":92},"url",[67,635,636],{"class":132},"}`",[67,638,161],{"class":92},[67,640,345],{"class":96},[34,642,643,646],{},[41,644,645],{},"运行","：",[58,648,652],{"className":649,"code":650,"language":651,"meta":63,"style":63},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","bun --allow-net server.ts\n","bash",[29,653,654],{"__ignoreMap":63},[67,655,656,659,663],{"class":69,"line":70},[67,657,12],{"class":658},"sbgvK",[67,660,662],{"class":661},"stzsN"," --allow-net",[67,664,665],{"class":155}," server.ts\n",[34,667,668,669,672],{},"（权限标志 ",[29,670,671],{},"--allow-net"," 在新版本中可能非必需，但添加可以确保网络权限）",[50,674,676],{"id":675},"二处理请求上下文","二、处理请求上下文",[34,678,679,680,682,683,686,687,690],{},"Bun 的 ",[29,681,196],{}," 对象是标准 ",[29,684,685],{},"Request"," 的扩展（",[29,688,689],{},"BunRequest","），提供了便捷的属性和方法：",[692,693,694,701],"ul",{},[695,696,697,700],"li",{},[29,698,699],{},"req.params","：动态路由参数对象。",[695,702,703,706,707,710],{},[29,704,705],{},"req.cookies","：类似 ",[29,708,709],{},"Map"," 的 Cookie 读写接口。",[58,712,714],{"className":60,"code":713,"language":62,"meta":63,"style":63},"Bun.serve({\n  routes: {\n    \"\u002Fprofile\u002F:username\": async (req) => {\n      const { username } = req.params; \u002F\u002F 获取路由参数\n      const allCookies = req.cookies; \u002F\u002F 所有 Cookie（Map）\n      const theme = req.cookies.get(\"theme\"); \u002F\u002F 读取单个 Cookie\n\n      \u002F\u002F 设置 Cookie\n      req.cookies.set(\"session\", \"abc123\", {\n        httpOnly: true,\n        maxAge: 60 * 60 * 24, \u002F\u002F 24 小时\n      });\n\n      return new Response(`Profile of ${username}, theme: ${theme}`);\n    },\n  },\n});\n",[29,715,716,729,737,760,786,807,843,847,852,888,899,924,933,937,973,977,981],{"__ignoreMap":63},[67,717,718,721,723,725,727],{"class":69,"line":70},[67,719,720],{"class":92},"Bun",[67,722,97],{"class":96},[67,724,101],{"class":100},[67,726,104],{"class":92},[67,728,107],{"class":96},[67,730,731,733,735],{"class":69,"line":77},[67,732,114],{"class":113},[67,734,117],{"class":96},[67,736,120],{"class":96},[67,738,739,741,744,746,748,750,752,754,756,758],{"class":69,"line":110},[67,740,133],{"class":132},[67,742,743],{"class":136},"\u002Fprofile\u002F:username",[67,745,140],{"class":132},[67,747,117],{"class":96},[67,749,306],{"class":80},[67,751,192],{"class":96},[67,753,196],{"class":195},[67,755,161],{"class":96},[67,757,201],{"class":80},[67,759,120],{"class":96},[67,761,762,765,767,770,772,774,776,778,780,783],{"class":69,"line":123},[67,763,764],{"class":80},"      const",[67,766,455],{"class":96},[67,768,769],{"class":84}," username",[67,771,383],{"class":96},[67,773,89],{"class":88},[67,775,334],{"class":92},[67,777,97],{"class":96},[67,779,223],{"class":92},[67,781,782],{"class":96},";",[67,784,785],{"class":73}," \u002F\u002F 获取路由参数\n",[67,787,788,790,793,795,797,799,802,804],{"class":69,"line":129},[67,789,764],{"class":80},[67,791,792],{"class":84}," allCookies",[67,794,89],{"class":88},[67,796,334],{"class":92},[67,798,97],{"class":96},[67,800,801],{"class":92},"cookies",[67,803,782],{"class":96},[67,805,806],{"class":73}," \u002F\u002F 所有 Cookie（Map）\n",[67,808,809,811,814,816,818,820,822,824,827,829,831,834,836,838,840],{"class":69,"line":167},[67,810,764],{"class":80},[67,812,813],{"class":84}," theme",[67,815,89],{"class":88},[67,817,334],{"class":92},[67,819,97],{"class":96},[67,821,801],{"class":92},[67,823,97],{"class":96},[67,825,826],{"class":100},"get",[67,828,104],{"class":113},[67,830,140],{"class":132},[67,832,833],{"class":155},"theme",[67,835,140],{"class":132},[67,837,161],{"class":113},[67,839,782],{"class":96},[67,841,842],{"class":73}," \u002F\u002F 读取单个 Cookie\n",[67,844,845],{"class":69,"line":174},[67,846,171],{"emptyLinePlaceholder":170},[67,848,849],{"class":69,"line":180},[67,850,851],{"class":73},"      \u002F\u002F 设置 Cookie\n",[67,853,854,857,859,861,863,866,868,870,873,875,877,879,882,884,886],{"class":69,"line":243},[67,855,856],{"class":92},"      req",[67,858,97],{"class":96},[67,860,801],{"class":92},[67,862,97],{"class":96},[67,864,865],{"class":100},"set",[67,867,104],{"class":113},[67,869,140],{"class":132},[67,871,872],{"class":155},"session",[67,874,140],{"class":132},[67,876,374],{"class":96},[67,878,444],{"class":132},[67,880,881],{"class":155},"abc123",[67,883,140],{"class":132},[67,885,374],{"class":96},[67,887,120],{"class":96},[67,889,890,893,895,897],{"class":69,"line":248},[67,891,892],{"class":113},"        httpOnly",[67,894,117],{"class":96},[67,896,371],{"class":370},[67,898,164],{"class":96},[67,900,901,904,906,909,912,914,916,919,921],{"class":69,"line":254},[67,902,903],{"class":113},"        maxAge",[67,905,117],{"class":96},[67,907,908],{"class":463}," 60",[67,910,911],{"class":88}," *",[67,913,908],{"class":463},[67,915,911],{"class":88},[67,917,918],{"class":463}," 24",[67,920,374],{"class":96},[67,922,923],{"class":73}," \u002F\u002F 24 小时\n",[67,925,926,929,931],{"class":69,"line":268},[67,927,928],{"class":96},"      }",[67,930,161],{"class":113},[67,932,345],{"class":96},[67,934,935],{"class":69,"line":298},[67,936,171],{"emptyLinePlaceholder":170},[67,938,939,942,944,946,948,950,953,955,958,960,963,965,967,969,971],{"class":69,"line":319},[67,940,941],{"class":330},"      return",[67,943,145],{"class":88},[67,945,148],{"class":100},[67,947,104],{"class":113},[67,949,210],{"class":132},[67,951,952],{"class":155},"Profile of ",[67,954,216],{"class":132},[67,956,957],{"class":92},"username",[67,959,231],{"class":132},[67,961,962],{"class":155},", theme: ",[67,964,216],{"class":132},[67,966,833],{"class":92},[67,968,636],{"class":132},[67,970,161],{"class":113},[67,972,345],{"class":96},[67,974,975],{"class":69,"line":348},[67,976,399],{"class":96},[67,978,979],{"class":69,"line":390},[67,980,562],{"class":96},[67,982,983,985,987],{"class":69,"line":396},[67,984,231],{"class":96},[67,986,161],{"class":92},[67,988,345],{"class":96},[50,990,992],{"id":991},"三修改服务器配置","三、修改服务器配置",[34,994,995,996,998],{},"可以在 ",[29,997,31],{}," 的配置对象中直接指定监听的端口和主机名，也可以通过环境变量设置。",[58,1000,1002],{"className":60,"code":1001,"language":62,"meta":63,"style":63},"Bun.serve({\n  port: 3000, \u002F\u002F 默认 3000\n  hostname: \"0.0.0.0\", \u002F\u002F 默认 \"0.0.0.0\"\n  routes: {\n    \u002F* ... *\u002F\n  },\n});\n",[29,1003,1004,1016,1031,1050,1058,1063,1067],{"__ignoreMap":63},[67,1005,1006,1008,1010,1012,1014],{"class":69,"line":70},[67,1007,720],{"class":92},[67,1009,97],{"class":96},[67,1011,101],{"class":100},[67,1013,104],{"class":92},[67,1015,107],{"class":96},[67,1017,1018,1021,1023,1026,1028],{"class":69,"line":77},[67,1019,1020],{"class":113},"  port",[67,1022,117],{"class":96},[67,1024,1025],{"class":463}," 3000",[67,1027,374],{"class":96},[67,1029,1030],{"class":73}," \u002F\u002F 默认 3000\n",[67,1032,1033,1036,1038,1040,1043,1045,1047],{"class":69,"line":110},[67,1034,1035],{"class":113},"  hostname",[67,1037,117],{"class":96},[67,1039,444],{"class":132},[67,1041,1042],{"class":155},"0.0.0.0",[67,1044,140],{"class":132},[67,1046,374],{"class":96},[67,1048,1049],{"class":73}," \u002F\u002F 默认 \"0.0.0.0\"\n",[67,1051,1052,1054,1056],{"class":69,"line":123},[67,1053,114],{"class":113},[67,1055,117],{"class":96},[67,1057,120],{"class":96},[67,1059,1060],{"class":69,"line":129},[67,1061,1062],{"class":73},"    \u002F* ... *\u002F\n",[67,1064,1065],{"class":69,"line":167},[67,1066,562],{"class":96},[67,1068,1069,1071,1073],{"class":69,"line":174},[67,1070,231],{"class":96},[67,1072,161],{"class":92},[67,1074,345],{"class":96},[34,1076,1077,1078,1081,1082,1085],{},"也可以通过环境变量 ",[29,1079,1080],{},"$PORT"," 或 ",[29,1083,1084],{},"$BUN_PORT"," 动态指定端口，例如：",[58,1087,1089],{"className":649,"code":1088,"language":651,"meta":63,"style":63},"PORT=8080 bun run server.ts\n",[29,1090,1091],{"__ignoreMap":63},[67,1092,1093,1096,1099,1102,1105,1108],{"class":69,"line":70},[67,1094,1095],{"class":92},"PORT",[67,1097,1098],{"class":88},"=",[67,1100,1101],{"class":155},"8080",[67,1103,1104],{"class":658}," bun",[67,1106,1107],{"class":155}," run",[67,1109,665],{"class":155},[50,1111,1113],{"id":1112},"四前端集成html-导入与热重载","四、前端集成（HTML 导入与热重载）",[34,1115,1116],{},"Bun v1.3 开始，支持直接导入 HTML 文件，并利用内置的打包器和开发服务器实现热模块替换（HMR）。",[58,1118,1120],{"className":60,"code":1119,"language":62,"meta":63,"style":63},"\u002F\u002F 导入 HTML 文件作为文本\nimport html from \".\u002Findex.html\";\n\nBun.serve({\n  routes: {\n    \"\u002F\": () => new Response(html, { headers: { \"Content-Type\": \"text\u002Fhtml\" } }),\n  },\n});\n",[29,1121,1122,1127,1147,1151,1163,1171,1228,1232],{"__ignoreMap":63},[67,1123,1124],{"class":69,"line":70},[67,1125,1126],{"class":73},"\u002F\u002F 导入 HTML 文件作为文本\n",[67,1128,1129,1132,1135,1138,1140,1143,1145],{"class":69,"line":77},[67,1130,1131],{"class":330},"import",[67,1133,1134],{"class":92}," html ",[67,1136,1137],{"class":330},"from",[67,1139,444],{"class":132},[67,1141,1142],{"class":155},".\u002Findex.html",[67,1144,140],{"class":132},[67,1146,345],{"class":96},[67,1148,1149],{"class":69,"line":110},[67,1150,171],{"emptyLinePlaceholder":170},[67,1152,1153,1155,1157,1159,1161],{"class":69,"line":123},[67,1154,720],{"class":92},[67,1156,97],{"class":96},[67,1158,101],{"class":100},[67,1160,104],{"class":92},[67,1162,107],{"class":96},[67,1164,1165,1167,1169],{"class":69,"line":129},[67,1166,114],{"class":113},[67,1168,117],{"class":96},[67,1170,120],{"class":96},[67,1172,1173,1175,1178,1180,1182,1184,1186,1188,1190,1193,1195,1197,1200,1202,1204,1206,1209,1211,1213,1215,1218,1220,1222,1224,1226],{"class":69,"line":167},[67,1174,133],{"class":132},[67,1176,1177],{"class":136},"\u002F",[67,1179,140],{"class":132},[67,1181,117],{"class":96},[67,1183,276],{"class":96},[67,1185,201],{"class":80},[67,1187,145],{"class":88},[67,1189,148],{"class":100},[67,1191,1192],{"class":92},"(html",[67,1194,374],{"class":96},[67,1196,455],{"class":96},[67,1198,1199],{"class":113}," headers",[67,1201,117],{"class":96},[67,1203,455],{"class":96},[67,1205,444],{"class":132},[67,1207,1208],{"class":136},"Content-Type",[67,1210,140],{"class":132},[67,1212,117],{"class":96},[67,1214,444],{"class":132},[67,1216,1217],{"class":155},"text\u002Fhtml",[67,1219,140],{"class":132},[67,1221,383],{"class":96},[67,1223,383],{"class":96},[67,1225,161],{"class":92},[67,1227,164],{"class":96},[67,1229,1230],{"class":69,"line":174},[67,1231,562],{"class":96},[67,1233,1234,1236,1238],{"class":69,"line":180},[67,1235,231],{"class":96},[67,1237,161],{"class":92},[67,1239,345],{"class":96},[34,1241,1242,1243,1246],{},"配合 ",[29,1244,1245],{},"bun --hot"," 启动即可获得前端热重载体验，修改 HTML\u002FCSS\u002FJS 会自动刷新页面。",[50,1248,1250],{"id":1249},"五总结","五、总结",[1252,1253,1254,1267],"table",{},[1255,1256,1257],"thead",{},[1258,1259,1260,1264],"tr",{},[1261,1262,1263],"th",{},"特性",[1261,1265,1266],{},"说明",[1268,1269,1270,1281,1295,1311,1322,1332,1343],"tbody",{},[1258,1271,1272,1276],{},[1273,1274,1275],"td",{},"推荐写法",[1273,1277,1278],{},[29,1279,1280],{},"Bun.serve({ routes: {...} })",[1258,1282,1283,1286],{},[1273,1284,1285],{},"动态路由",[1273,1287,1288,1291,1292],{},[29,1289,1290],{},"\"\u002Fusers\u002F:id\""," → ",[29,1293,1294],{},"req.params.id",[1258,1296,1297,1300],{},[1273,1298,1299],{},"方法区分",[1273,1301,1302,1303,1306,1307,1310],{},"为同一路径配置 ",[29,1304,1305],{},"GET","、",[29,1308,1309],{},"POST"," 等对象",[1258,1312,1313,1316],{},[1273,1314,1315],{},"通配符",[1273,1317,1318,1321],{},[29,1319,1320],{},"\"\u002Fapi\u002F*\""," 匹配子路径",[1258,1323,1324,1327],{},[1273,1325,1326],{},"Cookie 操作",[1273,1328,1329],{},[29,1330,1331],{},"req.cookies.get\u002Fset\u002Fdelete",[1258,1333,1334,1337],{},[1273,1335,1336],{},"静态文件",[1273,1338,1339,1340],{},"直接返回 ",[29,1341,1342],{},"Bun.file(path)",[1258,1344,1345,1348],{},[1273,1346,1347],{},"前端集成",[1273,1349,1350,1351,1353],{},"导入 HTML + ",[29,1352,1245],{}," 实现 HMR",[34,1355,1356,1357,1360],{},"Bun 内置的 HTTP 服务器性能极高，且与 Node.js 的 ",[29,1358,1359],{},"fetch"," API 兼容，几乎无需学习成本即可上手。对于 API 开发、静态服务、全栈应用都是一个极佳的选择。",[1362,1363,1364],"style",{},"html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sZUrc, html code.shiki .sZUrc{--shiki-light:#E53935;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .stzsN, html code.shiki .stzsN{--shiki-light:#91B859;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":63,"searchDepth":77,"depth":77,"links":1366},[1367],{"id":26,"depth":77,"text":1368,"children":1369},"创建 HTTP 服务器（Bun.serve）",[1370,1372,1373,1374,1375],{"id":52,"depth":110,"text":1371},"一、基础示例（routes 模式）",{"id":675,"depth":110,"text":676},{"id":991,"depth":110,"text":992},{"id":1112,"depth":110,"text":1113},{"id":1249,"depth":110,"text":1250},{"title":8,"description":9},"knowledge\u002Fbooklet\u002Fend\u002FBun\u002Fhttp","knowledge\u002Fknowledge\u002Fbooklet\u002Fend\u002FBun\u002Fhttp.md","md",{"items":1381},[1382,1386,1390,1394,1398,1402],{"path":1383,"title":1384,"description":1385,"category":10,"score":167},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fbun\u002Fbase","Bun 基础与核心命令","Bun 是用 Zig 编写的 JavaScript 运行时，内置包管理（bun install）、打包（bun build）、测试（bun test）等，并持续兼容 Node.js API。本文介绍核心特点、安装方式，以及日常最常用的命令与包管理功能。见 运行时对比。",{"path":1387,"title":1388,"description":1389,"category":10,"score":167},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fbun\u002Fdeploy","生产环境与部署指南","Bun 内置了高性能的打包器（bundler），可以对前端或全栈应用进行生产优化。",{"path":1391,"title":1392,"description":1393,"category":10,"score":123},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fbasics","后端入门概览","本目录覆盖 JavaScript\u002FTypeScript 服务端运行时与框架、数据存储，以及 Rust 系统编程入门，提供从零到部署的完整学习路径。前置建议：JavaScript 基础、工程化 · 环境变量。",{"path":1395,"title":1396,"description":1397,"category":10,"score":123},"\u002Fknowledge\u002Fbooklet\u002Fframe\u002Fangular\u002Fhttp","HTTP 与数据","Angular 通过 HttpClient（@angular\u002Fcommon\u002Fhttp）发起 HTTP 请求，返回 RxJS Observable。见 RxJS 互操作、依赖注入。",{"path":1399,"title":1400,"description":1401,"category":10,"score":123},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fnodejs\u002Fcore\u002Fhttp","网络编程","Node.js 提供了丰富的内置模块，用于构建网络应用。下面从 HTTP\u002FHTTPS、WebSocket、TCP\u002FUDP 以及 DNS 解析四个方面进行深入介绍。",{"path":1403,"title":8,"description":1404,"category":10,"score":123},"\u002Fknowledge\u002Fbooklet\u002Fend\u002Fdeno\u002Fhttp","Deno 提供了内置的 HTTP 服务器 API Deno.serve，无需安装任何第三方库即可创建高性能的 HTTP\u002F1.1 和 HTTP\u002F2 服务。它基于标准的 Web API Request 和 Response 对象，使得开发…",{"series":1406,"title":12,"items":1407,"index":77,"prev":1413,"next":1414},"booklet\u002Fend\u002Fbun",[1408,1410,1412],{"path":1383,"title":1384,"date":1409,"pinned":15},"2026-07-23",{"path":1387,"title":1388,"date":1411,"pinned":15},"2024-08-31",{"path":7,"title":8,"date":14,"pinned":15},{"path":1387,"title":1388,"date":1411,"pinned":15},null]