[{"data":1,"prerenderedAt":1402},["ShallowReactive",2],{"doc-page:\u002Fdocs\u002Fcloudflare-workers":3},{"doc":4,"prev":1373,"next":1376,"resolvedType":8,"readingMinutes":110,"audience":1380,"checklist":1384,"related":1388},{"path":5,"title":6,"description":7,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13,"body":14},"\u002Fdocs\u002Fcloudflare-workers","Cloudflare Workers 与 Pages","Wrangler CLI、Workers 开发、Pages 部署、KV\u002FD1\u002FR2 存储服务使用指南","article",null,"infra-deployment","服务器与部署","2026-02-27","i-carbon-cloud",{"type":15,"value":16,"toc":1346},"minimark",[17,21,25,29,64,67,71,149,152,155,176,179,183,187,202,205,386,389,401,404,416,420,424,480,484,539,543,546,627,630,767,771,774,848,850,971,975,978,1003,1005,1124,1128,1159,1196,1199,1203,1206,1219,1223,1226,1237,1241,1244,1258,1261,1272,1275,1296,1299,1342],[18,19,6],"h1",{"id":20},"cloudflare-workers-与-pages",[22,23,24],"p",{},"这页适合作为“Cloudflare 边缘应用的总入口”。最容易混淆的地方通常不是命令怎么写，而是：什么时候该用 Workers，什么时候该用 Pages，以及 KV \u002F D1 \u002F R2 分别适合承载什么。",[26,27,28],"h2",{"id":28},"先按场景选",[30,31,32,40,46,52,58],"ul",{},[33,34,35,39],"li",{},[36,37,38],"strong",{},"纯静态站点或前端项目","：优先 Pages",[33,41,42,45],{},[36,43,44],{},"边缘 API、鉴权、中间层逻辑","：优先 Workers",[33,47,48,51],{},[36,49,50],{},"简单配置、缓存、轻量键值数据","：优先 KV",[33,53,54,57],{},[36,55,56],{},"轻量关系型数据、边缘查询","：优先 D1",[33,59,60,63],{},[36,61,62],{},"文件、图片、附件、归档对象","：优先 R2",[22,65,66],{},"如果你的项目既有前端又有轻量 API，常见做法是 Pages 托管站点，Workers \u002F Functions 承担边缘逻辑。",[26,68,70],{"id":69},"wrangler-cli","Wrangler CLI",[72,73,78],"pre",{"className":74,"code":75,"language":76,"meta":77,"style":77},"language-bash shiki shiki-themes github-light github-dark","# 安装\nnpm install -g wrangler\n\n# 登录\nwrangler login\n\n# 查看账户信息\nwrangler whoami\n","bash","",[79,80,81,90,108,115,121,130,135,141],"code",{"__ignoreMap":77},[82,83,86],"span",{"class":84,"line":85},"line",1,[82,87,89],{"class":88},"sJ8bj","# 安装\n",[82,91,93,97,101,105],{"class":84,"line":92},2,[82,94,96],{"class":95},"sScJk","npm",[82,98,100],{"class":99},"sZZnC"," install",[82,102,104],{"class":103},"sj4cs"," -g",[82,106,107],{"class":99}," wrangler\n",[82,109,111],{"class":84,"line":110},3,[82,112,114],{"emptyLinePlaceholder":113},true,"\n",[82,116,118],{"class":84,"line":117},4,[82,119,120],{"class":88},"# 登录\n",[82,122,124,127],{"class":84,"line":123},5,[82,125,126],{"class":95},"wrangler",[82,128,129],{"class":99}," login\n",[82,131,133],{"class":84,"line":132},6,[82,134,114],{"emptyLinePlaceholder":113},[82,136,138],{"class":84,"line":137},7,[82,139,140],{"class":88},"# 查看账户信息\n",[82,142,144,146],{"class":84,"line":143},8,[82,145,126],{"class":95},[82,147,148],{"class":99}," whoami\n",[26,150,151],{"id":151},"推荐上手顺序",[22,153,154],{},"建议按这个顺序推进：",[156,157,158,164,167,170,173],"ol",{},[33,159,160,161,163],{},"先把 ",[79,162,126],{}," 登录和本地调试跑通",[33,165,166],{},"再写一个最小 Worker 或静态站点",[33,168,169],{},"再补环境变量和 Secret",[33,171,172],{},"再接 KV \u002F D1 \u002F R2 中真正需要的一项",[33,174,175],{},"最后再做生产域名、监控、定时任务和多环境配置",[22,177,178],{},"先把一条最小链路打通，比一开始把所有 Cloudflare 服务都接上更稳。",[26,180,182],{"id":181},"workers-开发","Workers 开发",[184,185,186],"h3",{"id":186},"创建项目",[72,188,190],{"className":74,"code":189,"language":76,"meta":77,"style":77},"wrangler init my-worker\n",[79,191,192],{"__ignoreMap":77},[82,193,194,196,199],{"class":84,"line":85},[82,195,126],{"class":95},[82,197,198],{"class":99}," init",[82,200,201],{"class":99}," my-worker\n",[184,203,204],{"id":204},"基本示例",[72,206,210],{"className":207,"code":208,"language":209,"meta":77,"style":77},"language-typescript shiki shiki-themes github-light github-dark","\u002F\u002F src\u002Findex.ts\nexport default {\n  async fetch(request: Request, env: Env): Promise\u003CResponse> {\n    const url = new URL(request.url);\n\n    if (url.pathname === \"\u002Fapi\u002Fhello\") {\n      return Response.json({ message: \"Hello World\" });\n    }\n\n    return new Response(\"Not Found\", { status: 404 });\n  },\n};\n","typescript",[79,211,212,217,230,279,299,303,320,340,345,350,374,380],{"__ignoreMap":77},[82,213,214],{"class":84,"line":85},[82,215,216],{"class":88},"\u002F\u002F src\u002Findex.ts\n",[82,218,219,223,226],{"class":84,"line":92},[82,220,222],{"class":221},"szBVR","export",[82,224,225],{"class":221}," default",[82,227,229],{"class":228},"sVt8B"," {\n",[82,231,232,235,238,241,245,248,251,254,257,259,262,265,267,270,273,276],{"class":84,"line":110},[82,233,234],{"class":221},"  async",[82,236,237],{"class":95}," fetch",[82,239,240],{"class":228},"(",[82,242,244],{"class":243},"s4XuR","request",[82,246,247],{"class":221},":",[82,249,250],{"class":95}," Request",[82,252,253],{"class":228},", ",[82,255,256],{"class":243},"env",[82,258,247],{"class":221},[82,260,261],{"class":95}," Env",[82,263,264],{"class":228},")",[82,266,247],{"class":221},[82,268,269],{"class":95}," Promise",[82,271,272],{"class":228},"\u003C",[82,274,275],{"class":95},"Response",[82,277,278],{"class":228},"> {\n",[82,280,281,284,287,290,293,296],{"class":84,"line":117},[82,282,283],{"class":221},"    const",[82,285,286],{"class":103}," url",[82,288,289],{"class":221}," =",[82,291,292],{"class":221}," new",[82,294,295],{"class":95}," URL",[82,297,298],{"class":228},"(request.url);\n",[82,300,301],{"class":84,"line":123},[82,302,114],{"emptyLinePlaceholder":113},[82,304,305,308,311,314,317],{"class":84,"line":132},[82,306,307],{"class":221},"    if",[82,309,310],{"class":228}," (url.pathname ",[82,312,313],{"class":221},"===",[82,315,316],{"class":99}," \"\u002Fapi\u002Fhello\"",[82,318,319],{"class":228},") {\n",[82,321,322,325,328,331,334,337],{"class":84,"line":137},[82,323,324],{"class":221},"      return",[82,326,327],{"class":228}," Response.",[82,329,330],{"class":95},"json",[82,332,333],{"class":228},"({ message: ",[82,335,336],{"class":99},"\"Hello World\"",[82,338,339],{"class":228}," });\n",[82,341,342],{"class":84,"line":143},[82,343,344],{"class":228},"    }\n",[82,346,348],{"class":84,"line":347},9,[82,349,114],{"emptyLinePlaceholder":113},[82,351,353,356,358,361,363,366,369,372],{"class":84,"line":352},10,[82,354,355],{"class":221},"    return",[82,357,292],{"class":221},[82,359,360],{"class":95}," Response",[82,362,240],{"class":228},[82,364,365],{"class":99},"\"Not Found\"",[82,367,368],{"class":228},", { status: ",[82,370,371],{"class":103},"404",[82,373,339],{"class":228},[82,375,377],{"class":84,"line":376},11,[82,378,379],{"class":228},"  },\n",[82,381,383],{"class":84,"line":382},12,[82,384,385],{"class":228},"};\n",[184,387,388],{"id":388},"本地开发",[72,390,392],{"className":74,"code":391,"language":76,"meta":77,"style":77},"wrangler dev\n",[79,393,394],{"__ignoreMap":77},[82,395,396,398],{"class":84,"line":85},[82,397,126],{"class":95},[82,399,400],{"class":99}," dev\n",[184,402,403],{"id":403},"部署",[72,405,407],{"className":74,"code":406,"language":76,"meta":77,"style":77},"wrangler deploy\n",[79,408,409],{"__ignoreMap":77},[82,410,411,413],{"class":84,"line":85},[82,412,126],{"class":95},[82,414,415],{"class":99}," deploy\n",[26,417,419],{"id":418},"pages-部署","Pages 部署",[184,421,423],{"id":422},"从-cli-部署","从 CLI 部署",[72,425,427],{"className":74,"code":426,"language":76,"meta":77,"style":77},"# 部署静态站点\nwrangler pages deploy .\u002Fdist --project-name=my-site\n\n# 部署 Nuxt 项目\nnpm run build\nwrangler pages deploy .\u002Fdist\n",[79,428,429,434,450,454,459,469],{"__ignoreMap":77},[82,430,431],{"class":84,"line":85},[82,432,433],{"class":88},"# 部署静态站点\n",[82,435,436,438,441,444,447],{"class":84,"line":92},[82,437,126],{"class":95},[82,439,440],{"class":99}," pages",[82,442,443],{"class":99}," deploy",[82,445,446],{"class":99}," .\u002Fdist",[82,448,449],{"class":103}," --project-name=my-site\n",[82,451,452],{"class":84,"line":110},[82,453,114],{"emptyLinePlaceholder":113},[82,455,456],{"class":84,"line":117},[82,457,458],{"class":88},"# 部署 Nuxt 项目\n",[82,460,461,463,466],{"class":84,"line":123},[82,462,96],{"class":95},[82,464,465],{"class":99}," run",[82,467,468],{"class":99}," build\n",[82,470,471,473,475,477],{"class":84,"line":132},[82,472,126],{"class":95},[82,474,440],{"class":99},[82,476,443],{"class":99},[82,478,479],{"class":99}," .\u002Fdist\n",[184,481,483],{"id":482},"wranglerjsonc-配置","wrangler.jsonc 配置",[72,485,489],{"className":486,"code":487,"language":488,"meta":77,"style":77},"language-jsonc shiki shiki-themes github-light github-dark","{\n  \"name\": \"my-site\",\n  \"pages_build_output_dir\": \".\u002Fdist\",\n  \"compatibility_date\": \"2025-01-01\",\n}\n","jsonc",[79,490,491,496,510,522,534],{"__ignoreMap":77},[82,492,493],{"class":84,"line":85},[82,494,495],{"class":228},"{\n",[82,497,498,501,504,507],{"class":84,"line":92},[82,499,500],{"class":103},"  \"name\"",[82,502,503],{"class":228},": ",[82,505,506],{"class":99},"\"my-site\"",[82,508,509],{"class":228},",\n",[82,511,512,515,517,520],{"class":84,"line":110},[82,513,514],{"class":103},"  \"pages_build_output_dir\"",[82,516,503],{"class":228},[82,518,519],{"class":99},"\".\u002Fdist\"",[82,521,509],{"class":228},[82,523,524,527,529,532],{"class":84,"line":117},[82,525,526],{"class":103},"  \"compatibility_date\"",[82,528,503],{"class":228},[82,530,531],{"class":99},"\"2025-01-01\"",[82,533,509],{"class":228},[82,535,536],{"class":84,"line":123},[82,537,538],{"class":228},"}\n",[26,540,542],{"id":541},"kv-存储","KV 存储",[22,544,545],{},"键值存储，适合配置、缓存等场景。",[72,547,549],{"className":74,"code":548,"language":76,"meta":77,"style":77},"# 创建命名空间\nwrangler kv namespace create MY_KV\n\n# 写入\nwrangler kv key put --namespace-id=xxx \"key\" \"value\"\n\n# 读取\nwrangler kv key get --namespace-id=xxx \"key\"\n",[79,550,551,556,572,576,581,602,606,611],{"__ignoreMap":77},[82,552,553],{"class":84,"line":85},[82,554,555],{"class":88},"# 创建命名空间\n",[82,557,558,560,563,566,569],{"class":84,"line":92},[82,559,126],{"class":95},[82,561,562],{"class":99}," kv",[82,564,565],{"class":99}," namespace",[82,567,568],{"class":99}," create",[82,570,571],{"class":99}," MY_KV\n",[82,573,574],{"class":84,"line":110},[82,575,114],{"emptyLinePlaceholder":113},[82,577,578],{"class":84,"line":117},[82,579,580],{"class":88},"# 写入\n",[82,582,583,585,587,590,593,596,599],{"class":84,"line":123},[82,584,126],{"class":95},[82,586,562],{"class":99},[82,588,589],{"class":99}," key",[82,591,592],{"class":99}," put",[82,594,595],{"class":103}," --namespace-id=xxx",[82,597,598],{"class":99}," \"key\"",[82,600,601],{"class":99}," \"value\"\n",[82,603,604],{"class":84,"line":132},[82,605,114],{"emptyLinePlaceholder":113},[82,607,608],{"class":84,"line":137},[82,609,610],{"class":88},"# 读取\n",[82,612,613,615,617,619,622,624],{"class":84,"line":143},[82,614,126],{"class":95},[82,616,562],{"class":99},[82,618,589],{"class":99},[82,620,621],{"class":99}," get",[82,623,595],{"class":103},[82,625,626],{"class":99}," \"key\"\n",[22,628,629],{},"在 Worker 中使用：",[72,631,633],{"className":207,"code":632,"language":209,"meta":77,"style":77},"export default {\n  async fetch(request: Request, env: Env) {\n    \u002F\u002F 读取\n    const value = await env.MY_KV.get(\"key\");\n\n    \u002F\u002F 写入（可设置过期时间）\n    await env.MY_KV.put(\"key\", \"value\", { expirationTtl: 3600 });\n\n    return Response.json({ value });\n  },\n};\n",[79,634,635,643,667,672,704,708,713,744,748,759,763],{"__ignoreMap":77},[82,636,637,639,641],{"class":84,"line":85},[82,638,222],{"class":221},[82,640,225],{"class":221},[82,642,229],{"class":228},[82,644,645,647,649,651,653,655,657,659,661,663,665],{"class":84,"line":92},[82,646,234],{"class":221},[82,648,237],{"class":95},[82,650,240],{"class":228},[82,652,244],{"class":243},[82,654,247],{"class":221},[82,656,250],{"class":95},[82,658,253],{"class":228},[82,660,256],{"class":243},[82,662,247],{"class":221},[82,664,261],{"class":95},[82,666,319],{"class":228},[82,668,669],{"class":84,"line":110},[82,670,671],{"class":88},"    \u002F\u002F 读取\n",[82,673,674,676,679,681,684,687,690,693,696,698,701],{"class":84,"line":117},[82,675,283],{"class":221},[82,677,678],{"class":103}," value",[82,680,289],{"class":221},[82,682,683],{"class":221}," await",[82,685,686],{"class":228}," env.",[82,688,689],{"class":103},"MY_KV",[82,691,692],{"class":228},".",[82,694,695],{"class":95},"get",[82,697,240],{"class":228},[82,699,700],{"class":99},"\"key\"",[82,702,703],{"class":228},");\n",[82,705,706],{"class":84,"line":123},[82,707,114],{"emptyLinePlaceholder":113},[82,709,710],{"class":84,"line":132},[82,711,712],{"class":88},"    \u002F\u002F 写入（可设置过期时间）\n",[82,714,715,718,720,722,724,727,729,731,733,736,739,742],{"class":84,"line":137},[82,716,717],{"class":221},"    await",[82,719,686],{"class":228},[82,721,689],{"class":103},[82,723,692],{"class":228},[82,725,726],{"class":95},"put",[82,728,240],{"class":228},[82,730,700],{"class":99},[82,732,253],{"class":228},[82,734,735],{"class":99},"\"value\"",[82,737,738],{"class":228},", { expirationTtl: ",[82,740,741],{"class":103},"3600",[82,743,339],{"class":228},[82,745,746],{"class":84,"line":143},[82,747,114],{"emptyLinePlaceholder":113},[82,749,750,752,754,756],{"class":84,"line":347},[82,751,355],{"class":221},[82,753,327],{"class":228},[82,755,330],{"class":95},[82,757,758],{"class":228},"({ value });\n",[82,760,761],{"class":84,"line":352},[82,762,379],{"class":228},[82,764,765],{"class":84,"line":376},[82,766,385],{"class":228},[26,768,770],{"id":769},"d1-数据库","D1 数据库",[22,772,773],{},"边缘 SQLite 数据库。",[72,775,777],{"className":74,"code":776,"language":76,"meta":77,"style":77},"# 创建数据库\nwrangler d1 create my-db\n\n# 执行 SQL\nwrangler d1 execute my-db --command \"CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)\"\n\n# 从文件执行\nwrangler d1 execute my-db --file schema.sql\n",[79,778,779,784,796,800,805,823,827,832],{"__ignoreMap":77},[82,780,781],{"class":84,"line":85},[82,782,783],{"class":88},"# 创建数据库\n",[82,785,786,788,791,793],{"class":84,"line":92},[82,787,126],{"class":95},[82,789,790],{"class":99}," d1",[82,792,568],{"class":99},[82,794,795],{"class":99}," my-db\n",[82,797,798],{"class":84,"line":110},[82,799,114],{"emptyLinePlaceholder":113},[82,801,802],{"class":84,"line":117},[82,803,804],{"class":88},"# 执行 SQL\n",[82,806,807,809,811,814,817,820],{"class":84,"line":123},[82,808,126],{"class":95},[82,810,790],{"class":99},[82,812,813],{"class":99}," execute",[82,815,816],{"class":99}," my-db",[82,818,819],{"class":103}," --command",[82,821,822],{"class":99}," \"CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT)\"\n",[82,824,825],{"class":84,"line":132},[82,826,114],{"emptyLinePlaceholder":113},[82,828,829],{"class":84,"line":137},[82,830,831],{"class":88},"# 从文件执行\n",[82,833,834,836,838,840,842,845],{"class":84,"line":143},[82,835,126],{"class":95},[82,837,790],{"class":99},[82,839,813],{"class":99},[82,841,816],{"class":99},[82,843,844],{"class":103}," --file",[82,846,847],{"class":99}," schema.sql\n",[22,849,629],{},[72,851,853],{"className":207,"code":852,"language":209,"meta":77,"style":77},"export default {\n  async fetch(request: Request, env: Env) {\n    const { results } = await env.DB.prepare(\"SELECT * FROM users WHERE id = ?\")\n      .bind(1)\n      .all();\n\n    return Response.json(results);\n  },\n};\n",[79,854,855,863,887,923,938,948,952,963,967],{"__ignoreMap":77},[82,856,857,859,861],{"class":84,"line":85},[82,858,222],{"class":221},[82,860,225],{"class":221},[82,862,229],{"class":228},[82,864,865,867,869,871,873,875,877,879,881,883,885],{"class":84,"line":92},[82,866,234],{"class":221},[82,868,237],{"class":95},[82,870,240],{"class":228},[82,872,244],{"class":243},[82,874,247],{"class":221},[82,876,250],{"class":95},[82,878,253],{"class":228},[82,880,256],{"class":243},[82,882,247],{"class":221},[82,884,261],{"class":95},[82,886,319],{"class":228},[82,888,889,891,894,897,900,903,905,907,910,912,915,917,920],{"class":84,"line":110},[82,890,283],{"class":221},[82,892,893],{"class":228}," { ",[82,895,896],{"class":103},"results",[82,898,899],{"class":228}," } ",[82,901,902],{"class":221},"=",[82,904,683],{"class":221},[82,906,686],{"class":228},[82,908,909],{"class":103},"DB",[82,911,692],{"class":228},[82,913,914],{"class":95},"prepare",[82,916,240],{"class":228},[82,918,919],{"class":99},"\"SELECT * FROM users WHERE id = ?\"",[82,921,922],{"class":228},")\n",[82,924,925,928,931,933,936],{"class":84,"line":117},[82,926,927],{"class":228},"      .",[82,929,930],{"class":95},"bind",[82,932,240],{"class":228},[82,934,935],{"class":103},"1",[82,937,922],{"class":228},[82,939,940,942,945],{"class":84,"line":123},[82,941,927],{"class":228},[82,943,944],{"class":95},"all",[82,946,947],{"class":228},"();\n",[82,949,950],{"class":84,"line":132},[82,951,114],{"emptyLinePlaceholder":113},[82,953,954,956,958,960],{"class":84,"line":137},[82,955,355],{"class":221},[82,957,327],{"class":228},[82,959,330],{"class":95},[82,961,962],{"class":228},"(results);\n",[82,964,965],{"class":84,"line":143},[82,966,379],{"class":228},[82,968,969],{"class":84,"line":347},[82,970,385],{"class":228},[26,972,974],{"id":973},"r2-对象存储","R2 对象存储",[22,976,977],{},"S3 兼容的对象存储，无出口费用。",[72,979,981],{"className":74,"code":980,"language":76,"meta":77,"style":77},"# 创建 Bucket\nwrangler r2 bucket create my-bucket\n",[79,982,983,988],{"__ignoreMap":77},[82,984,985],{"class":84,"line":85},[82,986,987],{"class":88},"# 创建 Bucket\n",[82,989,990,992,995,998,1000],{"class":84,"line":92},[82,991,126],{"class":95},[82,993,994],{"class":99}," r2",[82,996,997],{"class":99}," bucket",[82,999,568],{"class":99},[82,1001,1002],{"class":99}," my-bucket\n",[22,1004,629],{},[72,1006,1008],{"className":207,"code":1007,"language":209,"meta":77,"style":77},"export default {\n  async fetch(request: Request, env: Env) {\n    \u002F\u002F 上传\n    await env.MY_BUCKET.put(\"file.txt\", \"Hello World\");\n\n    \u002F\u002F 下载\n    const object = await env.MY_BUCKET.get(\"file.txt\");\n    return new Response(object?.body);\n  },\n};\n",[79,1009,1010,1018,1042,1047,1071,1075,1080,1105,1116,1120],{"__ignoreMap":77},[82,1011,1012,1014,1016],{"class":84,"line":85},[82,1013,222],{"class":221},[82,1015,225],{"class":221},[82,1017,229],{"class":228},[82,1019,1020,1022,1024,1026,1028,1030,1032,1034,1036,1038,1040],{"class":84,"line":92},[82,1021,234],{"class":221},[82,1023,237],{"class":95},[82,1025,240],{"class":228},[82,1027,244],{"class":243},[82,1029,247],{"class":221},[82,1031,250],{"class":95},[82,1033,253],{"class":228},[82,1035,256],{"class":243},[82,1037,247],{"class":221},[82,1039,261],{"class":95},[82,1041,319],{"class":228},[82,1043,1044],{"class":84,"line":110},[82,1045,1046],{"class":88},"    \u002F\u002F 上传\n",[82,1048,1049,1051,1053,1056,1058,1060,1062,1065,1067,1069],{"class":84,"line":117},[82,1050,717],{"class":221},[82,1052,686],{"class":228},[82,1054,1055],{"class":103},"MY_BUCKET",[82,1057,692],{"class":228},[82,1059,726],{"class":95},[82,1061,240],{"class":228},[82,1063,1064],{"class":99},"\"file.txt\"",[82,1066,253],{"class":228},[82,1068,336],{"class":99},[82,1070,703],{"class":228},[82,1072,1073],{"class":84,"line":123},[82,1074,114],{"emptyLinePlaceholder":113},[82,1076,1077],{"class":84,"line":132},[82,1078,1079],{"class":88},"    \u002F\u002F 下载\n",[82,1081,1082,1084,1087,1089,1091,1093,1095,1097,1099,1101,1103],{"class":84,"line":137},[82,1083,283],{"class":221},[82,1085,1086],{"class":103}," object",[82,1088,289],{"class":221},[82,1090,683],{"class":221},[82,1092,686],{"class":228},[82,1094,1055],{"class":103},[82,1096,692],{"class":228},[82,1098,695],{"class":95},[82,1100,240],{"class":228},[82,1102,1064],{"class":99},[82,1104,703],{"class":228},[82,1106,1107,1109,1111,1113],{"class":84,"line":143},[82,1108,355],{"class":221},[82,1110,292],{"class":221},[82,1112,360],{"class":95},[82,1114,1115],{"class":228},"(object?.body);\n",[82,1117,1118],{"class":84,"line":347},[82,1119,379],{"class":228},[82,1121,1122],{"class":84,"line":352},[82,1123,385],{"class":228},[26,1125,1127],{"id":1126},"环境变量与-secrets","环境变量与 Secrets",[72,1129,1131],{"className":74,"code":1130,"language":76,"meta":77,"style":77},"# 设置 Secret\nwrangler secret put API_KEY\n\n# 在 wrangler.jsonc 中配置普通变量\n",[79,1132,1133,1138,1150,1154],{"__ignoreMap":77},[82,1134,1135],{"class":84,"line":85},[82,1136,1137],{"class":88},"# 设置 Secret\n",[82,1139,1140,1142,1145,1147],{"class":84,"line":92},[82,1141,126],{"class":95},[82,1143,1144],{"class":99}," secret",[82,1146,592],{"class":99},[82,1148,1149],{"class":99}," API_KEY\n",[82,1151,1152],{"class":84,"line":110},[82,1153,114],{"emptyLinePlaceholder":113},[82,1155,1156],{"class":84,"line":117},[82,1157,1158],{"class":88},"# 在 wrangler.jsonc 中配置普通变量\n",[72,1160,1162],{"className":486,"code":1161,"language":488,"meta":77,"style":77},"{\n  \"vars\": {\n    \"ENVIRONMENT\": \"production\",\n  },\n}\n",[79,1163,1164,1168,1176,1188,1192],{"__ignoreMap":77},[82,1165,1166],{"class":84,"line":85},[82,1167,495],{"class":228},[82,1169,1170,1173],{"class":84,"line":92},[82,1171,1172],{"class":103},"  \"vars\"",[82,1174,1175],{"class":228},": {\n",[82,1177,1178,1181,1183,1186],{"class":84,"line":110},[82,1179,1180],{"class":103},"    \"ENVIRONMENT\"",[82,1182,503],{"class":228},[82,1184,1185],{"class":99},"\"production\"",[82,1187,509],{"class":228},[82,1189,1190],{"class":84,"line":117},[82,1191,379],{"class":228},[82,1193,1194],{"class":84,"line":123},[82,1195,538],{"class":228},[26,1197,1198],{"id":1198},"常见问题",[184,1200,1202],{"id":1201},"本地能跑部署后报绑定不存在","本地能跑，部署后报绑定不存在",[22,1204,1205],{},"通常说明：",[30,1207,1208,1213,1216],{},[33,1209,1210,1212],{},[79,1211,126],{}," 配置里没声明绑定",[33,1214,1215],{},"生产环境和本地环境的变量 \u002F Secret 没同步",[33,1217,1218],{},"Pages \u002F Workers 读的不是同一套配置",[184,1220,1222],{"id":1221},"kv-d1-r2-到底怎么选","KV \u002F D1 \u002F R2 到底怎么选",[22,1224,1225],{},"一个简单判断方式：",[30,1227,1228,1231,1234],{},[33,1229,1230],{},"只按 key 读写：KV",[33,1232,1233],{},"需要 SQL 结构和关系查询：D1",[33,1235,1236],{},"存文件和二进制对象：R2",[184,1238,1240],{"id":1239},"为什么-workers-很快但业务还是不稳","为什么 Workers 很快，但业务还是不稳",[22,1242,1243],{},"边缘函数快不代表整个系统天然稳。真正影响稳定性的往往是：",[30,1245,1246,1249,1252,1255],{},[33,1247,1248],{},"外部 API 延迟",[33,1250,1251],{},"数据存储选择不合适",[33,1253,1254],{},"环境变量和密钥管理混乱",[33,1256,1257],{},"监控和日志没有补齐",[26,1259,1260],{"id":1260},"风险提醒",[30,1262,1263,1266,1269],{},[33,1264,1265],{},"不要把 Secret 放进公开变量",[33,1267,1268],{},"Pages 和 Workers 的环境配置要明确区分",[33,1270,1271],{},"上 D1 \u002F KV \u002F R2 前先确认访问模式，避免先选错存储再返工",[26,1273,1274],{"id":1274},"延伸阅读",[30,1276,1277,1284,1290],{},[33,1278,1279],{},[1280,1281,1283],"a",{"href":1282},"\u002Fdocs\u002Fcloudflare-pages-deploy","Cloudflare Pages 部署指南",[33,1285,1286],{},[1280,1287,1289],{"href":1288},"\u002Fdocs\u002Fci-cd-guide","CI\u002FCD 指南",[33,1291,1292],{},[1280,1293,1295],{"href":1294},"\u002Fdocs\u002Fcontainer-orchestration","容器编排入门",[26,1297,1298],{"id":1298},"参考链接",[30,1300,1301,1310,1318,1326,1334],{},[33,1302,1303,1309],{},[1280,1304,1308],{"href":1305,"rel":1306},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fworkers\u002F",[1307],"nofollow","Cloudflare Workers 文档"," — 官方文档",[33,1311,1312,1317],{},[1280,1313,1316],{"href":1314,"rel":1315},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fpages\u002F",[1307],"Cloudflare Pages 文档"," — 部署指南",[33,1319,1320,1325],{},[1280,1321,1324],{"href":1322,"rel":1323},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fd1\u002F",[1307],"D1 文档"," — 数据库",[33,1327,1328,1333],{},[1280,1329,1332],{"href":1330,"rel":1331},"https:\u002F\u002Fdevelopers.cloudflare.com\u002Fr2\u002F",[1307],"R2 文档"," — 对象存储",[33,1335,1336,1341],{},[1280,1337,1340],{"href":1338,"rel":1339},"https:\u002F\u002Fgithub.com\u002Fcloudflare\u002Fworkers-sdk",[1307],"Wrangler GitHub"," — CLI 源码",[1343,1344,1345],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":77,"searchDepth":92,"depth":92,"links":1347},[1348,1349,1350,1351,1357,1361,1362,1363,1364,1365,1370,1371,1372],{"id":28,"depth":92,"text":28},{"id":69,"depth":92,"text":70},{"id":151,"depth":92,"text":151},{"id":181,"depth":92,"text":182,"children":1352},[1353,1354,1355,1356],{"id":186,"depth":110,"text":186},{"id":204,"depth":110,"text":204},{"id":388,"depth":110,"text":388},{"id":403,"depth":110,"text":403},{"id":418,"depth":92,"text":419,"children":1358},[1359,1360],{"id":422,"depth":110,"text":423},{"id":482,"depth":110,"text":483},{"id":541,"depth":92,"text":542},{"id":769,"depth":92,"text":770},{"id":973,"depth":92,"text":974},{"id":1126,"depth":92,"text":1127},{"id":1198,"depth":92,"text":1198,"children":1366},[1367,1368,1369],{"id":1201,"depth":110,"text":1202},{"id":1221,"depth":110,"text":1222},{"id":1239,"depth":110,"text":1240},{"id":1260,"depth":92,"text":1260},{"id":1274,"depth":92,"text":1274},{"id":1298,"depth":92,"text":1298},{"path":1288,"title":1374,"description":1375,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"CI\u002FCD 实践指南","持续集成与部署概念、GitHub Actions 进阶、自动化测试与部署策略",{"path":1377,"title":1378,"description":1379,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"\u002Fdocs\u002Fcron-scheduling","Cron 定时任务","Cron 表达式语法、常用示例、systemd timer 与 Node.js 定时任务",[1381,1382,1383],"希望把零散经验整理成长期可复用工作流的人","想先建立认知，再决定是否深入实践的人","希望阅读时顺手建立自己的操作清单或收藏体系的人",[1385,1386,1387],"先浏览标题、摘要和目录，带着问题阅读会更高效","顺手记录真正对你有用的命令、链接和注意事项，避免重复搜索","如果页面里提到相关文档，尽量一起打开对照，效果通常更完整",[1389,1392,1396,1400],{"path":1282,"title":1283,"description":1390,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1391,"publishedAt":1391,"icon":13},"Cloudflare Pages 项目部署、自定义域名、环境变量、重定向与 Functions","2026-02-28",{"path":1393,"title":1394,"description":1395,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1391,"publishedAt":1391,"icon":13},"\u002Fdocs\u002Fs3-storage","S3 对象存储","S3 兼容存储使用、Cloudflare R2、MinIO 自建、rclone 同步与 SDK 集成",{"path":1397,"title":1398,"description":1399,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"\u002Fdocs\u002Fmonitoring-logging","监控与日志","服务器监控工具、日志管理、Uptime 监控与告警配置",{"path":1294,"title":1295,"description":1401,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13},"Docker Swarm 与 Kubernetes 基础概念、常用命令与本地开发环境",1776215712459]