[{"data":1,"prerenderedAt":589},["ShallowReactive",2],{"article-list":3},[4,366,428],{"id":5,"title":6,"body":7,"date":353,"description":354,"extension":355,"meta":356,"navigation":357,"path":358,"published":357,"seo":359,"stem":360,"tags":361,"__hash__":365},"articles\u002Farticles\u002Fdeploy-cloudflare-workers.md","把 Nuxt 站点部署到 Cloudflare Workers",{"type":8,"value":9,"toc":347},"minimark",[10,14,18,26,192,196,220,231,247,254,272,275,282,296,299,302,337,343],[11,12,13],"p",{},"Cloudflare Workers 上可以运行 Node.js 兼容的完整 Nuxt 服务端渲染应用，而且全球边缘节点访问都很快。由于 Nuxt Content v3 使用 SQLite 存储文章索引，部署到 Cloudflare 时需要配一个 D1 数据库。",[15,16,17],"h2",{"id":17},"项目里已经做了什么",[11,19,20,21,25],{},"项目已经把 Nitro 预设配置为 Cloudflare Worker，Wrangler 配置会在构建时自动生成，无需手写 ",[22,23,24],"code",{},"wrangler.jsonc","：",[27,28,33],"pre",{"className":29,"code":30,"language":31,"meta":32,"style":32},"language-ts shiki shiki-themes github-light github-dark","\u002F\u002F nuxt.config.ts\nnitro: {\n  preset: 'cloudflare_module',\n  cloudflare: {\n    deployConfig: true,\n    wrangler: {\n      name: 'huozhe-me',\n      d1_databases: [\n        {\n          binding: 'DB',\n          database_name: 'huozhe-me-content',\n          database_id: '替换为真实 ID',\n        },\n      ],\n    },\n  },\n}\n","ts","",[22,34,35,44,55,71,79,93,101,114,123,129,140,151,162,168,174,180,186],{"__ignoreMap":32},[36,37,40],"span",{"class":38,"line":39},"line",1,[36,41,43],{"class":42},"sJ8bj","\u002F\u002F nuxt.config.ts\n",[36,45,47,51],{"class":38,"line":46},2,[36,48,50],{"class":49},"sScJk","nitro",[36,52,54],{"class":53},"sVt8B",": {\n",[36,56,58,61,64,68],{"class":38,"line":57},3,[36,59,60],{"class":49},"  preset",[36,62,63],{"class":53},": ",[36,65,67],{"class":66},"sZZnC","'cloudflare_module'",[36,69,70],{"class":53},",\n",[36,72,74,77],{"class":38,"line":73},4,[36,75,76],{"class":49},"  cloudflare",[36,78,54],{"class":53},[36,80,82,85,87,91],{"class":38,"line":81},5,[36,83,84],{"class":49},"    deployConfig",[36,86,63],{"class":53},[36,88,90],{"class":89},"sj4cs","true",[36,92,70],{"class":53},[36,94,96,99],{"class":38,"line":95},6,[36,97,98],{"class":49},"    wrangler",[36,100,54],{"class":53},[36,102,104,107,109,112],{"class":38,"line":103},7,[36,105,106],{"class":49},"      name",[36,108,63],{"class":53},[36,110,111],{"class":66},"'huozhe-me'",[36,113,70],{"class":53},[36,115,117,120],{"class":38,"line":116},8,[36,118,119],{"class":49},"      d1_databases",[36,121,122],{"class":53},": [\n",[36,124,126],{"class":38,"line":125},9,[36,127,128],{"class":53},"        {\n",[36,130,132,135,138],{"class":38,"line":131},10,[36,133,134],{"class":53},"          binding: ",[36,136,137],{"class":66},"'DB'",[36,139,70],{"class":53},[36,141,143,146,149],{"class":38,"line":142},11,[36,144,145],{"class":53},"          database_name: ",[36,147,148],{"class":66},"'huozhe-me-content'",[36,150,70],{"class":53},[36,152,154,157,160],{"class":38,"line":153},12,[36,155,156],{"class":53},"          database_id: ",[36,158,159],{"class":66},"'替换为真实 ID'",[36,161,70],{"class":53},[36,163,165],{"class":38,"line":164},13,[36,166,167],{"class":53},"        },\n",[36,169,171],{"class":38,"line":170},14,[36,172,173],{"class":53},"      ],\n",[36,175,177],{"class":38,"line":176},15,[36,178,179],{"class":53},"    },\n",[36,181,183],{"class":38,"line":182},16,[36,184,185],{"class":53},"  },\n",[36,187,189],{"class":38,"line":188},17,[36,190,191],{"class":53},"}\n",[15,193,195],{"id":194},"创建-d1-数据库","创建 D1 数据库",[27,197,201],{"className":198,"code":199,"language":200,"meta":32,"style":32},"language-bash shiki shiki-themes github-light github-dark","npx wrangler d1 create huozhe-me-content\n","bash",[22,202,203],{"__ignoreMap":32},[36,204,205,208,211,214,217],{"class":38,"line":39},[36,206,207],{"class":49},"npx",[36,209,210],{"class":66}," wrangler",[36,212,213],{"class":66}," d1",[36,215,216],{"class":66}," create",[36,218,219],{"class":66}," huozhe-me-content\n",[11,221,222,223,226,227,230],{},"把输出的 ",[22,224,225],{},"database_id"," 填回 ",[22,228,229],{},"nuxt.config.ts","，然后执行：",[27,232,234],{"className":198,"code":233,"language":200,"meta":32,"style":32},"npm run deploy\n",[22,235,236],{"__ignoreMap":32},[36,237,238,241,244],{"class":38,"line":39},[36,239,240],{"class":49},"npm",[36,242,243],{"class":66}," run",[36,245,246],{"class":66}," deploy\n",[11,248,249,250,253],{},"这条命令会先构建 Nuxt（生成 ",[22,251,252],{},".output\u002Fserver\u002Findex.mjs"," 与 SQL 内容 dump），再用 Wrangler 部署到 Cloudflare。",[11,255,256,257,25,260,263,264,267,268,271],{},"构建产物位于 ",[22,258,259],{},".output\u002F",[22,261,262],{},"server\u002Findex.mjs"," 是 Worker 入口，",[22,265,266],{},"public\u002F"," 是静态资源，",[22,269,270],{},".output\u002Fserver\u002Fwrangler.json"," 是自动生成的部署配置。",[15,273,274],{"id":274},"本地开发不受影响",[11,276,277,278,281],{},"开发模式走本地 SQLite（",[22,279,280],{},"better-sqlite3","），只有生产构建与部署才会切到 D1：",[27,283,285],{"className":198,"code":284,"language":200,"meta":32,"style":32},"npm run dev\n",[22,286,287],{"__ignoreMap":32},[36,288,289,291,293],{"class":38,"line":39},[36,290,240],{"class":49},[36,292,243],{"class":66},[36,294,295],{"class":66}," dev\n",[15,297,298],{"id":298},"绑定自定义域名",[11,300,301],{},"部署成功后，在 Cloudflare Dashboard 中打开 Worker 页面：",[303,304,305,313,323,330],"ol",{},[306,307,308,309],"li",{},"进入 Worker 的 ",[310,311,312],"strong",{},"Settings → Domains & Routes",[306,314,315,316,319,320],{},"点击 ",[310,317,318],{},"Add","，选择 ",[310,321,322],{},"Custom Domain",[306,324,325,326,329],{},"输入 ",[22,327,328],{},"huozhe.me","，按提示验证并保存",[306,331,332,333,336],{},"再添加一条 ",[22,334,335],{},"www.huozhe.me"," 指向同一个 Worker（可选）",[11,338,339,340,342],{},"前提是 ",[22,341,328],{}," 这个域名已经由 Cloudflare 托管（DNS 生效中）。",[344,345,346],"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 .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}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);}",{"title":32,"searchDepth":46,"depth":46,"links":348},[349,350,351,352],{"id":17,"depth":46,"text":17},{"id":194,"depth":46,"text":195},{"id":274,"depth":46,"text":274},{"id":298,"depth":46,"text":298},"2026-09-09","从 build 到绑定 huozhe.me 自定义域名的完整步骤。","md",{},true,"\u002Farticles\u002Fdeploy-cloudflare-workers",{"title":6,"description":354},"articles\u002Fdeploy-cloudflare-workers",[362,363,364],"Cloudflare","Nuxt","部署","Xq2iZLY76n1uN7mRolnT7tz1e9sH_UzLLg4veGsFzTw",{"id":367,"title":368,"body":369,"date":353,"description":419,"extension":355,"meta":420,"navigation":357,"path":421,"published":357,"seo":422,"stem":423,"tags":424,"__hash__":427},"articles\u002Farticles\u002Fhello-world.md","你好，huozhe.me",{"type":8,"value":370,"toc":415},[371,374,377,380,383,395,398,401,412],[11,372,373],{},"今天，huozhe.me 上线了。",[15,375,376],{"id":376},"为什么做这个站",[11,378,379],{},"很多想法不写下来，过几天就忘了。很多问题当时觉得很难，解决之后不记录，下次还会再踩一遍。",[11,381,382],{},"所以决定搭一个小而轻的文章站：",[384,385,386,389,392],"ul",{},[306,387,388],{},"打开够快",[306,390,391],{},"写文章够简单",[306,393,394],{},"维护成本足够低",[15,396,397],{"id":397},"会写些什么",[11,399,400],{},"大概会写这些内容：",[384,402,403,406,409],{},[306,404,405],{},"技术与编程笔记",[306,407,408],{},"生活里值得留存的片段",[306,410,411],{},"一些不成体系但有意思的思考",[11,413,414],{},"欢迎常来。",{"title":32,"searchDepth":46,"depth":46,"links":416},[417,418],{"id":376,"depth":46,"text":376},{"id":397,"depth":46,"text":397},"新站开张，写一篇自我介绍。",{},"\u002Farticles\u002Fhello-world",{"title":368,"description":419},"articles\u002Fhello-world",[425,426],"随笔","开站","gBTwC19fohl8WxhkAWncfqE0JkTjllluSRXC8_Ds7sk",{"id":429,"title":430,"body":431,"date":353,"description":581,"extension":355,"meta":582,"navigation":357,"path":583,"published":357,"seo":584,"stem":585,"tags":586,"__hash__":588},"articles\u002Farticles\u002Fwriting-with-nuxt-content.md","用 Nuxt Content 写文章是一种什么体验",{"type":8,"value":432,"toc":576},[433,444,448,455,508,511,517,549,552,555,558,570,573],[11,434,435,436,443],{},"这个站使用 ",[437,438,442],"a",{"href":439,"rel":440},"https:\u002F\u002Fcontent.nuxt.com",[441],"nofollow","Nuxt Content"," 管理文章。它把内容当作代码的一部分，而非放进数据库。",[15,445,447],{"id":446},"一篇文章就是一个-markdown-文件","一篇文章就是一个 Markdown 文件",[11,449,450,451,454],{},"新建文章时，只需要在 ",[22,452,453],{},"content\u002Farticles\u002F"," 目录下增加文件：",[27,456,459],{"className":457,"code":458,"language":355,"meta":32,"style":32},"language-md shiki shiki-themes github-light github-dark","---\ntitle: 我的新文章\ndescription: 一句话描述\ndate: \"2026-09-09\"\ntags: [技术]\n---\n\n正文开始……\n",[22,460,461,467,472,477,482,494,498,503],{"__ignoreMap":32},[36,462,463],{"class":38,"line":39},[36,464,466],{"class":465},"sq-ep","---\n",[36,468,469],{"class":38,"line":46},[36,470,471],{"class":53},"title: 我的新文章\n",[36,473,474],{"class":38,"line":57},[36,475,476],{"class":53},"description: 一句话描述\n",[36,478,479],{"class":38,"line":73},[36,480,481],{"class":53},"date: \"2026-09-09\"\n",[36,483,484,487,491],{"class":38,"line":81},[36,485,486],{"class":53},"tags: [",[36,488,490],{"class":489},"svl0z","技术",[36,492,493],{"class":53},"]\n",[36,495,496],{"class":38,"line":95},[36,497,466],{"class":465},[36,499,500],{"class":38,"line":103},[36,501,502],{"emptyLinePlaceholder":357},"\n",[36,504,505],{"class":38,"line":116},[36,506,507],{"class":53},"正文开始……\n",[15,509,510],{"id":510},"类型安全的内容集合",[11,512,513,516],{},[22,514,515],{},"content.config.ts"," 里定义了文章的字段 schema：",[384,518,519,525,531,537,543],{},[306,520,521,524],{},[22,522,523],{},"title","：文章标题",[306,526,527,530],{},[22,528,529],{},"description","：摘要",[306,532,533,536],{},[22,534,535],{},"date","：发布日期",[306,538,539,542],{},[22,540,541],{},"tags","：标签列表",[306,544,545,548],{},[22,546,547],{},"published","：是否发布",[11,550,551],{},"定义之后，列表页和详情页都可以直接查询，字段也有类型提示。",[15,553,554],{"id":554},"写作流程",[11,556,557],{},"本地写作：",[27,559,560],{"className":198,"code":284,"language":200,"meta":32,"style":32},[22,561,562],{"__ignoreMap":32},[36,563,564,566,568],{"class":38,"line":39},[36,565,240],{"class":49},[36,567,243],{"class":66},[36,569,295],{"class":66},[11,571,572],{},"写好后提交并推送，站点会自动构建部署。Markdown 的排版、代码高亮、列表都由组件渲染，你只需要关心内容本身。",[344,574,575],{},"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 .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 .sq-ep, html code.shiki .sq-ep{--shiki-default:#005CC5;--shiki-default-font-weight:bold;--shiki-dark:#79B8FF;--shiki-dark-font-weight:bold}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .svl0z, html code.shiki .svl0z{--shiki-default:#032F62;--shiki-default-text-decoration:underline;--shiki-dark:#DBEDFF;--shiki-dark-text-decoration:underline}",{"title":32,"searchDepth":46,"depth":46,"links":577},[578,579,580],{"id":446,"depth":46,"text":447},{"id":510,"depth":46,"text":510},{"id":554,"depth":46,"text":554},"Markdown 即内容，提交代码即发布。",{},"\u002Farticles\u002Fwriting-with-nuxt-content",{"title":430,"description":581},"articles\u002Fwriting-with-nuxt-content",[363,587],"写作","DWuX9XdnhyiudQveBQ_EwptXplv7tXGQYZWBnM2lxZ8",1788926776465]