[{"data":1,"prerenderedAt":1360},["ShallowReactive",2],{"article-\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F01-远古产物—博客":3,"article-around-\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F01-远古产物—博客":1142},{"id":4,"title":5,"author":6,"body":7,"category":1130,"cover":1131,"date":1132,"description":5,"draft":1133,"extension":1134,"image":1135,"license":1131,"meta":1136,"minutes":252,"navigation":878,"path":1137,"pinned":1133,"seo":1138,"stem":1139,"tags":1140,"__hash__":1141},"blog\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F01-远古产物—博客.md","赛博空间的私人岛屿：博客架构与风格美学","张萌萌",{"type":8,"value":9,"toc":1118},"minimark",[10,14,21,24,29,49,52,56,62,67,72,88,110,115,120,124,127,173,178,182,187,190,199,852,856,859,890,894,902,995,999,1014,1072,1088,1092,1095,1101,1106,1111,1114],[11,12,13],"h2",{"id":13},"序言",[15,16,17],"blockquote",{},[18,19,20],"p",{},"“在信息洪流的喧嚣中，我们需要一块礁石来安放灵魂与代码。”",[18,22,23],{},"建立一个独立博客，不仅是沉淀技术与思考的自留地，更是你在广袤互联网上的一张专属数字名片。无论是记录底层架构的折腾日常，还是定格生活中的光影瞬间，博客都能以最纯粹的姿态，向世界宣告你的存在。",[15,25,26],{},[18,27,28],{},"“博客就是上古遗弃的玩意，不亚于废土风格。”",[18,30,31,32,36,37,40,41,44,45,48],{},"但恰恰是这种废土风格，赋予了它一种极致的浪漫与自由。就像在这片荒芜的互联网大陆上不断迁徙，从 ",[33,34,35],"strong",{},"Halo 2"," 走到 ",[33,38,39],{},"Typecho","，再重构到 ",[33,42,43],{},"WordPress","，最后用 ",[33,46,47],{},"Astro"," 搭建起一座极致轻量级的数字庇护所。每一次主题的修改、容器的部署和数据库的迁移，都像是废土客在废墟中搜集旧时代的电子零件，亲手拼凑、打磨出属于自己的机甲。",[18,50,51],{},"这种带有颗粒感和孤独感的粗犷美学，莫名有一种姜文电影里的味道——在荒诞和喧嚣的互联网大环境下，带着一种不合时宜却又极其硬核的坚持，让代码和文字在自己的一亩三分地里自由地飞一会儿。",[11,53,55],{"id":54},"_1-最初的想法","1 最初的想法",[18,57,58,59,61],{},"最初我想搭建一个博客，其实我只会用 ",[33,60,35],{}," 这样的动态博客。",[15,63,64],{},[18,65,66],{},"什么是动态博客？",[18,68,69],{},[33,70,71],{},"动态博客其实就是有后端，后端负责让前端用户请求实时动起来，所以需要数据库，也就是要购买独立服务器搭建，比较吃性能。",[18,73,74,75,77,78,80,81,83,84,87],{},"后面我发现大家都在用 ",[33,76,43],{}," 和 ",[33,79,39],{},"，我也尝试着去装，发现虽然不是那么吃硬件性能对于我的量级来说。但是更换主题，那些还是不舒服，最后还是选择在 ",[33,82,35],{}," 这样的博客上玩耍。",[33,85,86],{},"新手必定推荐 Halo 2，只要你硬件硬性够","。",[18,89,90,91,94,95,98,99,101,102,105,106,109],{},"直到我接触到 ",[33,92,93],{},"vitepress"," 这样的静态站点，安装好 ",[33,96,97],{},"node.js","，最后按照 ",[33,100,93],{}," 官方文档构建就可以。可是这样的静态站点基本上是用编辑 ",[33,103,104],{},".md"," 文档，这样的",[33,107,108],{},"Markdown"," 编辑器也有很多。",[15,111,112],{},[18,113,114],{},"什么是静态博客？",[18,116,117],{},[33,118,119],{},"静态博客就是没有后端，不能实时交互添加功能，每一次添加功能，修改文档都需要重新构建一次。最主要的是不需要服务器，可以使用腾讯的 Edge One 或者 Cloudflare 搭建。",[11,121,123],{"id":122},"_2-欲望暴涨","2 欲望暴涨",[18,125,126],{},"再也不愿意只能写文档的博客，一直在寻找一款比较好的博客，需要满足以下几点。",[128,129,130,134,137,140,143,146,149,152,155,158,161,164,167,170],"ul",{},[131,132,133],"li",{},"底层是以 md 文档维护，再也不用一次一次的复制粘贴，还要担心格式问题。",[131,135,136],{},"架构轻量，不要太臃肿",[131,138,139],{},"响应速度快",[131,141,142],{},"部署简单",[131,144,145],{},"网站整体风格、文章阅读界面唯美",[131,147,148],{},"首页大屏壁纸随机轮播，有打字机功能，波浪水纹波流动效果",[131,150,151],{},"首页侧边栏，个人简介、公告、分类、标签、日历、统计信息、音乐、每日一言",[131,153,154],{},"评论系统，可以接入 twikoo",[131,156,157],{},"站点统计",[131,159,160],{},"相册、留言板、导航栏",[131,162,163],{},"全文搜索功能",[131,165,166],{},"部署文档、说明要完整详细",[131,168,169],{},"博客数据迁移方便",[131,171,172],{},"做一个只用写 md 文档就可以完善自己的博客",[18,174,175],{},[33,176,177],{},"我探路了这么多博客，我最喜欢的动态博客就是 Halo 2。静态博客我用过 vitepreee，不过是天客大佬的版本；以及 Astro，不过是 Firefly 在  Fuwari 模板下二开，都是非常不错的静态博客，现在我在用的也是这俩静态博客。",[11,179,181],{"id":180},"_3-最终选择","3 最终选择",[183,184,186],"h3",{"id":185},"_31-halo-2-安装","3.1 Halo 2 安装",[18,188,189],{},"Halo 2 是一款强大易用的开源建站工具，从个人博客、知识库，到企业官网、在线商城，Halo 2 都能助您轻松实现，一站式满足您的多样化建站需求。如果你的设备有 Docker 环境，可以使用以下 yaml 文件快速启动一个 Halo 2 的体验环境。",[18,191,192],{},[193,194,198],"a",{"href":195,"rel":196},"https:\u002F\u002Fwww.halo.run\u002F",[197],"nofollow","Halo - 强大易用的开源建站工具",[200,201,206],"pre",{"className":202,"code":203,"language":204,"meta":205,"style":205},"language-yaml shiki shiki-themes github-light github-dark","name: halo2\nservices:\n  halo2:\n    # 镜像地址\n    image: registry.fit2cloud.com\u002Fhalo\u002Fhalo-pro:2.24\n    # 容器名\n    container_name: halo2\n    # 主机名\n    hostname: halo2\n    # 拓展\n    depends_on:\n      # 连接数据库\n      halodb:\n        condition: service_healthy\n    # 健康检查\n    healthcheck:\n      test: [\"CMD\", \"curl\", \"-f\", \"http:\u002F\u002Flocalhost:8090\u002Factuator\u002Fhealth\u002Freadiness\"]\n      interval: 30s\n      timeout: 5s\n      retries: 5\n      start_period: 30s\n    command:\n      - --spring.r2dbc.url=r2dbc:pool:postgresql:\u002F\u002Fhalodb\u002Fhalo2\n      - --spring.r2dbc.username=halo2\n      # PostgreSQL 的密码，请保证与下方 POSTGRES_PASSWORD 的变量值一致。\n      - --spring.r2dbc.password=openpostgresql\n      - --spring.sql.init.platform=postgresql\n      # 外部访问地址，请根据实际需要修改\n      - --halo.external-url=域名\n    # 环境变量：- 变量名=值\n    environment:\n      # JVM 参数，默认为 -Xmx256m -Xms256m，可以根据实际情况做调整，置空表示不添加 JVM 参数\n      - JVM_OPTS=-Xmx256m -Xms256m\n    # 目录映射：宿主机目录:容器内目录\n    volumes:\n      - \u002Fmnt\u002Fdocker\u002Fapps\u002Fhalo2\u002Fhalo2:\u002Froot\u002F.halo2\n    # 网络模式：桥接模式\n    networks:\n      halo_network:\n    # 端口\n    ports:\n      # 端口说明功能\n      # webUI端口\n      - 8090:8090\n    # 重启策略，总是重启\n    restart: always\n    \n  halodb:\n    # 镜像地址\n    image: postgres:15.4\n    # 容器名\n    container_name: halodb\n    # 主机名\n    hostname: halodb\n    # 目录映射：宿主机目录:容器内目录\n    volumes:\n      - \u002Fmnt\u002Fdocker\u002Fapps\u002Fhalo2\u002Fhalodb:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n    healthcheck:\n      test: [ \"CMD\", \"pg_isready\" ]\n      interval: 10s\n      timeout: 5s\n      retries: 5\n    # 环境变量：- 变量名=值\n    environment:\n      # 密码\n      - POSTGRES_PASSWORD=openpostgresql\n      # 用户名\n      - POSTGRES_USER=halo2\n      # 数据库\n      - POSTGRES_DB=halo2\n      - PGUSER=halo2\n    # 网络模式：桥接模式\n    networks:\n      halo_network:\n    # 重启策略，总是重启\n    restart: always\n    \nnetworks:\n  halo_network:\n","yaml","",[207,208,209,226,235,243,250,261,267,277,283,293,299,307,313,321,332,338,346,377,388,399,411,421,429,438,446,452,460,468,474,482,488,496,502,510,516,524,532,538,546,554,560,568,574,580,588,594,605,611,619,624,634,639,649,654,663,668,675,683,690,708,718,727,736,741,748,754,762,768,776,782,790,798,803,810,817,822,831,836,844],"code",{"__ignoreMap":205},[210,211,214,218,222],"span",{"class":212,"line":213},"line",1,[210,215,217],{"class":216},"s9eBZ","name",[210,219,221],{"class":220},"sVt8B",": ",[210,223,225],{"class":224},"sZZnC","halo2\n",[210,227,229,232],{"class":212,"line":228},2,[210,230,231],{"class":216},"services",[210,233,234],{"class":220},":\n",[210,236,238,241],{"class":212,"line":237},3,[210,239,240],{"class":216},"  halo2",[210,242,234],{"class":220},[210,244,246],{"class":212,"line":245},4,[210,247,249],{"class":248},"sJ8bj","    # 镜像地址\n",[210,251,253,256,258],{"class":212,"line":252},5,[210,254,255],{"class":216},"    image",[210,257,221],{"class":220},[210,259,260],{"class":224},"registry.fit2cloud.com\u002Fhalo\u002Fhalo-pro:2.24\n",[210,262,264],{"class":212,"line":263},6,[210,265,266],{"class":248},"    # 容器名\n",[210,268,270,273,275],{"class":212,"line":269},7,[210,271,272],{"class":216},"    container_name",[210,274,221],{"class":220},[210,276,225],{"class":224},[210,278,280],{"class":212,"line":279},8,[210,281,282],{"class":248},"    # 主机名\n",[210,284,286,289,291],{"class":212,"line":285},9,[210,287,288],{"class":216},"    hostname",[210,290,221],{"class":220},[210,292,225],{"class":224},[210,294,296],{"class":212,"line":295},10,[210,297,298],{"class":248},"    # 拓展\n",[210,300,302,305],{"class":212,"line":301},11,[210,303,304],{"class":216},"    depends_on",[210,306,234],{"class":220},[210,308,310],{"class":212,"line":309},12,[210,311,312],{"class":248},"      # 连接数据库\n",[210,314,316,319],{"class":212,"line":315},13,[210,317,318],{"class":216},"      halodb",[210,320,234],{"class":220},[210,322,324,327,329],{"class":212,"line":323},14,[210,325,326],{"class":216},"        condition",[210,328,221],{"class":220},[210,330,331],{"class":224},"service_healthy\n",[210,333,335],{"class":212,"line":334},15,[210,336,337],{"class":248},"    # 健康检查\n",[210,339,341,344],{"class":212,"line":340},16,[210,342,343],{"class":216},"    healthcheck",[210,345,234],{"class":220},[210,347,349,352,355,358,361,364,366,369,371,374],{"class":212,"line":348},17,[210,350,351],{"class":216},"      test",[210,353,354],{"class":220},": [",[210,356,357],{"class":224},"\"CMD\"",[210,359,360],{"class":220},", ",[210,362,363],{"class":224},"\"curl\"",[210,365,360],{"class":220},[210,367,368],{"class":224},"\"-f\"",[210,370,360],{"class":220},[210,372,373],{"class":224},"\"http:\u002F\u002Flocalhost:8090\u002Factuator\u002Fhealth\u002Freadiness\"",[210,375,376],{"class":220},"]\n",[210,378,380,383,385],{"class":212,"line":379},18,[210,381,382],{"class":216},"      interval",[210,384,221],{"class":220},[210,386,387],{"class":224},"30s\n",[210,389,391,394,396],{"class":212,"line":390},19,[210,392,393],{"class":216},"      timeout",[210,395,221],{"class":220},[210,397,398],{"class":224},"5s\n",[210,400,402,405,407],{"class":212,"line":401},20,[210,403,404],{"class":216},"      retries",[210,406,221],{"class":220},[210,408,410],{"class":409},"sj4cs","5\n",[210,412,414,417,419],{"class":212,"line":413},21,[210,415,416],{"class":216},"      start_period",[210,418,221],{"class":220},[210,420,387],{"class":224},[210,422,424,427],{"class":212,"line":423},22,[210,425,426],{"class":216},"    command",[210,428,234],{"class":220},[210,430,432,435],{"class":212,"line":431},23,[210,433,434],{"class":220},"      - ",[210,436,437],{"class":224},"--spring.r2dbc.url=r2dbc:pool:postgresql:\u002F\u002Fhalodb\u002Fhalo2\n",[210,439,441,443],{"class":212,"line":440},24,[210,442,434],{"class":220},[210,444,445],{"class":224},"--spring.r2dbc.username=halo2\n",[210,447,449],{"class":212,"line":448},25,[210,450,451],{"class":248},"      # PostgreSQL 的密码，请保证与下方 POSTGRES_PASSWORD 的变量值一致。\n",[210,453,455,457],{"class":212,"line":454},26,[210,456,434],{"class":220},[210,458,459],{"class":224},"--spring.r2dbc.password=openpostgresql\n",[210,461,463,465],{"class":212,"line":462},27,[210,464,434],{"class":220},[210,466,467],{"class":224},"--spring.sql.init.platform=postgresql\n",[210,469,471],{"class":212,"line":470},28,[210,472,473],{"class":248},"      # 外部访问地址，请根据实际需要修改\n",[210,475,477,479],{"class":212,"line":476},29,[210,478,434],{"class":220},[210,480,481],{"class":224},"--halo.external-url=域名\n",[210,483,485],{"class":212,"line":484},30,[210,486,487],{"class":248},"    # 环境变量：- 变量名=值\n",[210,489,491,494],{"class":212,"line":490},31,[210,492,493],{"class":216},"    environment",[210,495,234],{"class":220},[210,497,499],{"class":212,"line":498},32,[210,500,501],{"class":248},"      # JVM 参数，默认为 -Xmx256m -Xms256m，可以根据实际情况做调整，置空表示不添加 JVM 参数\n",[210,503,505,507],{"class":212,"line":504},33,[210,506,434],{"class":220},[210,508,509],{"class":224},"JVM_OPTS=-Xmx256m -Xms256m\n",[210,511,513],{"class":212,"line":512},34,[210,514,515],{"class":248},"    # 目录映射：宿主机目录:容器内目录\n",[210,517,519,522],{"class":212,"line":518},35,[210,520,521],{"class":216},"    volumes",[210,523,234],{"class":220},[210,525,527,529],{"class":212,"line":526},36,[210,528,434],{"class":220},[210,530,531],{"class":224},"\u002Fmnt\u002Fdocker\u002Fapps\u002Fhalo2\u002Fhalo2:\u002Froot\u002F.halo2\n",[210,533,535],{"class":212,"line":534},37,[210,536,537],{"class":248},"    # 网络模式：桥接模式\n",[210,539,541,544],{"class":212,"line":540},38,[210,542,543],{"class":216},"    networks",[210,545,234],{"class":220},[210,547,549,552],{"class":212,"line":548},39,[210,550,551],{"class":216},"      halo_network",[210,553,234],{"class":220},[210,555,557],{"class":212,"line":556},40,[210,558,559],{"class":248},"    # 端口\n",[210,561,563,566],{"class":212,"line":562},41,[210,564,565],{"class":216},"    ports",[210,567,234],{"class":220},[210,569,571],{"class":212,"line":570},42,[210,572,573],{"class":248},"      # 端口说明功能\n",[210,575,577],{"class":212,"line":576},43,[210,578,579],{"class":248},"      # webUI端口\n",[210,581,583,585],{"class":212,"line":582},44,[210,584,434],{"class":220},[210,586,587],{"class":224},"8090:8090\n",[210,589,591],{"class":212,"line":590},45,[210,592,593],{"class":248},"    # 重启策略，总是重启\n",[210,595,597,600,602],{"class":212,"line":596},46,[210,598,599],{"class":216},"    restart",[210,601,221],{"class":220},[210,603,604],{"class":224},"always\n",[210,606,608],{"class":212,"line":607},47,[210,609,610],{"class":220},"    \n",[210,612,614,617],{"class":212,"line":613},48,[210,615,616],{"class":216},"  halodb",[210,618,234],{"class":220},[210,620,622],{"class":212,"line":621},49,[210,623,249],{"class":248},[210,625,627,629,631],{"class":212,"line":626},50,[210,628,255],{"class":216},[210,630,221],{"class":220},[210,632,633],{"class":224},"postgres:15.4\n",[210,635,637],{"class":212,"line":636},51,[210,638,266],{"class":248},[210,640,642,644,646],{"class":212,"line":641},52,[210,643,272],{"class":216},[210,645,221],{"class":220},[210,647,648],{"class":224},"halodb\n",[210,650,652],{"class":212,"line":651},53,[210,653,282],{"class":248},[210,655,657,659,661],{"class":212,"line":656},54,[210,658,288],{"class":216},[210,660,221],{"class":220},[210,662,648],{"class":224},[210,664,666],{"class":212,"line":665},55,[210,667,515],{"class":248},[210,669,671,673],{"class":212,"line":670},56,[210,672,521],{"class":216},[210,674,234],{"class":220},[210,676,678,680],{"class":212,"line":677},57,[210,679,434],{"class":220},[210,681,682],{"class":224},"\u002Fmnt\u002Fdocker\u002Fapps\u002Fhalo2\u002Fhalodb:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata\n",[210,684,686,688],{"class":212,"line":685},58,[210,687,343],{"class":216},[210,689,234],{"class":220},[210,691,693,695,698,700,702,705],{"class":212,"line":692},59,[210,694,351],{"class":216},[210,696,697],{"class":220},": [ ",[210,699,357],{"class":224},[210,701,360],{"class":220},[210,703,704],{"class":224},"\"pg_isready\"",[210,706,707],{"class":220}," ]\n",[210,709,711,713,715],{"class":212,"line":710},60,[210,712,382],{"class":216},[210,714,221],{"class":220},[210,716,717],{"class":224},"10s\n",[210,719,721,723,725],{"class":212,"line":720},61,[210,722,393],{"class":216},[210,724,221],{"class":220},[210,726,398],{"class":224},[210,728,730,732,734],{"class":212,"line":729},62,[210,731,404],{"class":216},[210,733,221],{"class":220},[210,735,410],{"class":409},[210,737,739],{"class":212,"line":738},63,[210,740,487],{"class":248},[210,742,744,746],{"class":212,"line":743},64,[210,745,493],{"class":216},[210,747,234],{"class":220},[210,749,751],{"class":212,"line":750},65,[210,752,753],{"class":248},"      # 密码\n",[210,755,757,759],{"class":212,"line":756},66,[210,758,434],{"class":220},[210,760,761],{"class":224},"POSTGRES_PASSWORD=openpostgresql\n",[210,763,765],{"class":212,"line":764},67,[210,766,767],{"class":248},"      # 用户名\n",[210,769,771,773],{"class":212,"line":770},68,[210,772,434],{"class":220},[210,774,775],{"class":224},"POSTGRES_USER=halo2\n",[210,777,779],{"class":212,"line":778},69,[210,780,781],{"class":248},"      # 数据库\n",[210,783,785,787],{"class":212,"line":784},70,[210,786,434],{"class":220},[210,788,789],{"class":224},"POSTGRES_DB=halo2\n",[210,791,793,795],{"class":212,"line":792},71,[210,794,434],{"class":220},[210,796,797],{"class":224},"PGUSER=halo2\n",[210,799,801],{"class":212,"line":800},72,[210,802,537],{"class":248},[210,804,806,808],{"class":212,"line":805},73,[210,807,543],{"class":216},[210,809,234],{"class":220},[210,811,813,815],{"class":212,"line":812},74,[210,814,551],{"class":216},[210,816,234],{"class":220},[210,818,820],{"class":212,"line":819},75,[210,821,593],{"class":248},[210,823,825,827,829],{"class":212,"line":824},76,[210,826,599],{"class":216},[210,828,221],{"class":220},[210,830,604],{"class":224},[210,832,834],{"class":212,"line":833},77,[210,835,610],{"class":220},[210,837,839,842],{"class":212,"line":838},78,[210,840,841],{"class":216},"networks",[210,843,234],{"class":220},[210,845,847,850],{"class":212,"line":846},79,[210,848,849],{"class":216},"  halo_network",[210,851,234],{"class":220},[183,853,855],{"id":854},"_32-工具安装","3.2 工具安装",[18,857,858],{},"如果你是 windows 电脑，你需要安装 VS code、Node.js",[200,860,862],{"className":202,"code":861,"language":204,"meta":205,"style":205},"# VS code 官网\nhttps:\u002F\u002Fcode.visualstudio.com\u002F\n\n# Node.js 官网\nhttps:\u002F\u002Fnodejs.org\u002Fzh-cn\n",[207,863,864,869,874,880,885],{"__ignoreMap":205},[210,865,866],{"class":212,"line":213},[210,867,868],{"class":248},"# VS code 官网\n",[210,870,871],{"class":212,"line":228},[210,872,873],{"class":224},"https:\u002F\u002Fcode.visualstudio.com\u002F\n",[210,875,876],{"class":212,"line":237},[210,877,879],{"emptyLinePlaceholder":878},true,"\n",[210,881,882],{"class":212,"line":245},[210,883,884],{"class":248},"# Node.js 官网\n",[210,886,887],{"class":212,"line":252},[210,888,889],{"class":224},"https:\u002F\u002Fnodejs.org\u002Fzh-cn\n",[183,891,893],{"id":892},"_33-vitepress-安装","3.3 vitepress 安装",[18,895,896,897,87],{},"这里我推荐使用天客大佬的主题，",[193,898,901],{"href":899,"rel":900},"https:\u002F\u002Fvp.teek.top\u002F",[197],"天客大佬-vitepress-theme-teek",[200,903,907],{"className":904,"code":905,"language":906,"meta":205,"style":205},"language-cmd shiki shiki-themes github-light github-dark","# 拉取主题包\ngit clone https:\u002F\u002Fgithub.com\u002FKele-Bingtang\u002Fvitepress-theme-teek-docs-template.git\n\n# 如果没有安装 pnpm，先安装\nnpm install -g pnpm\n\n# 安装项目依赖\npnpm install\n\n# 安装依赖\npnpm add -D vitepress\npnpm vitepress init\npnpm install vitepress-theme-teek -D\n\n# 预览\npnpm run docs:dev\n# 构建，输出在 .\u002Fdist\npnpm run docs:build\n","cmd",[207,908,909,914,919,923,928,933,937,942,947,951,956,961,966,971,975,980,985,990],{"__ignoreMap":205},[210,910,911],{"class":212,"line":213},[210,912,913],{},"# 拉取主题包\n",[210,915,916],{"class":212,"line":228},[210,917,918],{},"git clone https:\u002F\u002Fgithub.com\u002FKele-Bingtang\u002Fvitepress-theme-teek-docs-template.git\n",[210,920,921],{"class":212,"line":237},[210,922,879],{"emptyLinePlaceholder":878},[210,924,925],{"class":212,"line":245},[210,926,927],{},"# 如果没有安装 pnpm，先安装\n",[210,929,930],{"class":212,"line":252},[210,931,932],{},"npm install -g pnpm\n",[210,934,935],{"class":212,"line":263},[210,936,879],{"emptyLinePlaceholder":878},[210,938,939],{"class":212,"line":269},[210,940,941],{},"# 安装项目依赖\n",[210,943,944],{"class":212,"line":279},[210,945,946],{},"pnpm install\n",[210,948,949],{"class":212,"line":285},[210,950,879],{"emptyLinePlaceholder":878},[210,952,953],{"class":212,"line":295},[210,954,955],{},"# 安装依赖\n",[210,957,958],{"class":212,"line":301},[210,959,960],{},"pnpm add -D vitepress\n",[210,962,963],{"class":212,"line":309},[210,964,965],{},"pnpm vitepress init\n",[210,967,968],{"class":212,"line":315},[210,969,970],{},"pnpm install vitepress-theme-teek -D\n",[210,972,973],{"class":212,"line":323},[210,974,879],{"emptyLinePlaceholder":878},[210,976,977],{"class":212,"line":334},[210,978,979],{},"# 预览\n",[210,981,982],{"class":212,"line":340},[210,983,984],{},"pnpm run docs:dev\n",[210,986,987],{"class":212,"line":348},[210,988,989],{},"# 构建，输出在 .\u002Fdist\n",[210,991,992],{"class":212,"line":379},[210,993,994],{},"pnpm run docs:build\n",[183,996,998],{"id":997},"_34-astro-安装","3.4 Astro 安装",[18,1000,1001,1002,1007,1008,1013],{},"我这里推荐 ",[193,1003,1006],{"href":1004,"rel":1005},"https:\u002F\u002Fdocs.mizuki.mysqil.com\u002F",[197],"Mizuki Next Theme"," 或者 ",[193,1009,1012],{"href":1010,"rel":1011},"https:\u002F\u002Fgithub.com\u002FCuteLeaf\u002FFirefly",[197],"Firefly"," 的主题，安装方法都差不多。",[200,1015,1017],{"className":202,"code":1016,"language":204,"meta":205,"style":205},"# 克隆主题\ngit clone https:\u002F\u002Fgithub.com\u002FCuteleaf\u002FFirefly.git\ncd Firefly\n\n# 如果没有安装 pnpm，先安装\nnpm install -g pnpm\n\n# 安装项目依赖\npnpm install\n\n# 启动\npnpm dev\n",[207,1018,1019,1024,1029,1034,1038,1042,1046,1050,1054,1058,1062,1067],{"__ignoreMap":205},[210,1020,1021],{"class":212,"line":213},[210,1022,1023],{"class":248},"# 克隆主题\n",[210,1025,1026],{"class":212,"line":228},[210,1027,1028],{"class":224},"git clone https:\u002F\u002Fgithub.com\u002FCuteleaf\u002FFirefly.git\n",[210,1030,1031],{"class":212,"line":237},[210,1032,1033],{"class":224},"cd Firefly\n",[210,1035,1036],{"class":212,"line":245},[210,1037,879],{"emptyLinePlaceholder":878},[210,1039,1040],{"class":212,"line":252},[210,1041,927],{"class":248},[210,1043,1044],{"class":212,"line":263},[210,1045,932],{"class":224},[210,1047,1048],{"class":212,"line":269},[210,1049,879],{"emptyLinePlaceholder":878},[210,1051,1052],{"class":212,"line":279},[210,1053,941],{"class":248},[210,1055,1056],{"class":212,"line":285},[210,1057,946],{"class":224},[210,1059,1060],{"class":212,"line":295},[210,1061,879],{"emptyLinePlaceholder":878},[210,1063,1064],{"class":212,"line":301},[210,1065,1066],{"class":248},"# 启动\n",[210,1068,1069],{"class":212,"line":309},[210,1070,1071],{"class":224},"pnpm dev\n",[128,1073,1074,1081],{},[131,1075,1076,1077,1080],{},"编辑 ",[207,1078,1079],{},"src\u002Fconfig\u002F"," 目录下的配置文件自定义博客设置",[131,1082,1083,1084,1087],{},"博客将在 ",[207,1085,1086],{},"http:\u002F\u002Flocalhost:4321"," 可用",[11,1089,1091],{"id":1090},"_4-总结","4 总结",[18,1093,1094],{},"博客没有绝对完美的架构，只有最适合当前阶段需求的选择。从动态的便捷到静态的轻快，从代码的严谨到生活的诗意，博客的形态完全取决于你想要向世界展示怎样的自己。选择好适合的框架只是第一步，持续的思考、折腾与输出，才是保持这座数字岛屿生机盎然的秘诀。",[18,1096,1097],{},[1098,1099],"img",{"alt":205,"src":1100},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F06\u002F04\u002F1780586963098.avif",[18,1102,1103],{},[1098,1104],{"alt":205,"src":1105},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F06\u002F04\u002F1780586965221.avif",[18,1107,1108],{},[1098,1109],{"alt":205,"src":1110},"https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F06\u002F04\u002F1780586967155.avif",[18,1112,1113],{},"Created with ❤️ by 张萌萌",[1115,1116,1117],"style",{},"html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}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 .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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":205,"searchDepth":228,"depth":228,"links":1119},[1120,1121,1122,1123,1129],{"id":13,"depth":228,"text":13},{"id":54,"depth":228,"text":55},{"id":122,"depth":228,"text":123},{"id":180,"depth":228,"text":181,"children":1124},[1125,1126,1127,1128],{"id":185,"depth":237,"text":186},{"id":854,"depth":237,"text":855},{"id":892,"depth":237,"text":893},{"id":997,"depth":237,"text":998},{"id":1090,"depth":228,"text":1091},"Blog",null,"2026-06-03",false,"md","https:\u002F\u002Fimg.nw177.cn\u002Fblog\u002F2026\u002F06\u002F04\u002F1780565299947.avif",{"published":1132},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F01-远古产物—博客",{"title":5,"description":5},"blog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F01-远古产物—博客",[1130],"g_b06U4u-_XTqk7ieEPUl7MNIiBBwkhgBaEfEgRTXDk",[1143,1147,1151,1155,1158,1161,1165,1168,1172,1176,1180,1184,1188,1192,1196,1200,1201,1205,1209,1212,1216,1220,1224,1228,1231,1235,1239,1243,1247,1251,1255,1259,1263,1267,1271,1275,1279,1282,1286,1290,1294,1298,1302,1305,1308,1311,1314,1317,1320,1323,1326,1329,1332,1335,1338,1341,1344,1347,1350,1353,1356],{"path":1144,"title":1145,"date":1146},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F16.IPv6与DNS的分手协议","IPv6 与 DNS 的分手协议","2026-10-02",{"path":1148,"title":1149,"date":1150},"\u002Fblog\u002F10-技术专栏\u002F50-AI\u002F04.我的-AI-入坑记","我的 AI 入坑记","2026-09-24",{"path":1152,"title":1153,"date":1154},"\u002Fblog\u002F10-技术专栏\u002F50-AI\u002F01.用-Docker-部署-Ollama-与-Open-WebUI-搭建本地大模型","用 Docker 部署 Ollama 与 Open WebUI 搭建本地大模型","2026-09-23",{"path":1156,"title":1157,"date":1154},"\u002Fblog\u002F10-技术专栏\u002F50-AI\u002F02.用-New-API-搭建统一-LLM-网关与-Lucky-反代外网访问","用 New API 搭建统一 LLM 网关与 Lucky 反代外网访问",{"path":1159,"title":1160,"date":1154},"\u002Fblog\u002F10-技术专栏\u002F50-AI\u002F03.用-Dify-搭建本地知识库让-AI-读懂你写的博客","用 Dify 搭建本地知识库，让 AI 读懂你写的博客",{"path":1162,"title":1163,"date":1164},"\u002Fblog\u002F20-生活碎片\u002F03-2026年秋季计划","2026 年秋季计划","2026-09-19",{"path":1166,"title":1167,"date":1164},"\u002Fblog\u002F30-学习笔记\u002F02.Python入门书单","Python 入门书单：从第一行代码到写出真正的程序",{"path":1169,"title":1170,"date":1171},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F09-Cloudflare-低延迟接入方案","Cloudflare 低延迟接入方案","2026-07-22 03:17:28",{"path":1173,"title":1174,"date":1175},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F08-Cloudflare-ImgBed-免费私有图床完整部署手册","Cloudflare ImgBed 免费私有图床完整部署手册","2026-07-19 02:09:08",{"path":1177,"title":1178,"date":1179},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F07-腾讯云-EdgeOne-边缘函数实现七牛-S3-随机图床-API","腾讯云 EdgeOne 边缘函数实现七牛云 & S3 存储随机图床 API","2026-07-13 21:25:48",{"path":1181,"title":1182,"date":1183},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F06-腾讯-EdgeOne-部署-Twikoo-评论系统指南","腾讯EdgeOne部署Twikoo评论系统指南","2026-06-14 17:41:11",{"path":1185,"title":1186,"date":1187},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F05-OpenList-接入-S3-对象存储完整使用教程","OpenList 接入 S3 对象存储完整使用教程","2026-06-11 13:08:07",{"path":1189,"title":1190,"date":1191},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F04-Cloudflare-R2-图床与全球加速方案","Cloudflare R2 图床与全球加速方案","2026-06-09 13:07:35",{"path":1193,"title":1194,"date":1195},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F03-免费图床与CDN加速方案","免费图床与 CDN 加速方案","2026-06-09",{"path":1197,"title":1198,"date":1199},"\u002Fblog\u002F10-技术专栏\u002F40-WebsiteBuilding\u002F02-零基础优雅搭建静态博客全教程","零基础优雅搭建静态博客全教程","2026-06-04",{"path":1137,"title":5,"date":1132},{"path":1202,"title":1203,"date":1204},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F15.关于NAT回流与内网域名直连的终极指南","关于 NAT 回流与内网域名直连的终极指南","2026-05-13",{"path":1206,"title":1207,"date":1208},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F14.飞牛安全访问与Lucky反代雷池防护","飞牛安全访问与 Lucky 反代雷池防护","2026-02-03",{"path":1210,"title":1211,"date":1208},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F18.一键DD纯净系统脚本","一键 DD 纯净系统脚本",{"path":1213,"title":1214,"date":1215},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F17.Ventoy多系统启动盘制作与使用全指南","Ventoy 多系统启动盘制作与使用全指南","2026-02-02",{"path":1217,"title":1218,"date":1219},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F16.Emby元数据匹配与中文命名规范","Emby 元数据匹配与中文命名规范","2026-02-01",{"path":1221,"title":1222,"date":1223},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F15.基于PVE系统安装LXC-debian","基于 PVE 系统安装 LXC-debian","2026-01-19",{"path":1225,"title":1226,"date":1227},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F13.Lucky反向代理终极指南","Lucky 反向代理终极指南","2026-01-16",{"path":1229,"title":1230,"date":1227},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F14.OEC盒子Armbian刷机指南","OEC 盒子 Armbian 刷机指南",{"path":1232,"title":1233,"date":1234},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F13.oec-fnOS安装","OEC-Turbo (RK3566) 安装飞牛 OS","2026-01-15",{"path":1236,"title":1237,"date":1238},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F12.新的篇章，debian12的配置","新的篇章，debian12 的配置","2026-01-14",{"path":1240,"title":1241,"date":1242},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F11.飞牛OS安装后必要配置","飞牛 OS 安装后必要配置","2026-01-06",{"path":1244,"title":1245,"date":1246},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F11.NAS-导航页的终极形态","告别繁琐配置：NAS 导航页的终极形态 —— 从 Sun-Panel 到 FlatNAS","2026-01-05",{"path":1248,"title":1249,"date":1250},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F10.LogVar-弹幕-API-部署指南","LogVar 弹幕 API  (纯本地缓存版) 部署指南","2025-12-30",{"path":1252,"title":1253,"date":1254},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F10.基于Lucky与QMediaSync的飞牛远程媒体访问","基于 Lucky 与 QMediaSync 的飞牛远程媒体访问","2025-12-26",{"path":1256,"title":1257,"date":1258},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F09.新的篇章，PVE虚拟机","新的篇章，PVE虚拟机","2025-12-21",{"path":1260,"title":1261,"date":1262},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F08.Linux系统，音响有底噪","Linux 系统，音响有底噪怎么办？","2025-12-17",{"path":1264,"title":1265,"date":1266},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F07.飞牛OS的安装","飞牛 OS 的安装","2025-12-14",{"path":1268,"title":1269,"date":1270},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F06.Debian13换源","Debian13 换源","2025-11-29",{"path":1272,"title":1273,"date":1274},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F05.Kodi-CoreELEC安装指南","Kodi & CoreELEC 安装指南","2025-11-21",{"path":1276,"title":1277,"date":1278},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F09.兰空图床和高清图标库","兰空图床和高清图标库","2025-11-15",{"path":1280,"title":1281,"date":1278},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F04.N1盒子Armbian刷机与配置","N1 盒子 Armbian 刷机与配置",{"path":1283,"title":1284,"date":1285},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F08.你是否需要一个图床？","你是否需要一个图床？","2025-11-14",{"path":1287,"title":1288,"date":1289},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F03.飞牛NAS第三方应用商店安装","飞牛 NAS 第三方应用商店 (FnDepot) 安装指南","2025-10-13",{"path":1291,"title":1292,"date":1293},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F02.Hills播放器-Windows-安卓","Hills 播放器（Windows + 安卓）","2025-09-24",{"path":1295,"title":1296,"date":1297},"\u002Fblog\u002F10-技术专栏\u002F30-Linux\u002F01.一行代码降低服务器功耗","一行代码降低服务器功耗","2025-08-19",{"path":1299,"title":1300,"date":1301},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F01.容器-docker-docker-compose","容器 & docker & docker-compose","2025-08-05",{"path":1303,"title":1304,"date":1301},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F02.容器项目-传输类","容器项目&传输类",{"path":1306,"title":1307,"date":1301},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F03.容器项目-相册类","容器项目&相册类",{"path":1309,"title":1310,"date":1301},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F04.容器项目-媒体类","容器项目&媒体类",{"path":1312,"title":1313,"date":1301},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F05.Emby自有授权媒体库（一）","Emby 自有授权媒体库（一）",{"path":1315,"title":1316,"date":1301},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F06.Emby自有授权媒体库（二）","Emby 自有授权媒体库（二）",{"path":1318,"title":1319,"date":1301},"\u002Fblog\u002F10-技术专栏\u002F10-docker\u002F07.Adguard-Home去广告","Adguard Home 去广告",{"path":1321,"title":1322,"date":1301},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F01.新的篇章，软路由","新的篇章，软路由",{"path":1324,"title":1325,"date":1301},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F02.如何玩公网，怎么远程访问（一）","如何玩公网，怎么远程访问（一）",{"path":1327,"title":1328,"date":1301},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F03.如何玩公网，怎么远程访问（二）","如何玩公网，怎么远程访问（二）",{"path":1330,"title":1331,"date":1301},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F04.如何玩公网，怎么远程访问（三）","如何玩公网，怎么远程访问（三）",{"path":1333,"title":1334,"date":1301},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F05.免费域名与远程访问","免费域名与远程访问",{"path":1336,"title":1337,"date":1301},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F06.没有公网如何远程访问","没有公网如何远程访问",{"path":1339,"title":1340,"date":1301},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F07.爱快与OpenWRT双软路由MAC地址重复问题修正","爱快与 OpenWRT 双软路由MAC地址重复问题修正",{"path":1342,"title":1343,"date":1301},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F08.OpenWRT扩容","OpenWRT 扩容",{"path":1345,"title":1346,"date":1301},"\u002Fblog\u002F10-技术专栏\u002F20-network\u002F09.OpenWRT旁路由一条龙教程","OpenWRT 旁路由一条龙教程",{"path":1348,"title":1349,"date":1301},"\u002Fblog\u002F20-生活碎片\u002F02.在裂缝中种满阳光","让灵魂带着光行走：在裂缝中种满太阳",{"path":1351,"title":1352,"date":1301},"\u002Fblog\u002F30-学习笔记\u002F01.Typora学习笔记","Typora学习笔记",{"path":1354,"title":1355,"date":1301},"\u002Fblog\u002F30-学习笔记\u002F02.Markdown-拓展","Markdown 拓展",{"path":1357,"title":1358,"date":1359},"\u002Fblog\u002F20-生活碎片\u002F01.拥抱生活中的光与热","拥抱生活中的光与热","2025-07-05",1791304410749]