[{"data":1,"prerenderedAt":745},["ShallowReactive",2],{"chapter-post-project-replication-guide-01-overview-and-accounts":3},{"chapter":4,"entry":73,"prev":357,"next":358},{"id":5,"title":6,"body":7,"category":55,"cover":52,"date":56,"description":57,"draft":58,"extension":59,"lang":60,"meta":61,"navigation":62,"path":63,"seo":64,"slug":65,"stem":66,"tags":67,"toc":62,"updated":56,"__hash__":72},"chapters/chapters/project-replication-guide.md","零基础完整复刻：Cloudflare 博客项目全流程",{"type":8,"value":9,"toc":51},"minimark",[10,14,17,30,33,45,48],[11,12,13],"p",{},"这个章节是你当前博客项目的“完整复刻手册”。",[11,15,16],{},"目标读者：",[18,19,20,24,27],"ul",{},[21,22,23],"li",{},"没有代码基础",[21,25,26],{},"第一次接触 GitHub、Cloudflare、Nuxt、Decap CMS",[21,28,29],{},"希望照着文档一步步做，最终得到与你当前项目一致的结果",[11,31,32],{},"学习方式建议：",[34,35,36,39,42],"ol",{},[21,37,38],{},"严格按顺序学习，不要跳步骤",[21,40,41],{},"每做完一节就执行“本节验收”",[21,43,44],{},"发现报错先看“常见问题”再继续",[11,46,47],{},"你可以直接从下面目录开始：",[49,50],"chapter-children",{},{"title":52,"searchDepth":53,"depth":53,"links":54},"",2,[],"Chapter","2026-02-14","面向零基础读者的完整项目复刻章节：从准备账号、搭建 Nuxt，到 Pages、Tunnel、CMS、评论、夜间模式与排障。",false,"md","zh-CN",{},true,"/chapters/project-replication-guide",{"title":6,"description":57},"project-replication-guide","chapters/project-replication-guide",[68,69,70,71],"复刻教程","Cloudflare","Nuxt","零基础","T31gU2a4Q3CvJ3Z2B2jyDvX4BtLMmICHnwzpIIudkao",{"id":74,"title":75,"body":76,"category":345,"chapterSlug":65,"cover":52,"date":56,"description":346,"draft":58,"extension":59,"lang":60,"legacySlugs":347,"meta":348,"navigation":62,"order":182,"path":349,"seo":350,"slug":351,"stem":352,"tags":353,"toc":62,"updated":56,"__hash__":356},"chapterPosts/chapter-posts/project-replication-guide/01-overview-and-accounts.md","第 1 节：先把地基打好（目标、账号、工具）",{"type":8,"value":77,"toc":329},[78,83,86,89,100,103,109,113,116,138,141,155,159,164,167,170,190,194,197,199,219,223,226,233,235,251,255,263,266,270,273,300,303,307,311,314,318,325],[79,80,82],"h2",{"id":81},"_11-这一整个项目到底在做什么","1.1 这一整个项目到底在做什么",[11,84,85],{},"你现在要复刻的是一个“静态主站 + 私有预览后台”的博客系统。",[11,87,88],{},"系统分工如下：",[34,90,91,94,97],{},[21,92,93],{},"公开站点：给所有访客看文章，要求稳定、快、便宜。",[21,95,96],{},"私有预览：只给你自己看草稿、后台编辑，要求安全。",[21,98,99],{},"内容管理：用可视化后台写文章，但底层仍是 Git 文件，方便版本管理和回滚。",[11,101,102],{},"一句话概括：",[104,105,106],"blockquote",{},[11,107,108],{},"主站要稳，后台要安全，内容要可追溯。",[79,110,112],{"id":111},"_12-你必须准备的账号","1.2 你必须准备的账号",[11,114,115],{},"按顺序准备下面 4 类账号：",[34,117,118,126,132,135],{},[21,119,120,121,125],{},"GitHub 账号（你已经在用：",[122,123,124],"code",{},"adkeb","）",[21,127,128,129,125],{},"Cloudflare 账号（你已绑定域名 ",[122,130,131],{},"xuyangfly.site",[21,133,134],{},"域名（并且 DNS 在 Cloudflare 管理）",[21,136,137],{},"giscus 所需 GitHub 仓库权限（评论功能）",[11,139,140],{},"为什么必须先准备账号：",[18,142,143,146,149,152],{},[21,144,145],{},"没有 GitHub：无法做代码仓库与自动部署",[21,147,148],{},"没有 Cloudflare：无法托管 Pages、Tunnel、Access",[21,150,151],{},"没有域名：无法做正式地址与 HTTPS",[21,153,154],{},"没有仓库权限：CMS/OAuth/评论全都做不通",[79,156,158],{"id":157},"_13-你必须安装的本地工具","1.3 你必须安装的本地工具",[160,161,163],"h3",{"id":162},"git","Git",[11,165,166],{},"作用：把代码提交到 GitHub。",[11,168,169],{},"检查命令：",[171,172,176],"pre",{"className":173,"code":174,"language":175,"meta":52,"style":52},"language-bash shiki shiki-themes github-light github-dark","git --version\n","bash",[122,177,178],{"__ignoreMap":52},[179,180,183,186],"span",{"class":181,"line":182},"line",1,[179,184,162],{"class":185},"sScJk",[179,187,189],{"class":188},"sj4cs"," --version\n",[160,191,193],{"id":192},"nodejs建议-20","Node.js（建议 20+）",[11,195,196],{},"作用：运行 Nuxt 项目、安装依赖。",[11,198,169],{},[171,200,202],{"className":173,"code":201,"language":175,"meta":52,"style":52},"node -v\nnpm -v\n",[122,203,204,212],{"__ignoreMap":52},[179,205,206,209],{"class":181,"line":182},[179,207,208],{"class":185},"node",[179,210,211],{"class":188}," -v\n",[179,213,214,217],{"class":181,"line":53},[179,215,216],{"class":185},"npm",[179,218,211],{"class":188},[160,220,222],{"id":221},"wranglercloudflare-cli","Wrangler（Cloudflare CLI）",[11,224,225],{},"作用：部署 Decap OAuth Worker。",[11,227,228,229,232],{},"你可以不全局安装，用 ",[122,230,231],{},"npx wrangler ..."," 临时调用。",[11,234,169],{},[171,236,238],{"className":173,"code":237,"language":175,"meta":52,"style":52},"npx wrangler --version\n",[122,239,240],{"__ignoreMap":52},[179,241,242,245,249],{"class":181,"line":182},[179,243,244],{"class":185},"npx",[179,246,248],{"class":247},"sZZnC"," wrangler",[179,250,189],{"class":188},[79,252,254],{"id":253},"_14-你的项目目录结构你将频繁看到","1.4 你的项目目录结构（你将频繁看到）",[171,256,261],{"className":257,"code":259,"language":260,"meta":52},[258],"language-text","content/\n  posts/                  # 普通文章\n  chapters/               # 章节父文\n  chapter-posts/          # 章节子文章\npublic/admin/config.yml   # Decap CMS 配置\nops/decap-oauth/worker.js # OAuth Worker\npages/                    # 前端路由页面\nserver/routes/            # RSS/Sitemap/Search API\nassets/css/main.css       # 全局样式（含夜间模式变量）\n","text",[122,262,259],{"__ignoreMap":52},[11,264,265],{},"你现在先不用死记，后面每节会反复用到。",[79,267,269],{"id":268},"_15-本节验收你必须确认","1.5 本节验收（你必须确认）",[11,271,272],{},"请逐项确认：",[34,274,275,278,285,295],{},[21,276,277],{},"你可以登录 GitHub 和 Cloudflare。",[21,279,280,281,284],{},"你能看到仓库 ",[122,282,283],{},"adkeb/blog","。",[21,286,287,288,291,292,284],{},"本地能执行 ",[122,289,290],{},"git --version","、",[122,293,294],{},"node -v",[21,296,287,297,284],{},[122,298,299],{},"npx wrangler --version",[11,301,302],{},"只要这 4 项都完成，你就具备继续复刻的基础条件。",[79,304,306],{"id":305},"_16-常见问题","1.6 常见问题",[160,308,310],{"id":309},"问我不会命令行能复刻吗","问：我不会命令行，能复刻吗？",[11,312,313],{},"可以。你只需要复制命令执行，不需要理解每个参数的全部细节。",[160,315,317],{"id":316},"问我用的是-conda-base-环境会冲突吗","问：我用的是 Conda base 环境，会冲突吗？",[11,319,320,321,324],{},"不会。你当前环境已经能跑 ",[122,322,323],{},"npx wrangler","，说明链路可用。",[326,327,328],"style",{},"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 .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 .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":52,"searchDepth":53,"depth":53,"links":330},[331,332,333,339,340,341],{"id":81,"depth":53,"text":82},{"id":111,"depth":53,"text":112},{"id":157,"depth":53,"text":158,"children":334},[335,337,338],{"id":162,"depth":336,"text":163},3,{"id":192,"depth":336,"text":193},{"id":221,"depth":336,"text":222},{"id":253,"depth":53,"text":254},{"id":268,"depth":53,"text":269},{"id":305,"depth":53,"text":306,"children":342},[343,344],{"id":309,"depth":336,"text":310},{"id":316,"depth":336,"text":317},"Guide","你要先准备哪些账号和工具，为什么必须先做这一步，以及每个工具在项目里的职责。",[],{},"/chapter-posts/project-replication-guide/01-overview-and-accounts",{"title":75,"description":346},"01-overview-and-accounts","chapter-posts/project-replication-guide/01-overview-and-accounts",[68,354,355],"入门","准备工作","CfszBs4t3aWnlVWtnHvBt_fWCo-M-1dKC87r8KEAhh8",null,{"id":359,"title":360,"body":361,"category":345,"chapterSlug":65,"cover":52,"date":56,"description":735,"draft":58,"extension":59,"lang":60,"legacySlugs":736,"meta":737,"navigation":62,"order":53,"path":738,"seo":739,"slug":740,"stem":741,"tags":742,"toc":62,"updated":56,"__hash__":744},"chapterPosts/chapter-posts/project-replication-guide/02-local-dev-and-nuxt-content.md","第 2 节：本地跑起来（Nuxt + Content + 环境变量）",{"type":8,"value":362,"toc":728},[363,367,370,403,409,412,423,427,433,515,518,538,541,555,559,565,568,607,610,618,621,625,631,651,658,661,678,682,685,708,711,725],[79,364,366],{"id":365},"_21-安装依赖并启动项目","2.1 安装依赖并启动项目",[11,368,369],{},"在项目根目录执行：",[171,371,373],{"className":173,"code":372,"language":175,"meta":52,"style":52},"npm install\ncp .env.example .env\nnpm run dev\n",[122,374,375,382,393],{"__ignoreMap":52},[179,376,377,379],{"class":181,"line":182},[179,378,216],{"class":185},[179,380,381],{"class":247}," install\n",[179,383,384,387,390],{"class":181,"line":53},[179,385,386],{"class":185},"cp",[179,388,389],{"class":247}," .env.example",[179,391,392],{"class":247}," .env\n",[179,394,395,397,400],{"class":181,"line":336},[179,396,216],{"class":185},[179,398,399],{"class":247}," run",[179,401,402],{"class":247}," dev\n",[11,404,405,406,284],{},"然后打开浏览器：",[122,407,408],{},"http://localhost:3000",[11,410,411],{},"这一步成功，代表：",[34,413,414,417,420],{},[21,415,416],{},"依赖安装正常",[21,418,419],{},"Nuxt 开发服务器可运行",[21,421,422],{},"项目基础代码可读",[79,424,426],{"id":425},"_22-先理解脚本你之后会一直用","2.2 先理解脚本（你之后会一直用）",[11,428,429,432],{},[122,430,431],{},"package.json"," 里的脚本：",[171,434,438],{"className":435,"code":436,"language":437,"meta":52,"style":52},"language-json shiki shiki-themes github-light github-dark","{\n  \"dev\": \"nuxt dev\",\n  \"build\": \"nuxt build\",\n  \"generate\": \"nuxt generate\",\n  \"preview\": \"nuxt preview\",\n  \"check\": \"nuxt typecheck\"\n}\n","json",[122,439,440,446,460,472,485,498,509],{"__ignoreMap":52},[179,441,442],{"class":181,"line":182},[179,443,445],{"class":444},"sVt8B","{\n",[179,447,448,451,454,457],{"class":181,"line":53},[179,449,450],{"class":188},"  \"dev\"",[179,452,453],{"class":444},": ",[179,455,456],{"class":247},"\"nuxt dev\"",[179,458,459],{"class":444},",\n",[179,461,462,465,467,470],{"class":181,"line":336},[179,463,464],{"class":188},"  \"build\"",[179,466,453],{"class":444},[179,468,469],{"class":247},"\"nuxt build\"",[179,471,459],{"class":444},[179,473,475,478,480,483],{"class":181,"line":474},4,[179,476,477],{"class":188},"  \"generate\"",[179,479,453],{"class":444},[179,481,482],{"class":247},"\"nuxt generate\"",[179,484,459],{"class":444},[179,486,488,491,493,496],{"class":181,"line":487},5,[179,489,490],{"class":188},"  \"preview\"",[179,492,453],{"class":444},[179,494,495],{"class":247},"\"nuxt preview\"",[179,497,459],{"class":444},[179,499,501,504,506],{"class":181,"line":500},6,[179,502,503],{"class":188},"  \"check\"",[179,505,453],{"class":444},[179,507,508],{"class":247},"\"nuxt typecheck\"\n",[179,510,512],{"class":181,"line":511},7,[179,513,514],{"class":444},"}\n",[11,516,517],{},"逐条解释：",[34,519,520,526,532],{},[21,521,522,525],{},[122,523,524],{},"dev","：本地开发，改代码会热更新。",[21,527,528,531],{},[122,529,530],{},"generate","：生成静态站（Cloudflare Pages 用这个）。",[21,533,534,537],{},[122,535,536],{},"check","：类型检查，防止明显代码错误。",[11,539,540],{},"你要形成习惯：",[18,542,543,549],{},[21,544,545,546],{},"每次关键改动后跑 ",[122,547,548],{},"npm run check",[21,550,551,552],{},"准备推送前跑 ",[122,553,554],{},"npm run generate",[79,556,558],{"id":557},"_23-环境变量为什么这么重要","2.3 环境变量为什么这么重要",[11,560,561,564],{},[122,562,563],{},".env"," 是项目行为总开关。",[11,566,567],{},"你项目中的关键变量：",[34,569,570,580,589,595,601],{},[21,571,572,575,576,579],{},[122,573,574],{},"SITE_URL"," / ",[122,577,578],{},"NUXT_PUBLIC_SITE_URL","：正式站地址",[21,581,582,575,585,588],{},[122,583,584],{},"PREVIEW_URL",[122,586,587],{},"NUXT_PUBLIC_PREVIEW_URL","：预览地址",[21,590,591,594],{},[122,592,593],{},"NUXT_PUBLIC_SHOW_DRAFTS","：是否显示草稿",[21,596,597,600],{},[122,598,599],{},"GISCUS_*","：评论系统配置",[21,602,603,606],{},[122,604,605],{},"CF_ACCESS_AUD","：Cloudflare Access 拓展鉴权字段",[11,608,609],{},"最常见错误：",[18,611,612,615],{},[21,613,614],{},"变量只填了 Production，没填 Preview",[21,616,617],{},"public 与非 public 混用，导致客户端拿不到值",[11,619,620],{},"你的项目已经采用“双写兼容”方式，降低此类风险。",[79,622,624],{"id":623},"_24-内容模型为什么你的文章能变成页面","2.4 内容模型：为什么你的文章能变成页面",[11,626,627,630],{},[122,628,629],{},"content.config.ts"," 定义了 3 套内容集合：",[34,632,633,639,645],{},[21,634,635,638],{},[122,636,637],{},"posts","：普通文章",[21,640,641,644],{},[122,642,643],{},"chapters","：章节父文",[21,646,647,650],{},[122,648,649],{},"chapterPosts","：章节子文章",[11,652,653,654,657],{},"系统会把 Markdown frontmatter 字段（例如 ",[122,655,656],{},"title/date/tags","）解析成可查询数据。",[11,659,660],{},"你看到的页面路由是：",[18,662,663,668,673],{},[21,664,665],{},[122,666,667],{},"/posts/:slug",[21,669,670],{},[122,671,672],{},"/chapters/:chapterSlug",[21,674,675],{},[122,676,677],{},"/chapters/:chapterSlug/:slug",[79,679,681],{"id":680},"_25-本节验收","2.5 本节验收",[11,683,684],{},"执行并确认：",[171,686,688],{"className":173,"code":687,"language":175,"meta":52,"style":52},"npm run check\nnpm run generate\n",[122,689,690,699],{"__ignoreMap":52},[179,691,692,694,696],{"class":181,"line":182},[179,693,216],{"class":185},[179,695,399],{"class":247},[179,697,698],{"class":247}," check\n",[179,700,701,703,705],{"class":181,"line":53},[179,702,216],{"class":185},[179,704,399],{"class":247},[179,706,707],{"class":247}," generate\n",[11,709,710],{},"验收标准：",[34,712,713,716,719],{},[21,714,715],{},"两条命令都通过",[21,717,718],{},"本地页面可正常打开",[21,720,721,722,724],{},"你能看懂 ",[122,723,563],{}," 每个字段大概作用",[326,726,727],{},"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 .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":52,"searchDepth":53,"depth":53,"links":729},[730,731,732,733,734],{"id":365,"depth":53,"text":366},{"id":425,"depth":53,"text":426},{"id":557,"depth":53,"text":558},{"id":623,"depth":53,"text":624},{"id":680,"depth":53,"text":681},"从零启动本地站点，理解 .env、内容模型、页面路由和构建脚本。",[],{},"/chapter-posts/project-replication-guide/02-local-dev-and-nuxt-content",{"title":360,"description":735},"02-local-dev-and-nuxt-content","chapter-posts/project-replication-guide/02-local-dev-and-nuxt-content",[68,70,743],"环境变量","gOmH9AS2UrLEZ73n0vFL9_RNxvaWrYWbSXr6PLbCQWI",1771232916064]