[{"data":1,"prerenderedAt":5231},["ShallowReactive",2],{"blog-posts-zh-CN":3},{"blogPosts":4,"thoughts":4890,"artifacts":5178,"artifactRelatedMap":5226},[5,997,2567,2680,2738,2797,2859,2900,2993,3436,3715,3909,4106,4154,4555,4647],{"id":6,"artifactId":7,"backgroundImg":7,"category":8,"date":9,"extension":10,"lastmod":7,"listPreviewImg":7,"meta":11,"ogImage":7,"stem":12,"tags":13,"__hash__":19,"title":20,"body":21,"description":27,"lang":560,"navigation":570,"path":992,"seo":993,"sitemap":994,"kind":996,"artifactItem":-1},"article\u002Fblog\u002Fnuxt-content-i18n-architecture-refactor\u002Findex.zh-CN.md",null,"tech_and_career","2026-06-26","md",{"artifactId":7,"lastmod":7,"backgroundImg":7,"ogImage":7,"listPreviewImg":-1},"blog\u002Fnuxt-content-i18n-architecture-refactor\u002Findex.zh-CN",[14,15,16,17,18],"troubleshooting","nuxt","i18n","architecture","refactor","PFsJ0VeUuRvAtaoEIrQVm3fdIU4jgts5Vi-Zj9HzKAA","Nuxt Content 多语言文件管理，我换了一种组织方式",{"type":22,"value":23,"toc":989},"minimark",[24,28,31,42,45,63,66,74,77,83,86,89,95,98,101,104,110,113,116,141,144,148,155,412,418,877,880,976,979,982,985],[25,26,27],"p",{},"我的博客网站使用的是 Nuxt 的框架。由于支持了多语言，原本比较简单的问题，在多语言的前提下会变得复杂一些。比如：文件的管理。",[25,29,30],{},"Nuxt Content 与 i18n 多语言框架结合时，官方推荐的目录管理结构是：",[32,33,38],"pre",{"className":34,"code":36,"language":37},[35],"language-text","content\u002F\n  en\u002F\n    index.md\n    about.md\n    blog\u002F\n      post-1.md\n  zh-CN\u002F\n    index.md\n    about.md\n    blog\u002F\n      post-1.md\n","text",[39,40,36],"code",{"__ignoreMap":41},"",[25,43,44],{},"通过目录结构来分别管理语言的内容。这种结构的优点很明显：",[46,47,48,52],"ol",{},[49,50,51],"li",{},"结构目录清晰",[49,53,54,55,58,59,62],{},"天然的跟 i18n 的 route 生成是对应的，切换语言时，url 跟文件路径是关联的。比如 ",[39,56,57],{},"content\u002Fen\u002Fblog\u002Fpost-1.md"," 生成的 url 就会是 ",[39,60,61],{},"\u002Fen\u002Fblog\u002Fpost-1"," 。",[25,64,65],{},"但是！在我使用了半年后，这种结构有很明显的弊端：",[46,67,68,71],{},[49,69,70],{},"不同语言的文件分散到了不同的文件夹，导致我要修改某篇文章的时候，需要同时去两个文件夹下找文件",[49,72,73],{},"对于文章的基础信息，比如时间、分类、标签，没有提取成公共信息，导致修改的时候会有重复工作。有时候会导致中文改了分类，英文忘记了的情况",[25,75,76],{},"上面两点在日常内容管理时非常的不方便。所以我想改成这样的结构：",[32,78,81],{"className":79,"code":80,"language":37},[35],"content\u002Fblog\n  post-a\u002F\n    index.en.md\n    index.zh-CN.md\n    meta.json\n  post-b\u002F\n    index.en.md\n    index.zh-CN.md\n    meta.json\n",[39,82,80],{"__ignoreMap":41},[25,84,85],{},"不按照语言分类，而是按照内容进行聚合。对于一篇文章，它所有的语言文件放在一起，然后要把基础信息抽离出来做成公共部分。这样能够更方便的定位到文件，同时修改基础信息时也不会遗漏。",[25,87,88],{},"方向定好后，我就开始琢磨如何实现：",[32,90,93],{"className":91,"code":92,"language":37},[35],"“文件目录直接改问题不大，最关键的路由的处理”\n“新的结构按照现有的路由机制，会生成 \u002Fblog\u002Fpost-a\u002Findex.en 这样的路由，语言标识放到末尾了，明显不是我想要的”\n“所以关键的关键，就是要重新修改路由生成的机制”\n",[39,94,92],{"__ignoreMap":41},[25,96,97],{},"于是我开始吭哧吭哧跟 AI 聊，看看怎么修改路由机制。",[25,99,100],{},"AI 非常的认真、敬业，绞尽脑汁给我出主意：一会儿建议我根据 nuxt 框架 router 劫持做调整，一会儿又觉得应该从 i18n 路由生成机制的源头处理，过一会儿又推荐我重点调整 nuxt content 的配置。",[25,102,103],{},"经过了好几轮的修改后，AI 开始说车轱辘话，我意识到不对劲了。我现在警惕性比之前高很多了。于是我立马放弃 AI，开始自行去搜索如何自定义 url，去找 i18n 的目录管理。果不其然，有其他人遇到过一样的问题，甚至还贴心的给出了代码。但是，就是没有路由的调整。只有目录结构，以及 slug 文件的写法。",[32,105,108],{"className":106,"code":107,"language":37},[35],"pages\u002Fblog\u002F[...slug].vue 这种写法是表示页面渲染的时候 \u002Fblog 路径下的页面都会匹配到这个文件进行处理。\n",[39,109,107],{"__ignoreMap":41},[25,111,112],{},"为什么都没有路由配置的说明？只有 slug 文件的逻辑，只有 slug，slug...... slug？！",[25,114,115],{},"哦嚯，我悟了！所以根本可以不用管什么路由生成的机制。只需要做两点处理就好了：",[46,117,118,128],{},[49,119,120,121,124,125],{},"显示在页面的超链接，从 ",[39,122,123],{},"\u002Fblog\u002Fpost-a\u002Findex.en"," 替换成 ",[39,126,127],{},"\u002Fen\u002Fblog\u002Fpost-a",[49,129,130,131,134,135,137,138,140],{},"在 ",[39,132,133],{},"[...slug].vue"," 文件中，解析文件的时候反过来解析，把拿到的 ",[39,136,127],{}," url 解析为文件地址 ",[39,139,123],{}," 再去获取文件就好拉！",[25,142,143],{},"所以压根一开始我处理的方向就偏了，修改路由生成规则目前应该是没有很好的办法的。但是通过修改页面显示和内容获取的部分，同样可以做到。",[145,146,147],"h2",{"id":147},"具体的代码实现",[25,149,150,151,154],{},"前面其实漏了一点没说明，公共信息如何处理？在 ",[39,152,153],{},"content.config.ts"," 中抽离出新的一层结构定义：",[32,156,160],{"className":157,"code":158,"language":159,"meta":41,"style":41},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","collections: {\n    article: defineCollection(\n      asSitemapCollection({\n        type: \"page\",\n        source: \"blog\u002F*\u002Findex.{en,zh-CN}.md\",\n        schema: z.object({\n          \u002F\u002F xxxx\n        }),\n      } as any),\n    ),\n    \u002F\u002F 新增一个数据合集，到时候代码里通过文件路径进行匹配找到同一个文章下的公共信息\n    articleMetadata: defineCollection({\n      type: \"data\",\n      source: \"blog\u002F*\u002Fmeta.json\",\n      schema: z.object({\n        \u002F\u002F xxxxx\n      }),\n    }),\n}\n","ts",[39,161,162,178,194,206,227,244,266,273,284,301,309,315,329,346,363,381,387,396,406],{"__ignoreMap":41},[163,164,167,171,175],"span",{"class":165,"line":166},"line",1,[163,168,170],{"class":169},"sBMFI","collections",[163,172,174],{"class":173},"sMK4o",":",[163,176,177],{"class":173}," {\n",[163,179,181,184,186,190],{"class":165,"line":180},2,[163,182,183],{"class":169},"    article",[163,185,174],{"class":173},[163,187,189],{"class":188},"s2Zo4"," defineCollection",[163,191,193],{"class":192},"swJcz","(\n",[163,195,197,200,203],{"class":165,"line":196},3,[163,198,199],{"class":188},"      asSitemapCollection",[163,201,202],{"class":192},"(",[163,204,205],{"class":173},"{\n",[163,207,209,212,214,217,221,224],{"class":165,"line":208},4,[163,210,211],{"class":192},"        type",[163,213,174],{"class":173},[163,215,216],{"class":173}," \"",[163,218,220],{"class":219},"sfazB","page",[163,222,223],{"class":173},"\"",[163,225,226],{"class":173},",\n",[163,228,230,233,235,237,240,242],{"class":165,"line":229},5,[163,231,232],{"class":192},"        source",[163,234,174],{"class":173},[163,236,216],{"class":173},[163,238,239],{"class":219},"blog\u002F*\u002Findex.{en,zh-CN}.md",[163,241,223],{"class":173},[163,243,226],{"class":173},[163,245,247,250,252,256,259,262,264],{"class":165,"line":246},6,[163,248,249],{"class":192},"        schema",[163,251,174],{"class":173},[163,253,255],{"class":254},"sTEyZ"," z",[163,257,258],{"class":173},".",[163,260,261],{"class":188},"object",[163,263,202],{"class":192},[163,265,205],{"class":173},[163,267,269],{"class":165,"line":268},7,[163,270,272],{"class":271},"sHwdD","          \u002F\u002F xxxx\n",[163,274,276,279,282],{"class":165,"line":275},8,[163,277,278],{"class":173},"        }",[163,280,281],{"class":192},")",[163,283,226],{"class":173},[163,285,287,290,294,297,299],{"class":165,"line":286},9,[163,288,289],{"class":173},"      }",[163,291,293],{"class":292},"s7zQu"," as",[163,295,296],{"class":169}," any",[163,298,281],{"class":192},[163,300,226],{"class":173},[163,302,304,307],{"class":165,"line":303},10,[163,305,306],{"class":192},"    )",[163,308,226],{"class":173},[163,310,312],{"class":165,"line":311},11,[163,313,314],{"class":271},"    \u002F\u002F 新增一个数据合集，到时候代码里通过文件路径进行匹配找到同一个文章下的公共信息\n",[163,316,318,321,323,325,327],{"class":165,"line":317},12,[163,319,320],{"class":169},"    articleMetadata",[163,322,174],{"class":173},[163,324,189],{"class":188},[163,326,202],{"class":192},[163,328,205],{"class":173},[163,330,332,335,337,339,342,344],{"class":165,"line":331},13,[163,333,334],{"class":192},"      type",[163,336,174],{"class":173},[163,338,216],{"class":173},[163,340,341],{"class":219},"data",[163,343,223],{"class":173},[163,345,226],{"class":173},[163,347,349,352,354,356,359,361],{"class":165,"line":348},14,[163,350,351],{"class":192},"      source",[163,353,174],{"class":173},[163,355,216],{"class":173},[163,357,358],{"class":219},"blog\u002F*\u002Fmeta.json",[163,360,223],{"class":173},[163,362,226],{"class":173},[163,364,366,369,371,373,375,377,379],{"class":165,"line":365},15,[163,367,368],{"class":192},"      schema",[163,370,174],{"class":173},[163,372,255],{"class":254},[163,374,258],{"class":173},[163,376,261],{"class":188},[163,378,202],{"class":192},[163,380,205],{"class":173},[163,382,384],{"class":165,"line":383},16,[163,385,386],{"class":271},"        \u002F\u002F xxxxx\n",[163,388,390,392,394],{"class":165,"line":389},17,[163,391,289],{"class":173},[163,393,281],{"class":192},[163,395,226],{"class":173},[163,397,399,402,404],{"class":165,"line":398},18,[163,400,401],{"class":173},"    }",[163,403,281],{"class":192},[163,405,226],{"class":173},[163,407,409],{"class":165,"line":408},19,[163,410,411],{"class":173},"}\n",[25,413,130,414,417],{},[39,415,416],{},"pages\u002Fblog\u002F[...slug].vue"," 中，修改获取文件信息的方法，这里只列关键代码：",[32,419,421],{"className":157,"code":420,"language":159,"meta":41,"style":41},"const { data: post } = await useAsyncData(\n  `page-${normalizedPath.value}-${locale.value}`,\n  async () => {\n    const slug = currentSlug.value;  \u002F\u002F 从 url 上 \u002Fen\u002Fblog\u002Fpost-a 获取到 post-a 这个唯一标识\n    const localeValue = locale.value as \"en\" | \"zh-CN\";\n\n    if (!slug) return null;\n\n    \u002F\u002F 重新拼接成原始文件的地址，如 \u002Fblog\u002Fpost-a\u002Findex.en\n    const contentStem = buildArticleContentStem(slug, localeValue);\n    const metadataStem = buildArticleMetadataStem(slug);\n\n    const [articleMetadata, articleFile] = await Promise.all([\n      queryCollection(\"articleMetadata\")\n        .where(\"stem\", \"=\", metadataStem)\n        .first(),\n      queryCollection(\"article\").where(\"stem\", \"=\", contentStem).first(),\n    ]);\n\n    if (!articleFile) return null;\n\n    \u002F\u002F 将两边的数据融合在一起，最终提供出去渲染\n    return combineArticleData(articleMetadata || {}, articleFile, localeValue);\n  },\n);\n",[39,422,423,454,492,505,528,566,572,595,599,604,629,649,653,686,702,734,746,795,802,806,824,829,835,864,870],{"__ignoreMap":41},[163,424,425,429,432,435,437,440,443,446,449,452],{"class":165,"line":166},[163,426,428],{"class":427},"spNyl","const",[163,430,431],{"class":173}," {",[163,433,434],{"class":192}," data",[163,436,174],{"class":173},[163,438,439],{"class":254}," post ",[163,441,442],{"class":173},"}",[163,444,445],{"class":173}," =",[163,447,448],{"class":292}," await",[163,450,451],{"class":188}," useAsyncData",[163,453,193],{"class":254},[163,455,456,459,462,465,468,470,473,475,478,480,483,485,487,490],{"class":165,"line":180},[163,457,458],{"class":173},"  `",[163,460,461],{"class":219},"page-",[163,463,464],{"class":173},"${",[163,466,467],{"class":254},"normalizedPath",[163,469,258],{"class":173},[163,471,472],{"class":254},"value",[163,474,442],{"class":173},[163,476,477],{"class":219},"-",[163,479,464],{"class":173},[163,481,482],{"class":254},"locale",[163,484,258],{"class":173},[163,486,472],{"class":254},[163,488,489],{"class":173},"}`",[163,491,226],{"class":173},[163,493,494,497,500,503],{"class":165,"line":196},[163,495,496],{"class":427},"  async",[163,498,499],{"class":173}," ()",[163,501,502],{"class":427}," =>",[163,504,177],{"class":173},[163,506,507,510,513,515,518,520,522,525],{"class":165,"line":208},[163,508,509],{"class":427},"    const",[163,511,512],{"class":254}," slug",[163,514,445],{"class":173},[163,516,517],{"class":254}," currentSlug",[163,519,258],{"class":173},[163,521,472],{"class":254},[163,523,524],{"class":173},";",[163,526,527],{"class":271},"  \u002F\u002F 从 url 上 \u002Fen\u002Fblog\u002Fpost-a 获取到 post-a 这个唯一标识\n",[163,529,530,532,535,537,540,542,544,546,548,551,553,556,558,561,563],{"class":165,"line":229},[163,531,509],{"class":427},[163,533,534],{"class":254}," localeValue",[163,536,445],{"class":173},[163,538,539],{"class":254}," locale",[163,541,258],{"class":173},[163,543,472],{"class":254},[163,545,293],{"class":292},[163,547,216],{"class":173},[163,549,550],{"class":219},"en",[163,552,223],{"class":173},[163,554,555],{"class":173}," |",[163,557,216],{"class":173},[163,559,560],{"class":219},"zh-CN",[163,562,223],{"class":173},[163,564,565],{"class":173},";\n",[163,567,568],{"class":165,"line":246},[163,569,571],{"emptyLinePlaceholder":570},true,"\n",[163,573,574,577,580,583,586,589,592],{"class":165,"line":268},[163,575,576],{"class":292},"    if",[163,578,579],{"class":192}," (",[163,581,582],{"class":173},"!",[163,584,585],{"class":254},"slug",[163,587,588],{"class":192},") ",[163,590,591],{"class":292},"return",[163,593,594],{"class":173}," null;\n",[163,596,597],{"class":165,"line":275},[163,598,571],{"emptyLinePlaceholder":570},[163,600,601],{"class":165,"line":286},[163,602,603],{"class":271},"    \u002F\u002F 重新拼接成原始文件的地址，如 \u002Fblog\u002Fpost-a\u002Findex.en\n",[163,605,606,608,611,613,616,618,620,623,625,627],{"class":165,"line":303},[163,607,509],{"class":427},[163,609,610],{"class":254}," contentStem",[163,612,445],{"class":173},[163,614,615],{"class":188}," buildArticleContentStem",[163,617,202],{"class":192},[163,619,585],{"class":254},[163,621,622],{"class":173},",",[163,624,534],{"class":254},[163,626,281],{"class":192},[163,628,565],{"class":173},[163,630,631,633,636,638,641,643,645,647],{"class":165,"line":311},[163,632,509],{"class":427},[163,634,635],{"class":254}," metadataStem",[163,637,445],{"class":173},[163,639,640],{"class":188}," buildArticleMetadataStem",[163,642,202],{"class":192},[163,644,585],{"class":254},[163,646,281],{"class":192},[163,648,565],{"class":173},[163,650,651],{"class":165,"line":317},[163,652,571],{"emptyLinePlaceholder":570},[163,654,655,657,660,663,665,668,671,673,675,678,680,683],{"class":165,"line":331},[163,656,509],{"class":427},[163,658,659],{"class":173}," [",[163,661,662],{"class":254},"articleMetadata",[163,664,622],{"class":173},[163,666,667],{"class":254}," articleFile",[163,669,670],{"class":173},"]",[163,672,445],{"class":173},[163,674,448],{"class":292},[163,676,677],{"class":169}," Promise",[163,679,258],{"class":173},[163,681,682],{"class":188},"all",[163,684,685],{"class":192},"([\n",[163,687,688,691,693,695,697,699],{"class":165,"line":348},[163,689,690],{"class":188},"      queryCollection",[163,692,202],{"class":192},[163,694,223],{"class":173},[163,696,662],{"class":219},[163,698,223],{"class":173},[163,700,701],{"class":192},")\n",[163,703,704,707,710,712,714,717,719,721,723,726,728,730,732],{"class":165,"line":365},[163,705,706],{"class":173},"        .",[163,708,709],{"class":188},"where",[163,711,202],{"class":192},[163,713,223],{"class":173},[163,715,716],{"class":219},"stem",[163,718,223],{"class":173},[163,720,622],{"class":173},[163,722,216],{"class":173},[163,724,725],{"class":219},"=",[163,727,223],{"class":173},[163,729,622],{"class":173},[163,731,635],{"class":254},[163,733,701],{"class":192},[163,735,736,738,741,744],{"class":165,"line":383},[163,737,706],{"class":173},[163,739,740],{"class":188},"first",[163,742,743],{"class":192},"()",[163,745,226],{"class":173},[163,747,748,750,752,754,757,759,761,763,765,767,769,771,773,775,777,779,781,783,785,787,789,791,793],{"class":165,"line":389},[163,749,690],{"class":188},[163,751,202],{"class":192},[163,753,223],{"class":173},[163,755,756],{"class":219},"article",[163,758,223],{"class":173},[163,760,281],{"class":192},[163,762,258],{"class":173},[163,764,709],{"class":188},[163,766,202],{"class":192},[163,768,223],{"class":173},[163,770,716],{"class":219},[163,772,223],{"class":173},[163,774,622],{"class":173},[163,776,216],{"class":173},[163,778,725],{"class":219},[163,780,223],{"class":173},[163,782,622],{"class":173},[163,784,610],{"class":254},[163,786,281],{"class":192},[163,788,258],{"class":173},[163,790,740],{"class":188},[163,792,743],{"class":192},[163,794,226],{"class":173},[163,796,797,800],{"class":165,"line":398},[163,798,799],{"class":192},"    ])",[163,801,565],{"class":173},[163,803,804],{"class":165,"line":408},[163,805,571],{"emptyLinePlaceholder":570},[163,807,809,811,813,815,818,820,822],{"class":165,"line":808},20,[163,810,576],{"class":292},[163,812,579],{"class":192},[163,814,582],{"class":173},[163,816,817],{"class":254},"articleFile",[163,819,588],{"class":192},[163,821,591],{"class":292},[163,823,594],{"class":173},[163,825,827],{"class":165,"line":826},21,[163,828,571],{"emptyLinePlaceholder":570},[163,830,832],{"class":165,"line":831},22,[163,833,834],{"class":271},"    \u002F\u002F 将两边的数据融合在一起，最终提供出去渲染\n",[163,836,838,841,844,846,848,851,854,856,858,860,862],{"class":165,"line":837},23,[163,839,840],{"class":292},"    return",[163,842,843],{"class":188}," combineArticleData",[163,845,202],{"class":192},[163,847,662],{"class":254},[163,849,850],{"class":173}," ||",[163,852,853],{"class":173}," {},",[163,855,667],{"class":254},[163,857,622],{"class":173},[163,859,534],{"class":254},[163,861,281],{"class":192},[163,863,565],{"class":173},[163,865,867],{"class":165,"line":866},24,[163,868,869],{"class":173},"  },\n",[163,871,873,875],{"class":165,"line":872},25,[163,874,281],{"class":254},[163,876,565],{"class":173},[25,878,879],{},"url 唯一需要处理的，应该就是 sitemap 的生成了（如果你安装了 sitemap 模块的话）。在 nuxt.config.ts 中添加：",[32,881,883],{"className":157,"code":882,"language":159,"meta":41,"style":41},"sitemap: {\n    \u002F\u002F 排除掉不需要在 sitemap 出现的原始路径（例如带语言后缀的）\n    exclude: [\n      \"\u002Fzh-CN\u002F**\", \u002F\u002F 我默认 \u002Fblog\u002Fpost-a 就是中文，默认语言不加前缀\n      new RegExp(\".*\u002Findex.en\u002F?$\"),\n      new RegExp(\".*\u002Findex.zh-cn\u002F?$\"),\n    ],\n},\n",[39,884,885,894,899,909,924,945,964,971],{"__ignoreMap":41},[163,886,887,890,892],{"class":165,"line":166},[163,888,889],{"class":169},"sitemap",[163,891,174],{"class":173},[163,893,177],{"class":173},[163,895,896],{"class":165,"line":180},[163,897,898],{"class":271},"    \u002F\u002F 排除掉不需要在 sitemap 出现的原始路径（例如带语言后缀的）\n",[163,900,901,904,906],{"class":165,"line":196},[163,902,903],{"class":169},"    exclude",[163,905,174],{"class":173},[163,907,908],{"class":192}," [\n",[163,910,911,914,917,919,921],{"class":165,"line":208},[163,912,913],{"class":173},"      \"",[163,915,916],{"class":219},"\u002Fzh-CN\u002F**",[163,918,223],{"class":173},[163,920,622],{"class":173},[163,922,923],{"class":271}," \u002F\u002F 我默认 \u002Fblog\u002Fpost-a 就是中文，默认语言不加前缀\n",[163,925,926,929,932,934,936,939,941,943],{"class":165,"line":229},[163,927,928],{"class":173},"      new",[163,930,931],{"class":188}," RegExp",[163,933,202],{"class":192},[163,935,223],{"class":173},[163,937,938],{"class":219},".*\u002Findex.en\u002F?$",[163,940,223],{"class":173},[163,942,281],{"class":192},[163,944,226],{"class":173},[163,946,947,949,951,953,955,958,960,962],{"class":165,"line":246},[163,948,928],{"class":173},[163,950,931],{"class":188},[163,952,202],{"class":192},[163,954,223],{"class":173},[163,956,957],{"class":219},".*\u002Findex.zh-cn\u002F?$",[163,959,223],{"class":173},[163,961,281],{"class":192},[163,963,226],{"class":173},[163,965,966,969],{"class":165,"line":268},[163,967,968],{"class":192},"    ]",[163,970,226],{"class":173},[163,972,973],{"class":165,"line":275},[163,974,975],{"class":173},"},\n",[977,978],"hr",{},[25,980,981],{},"回过头看，这次重构最值得记下来的，不是那几行代码，而是那个“哦嚯”的瞬间 —— 当你在一条路上走不通的时候，不一定要硬刚，换个角度问自己：“一定要在这里解决吗？”往往答案就藏在别处。",[25,983,984],{},"这次把目录从按语言分改成按内容聚，文章管理顺手多了。如果你也在折腾 Nuxt Content + i18n，希望这篇能帮你少绕几个弯。",[986,987,988],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}",{"title":41,"searchDepth":180,"depth":180,"links":990},[991],{"id":147,"depth":180,"text":147},"\u002Fblog\u002Fnuxt-content-i18n-architecture-refactor",{"title":20,"description":27},{"loc":995},"\u002Fblog\u002Fnuxt-content-i18n-architecture-refactor\u002Findex.zh-cn","blog",{"id":998,"artifactId":7,"backgroundImg":7,"category":8,"date":999,"extension":10,"lastmod":7,"listPreviewImg":7,"meta":1000,"ogImage":7,"stem":1001,"tags":1002,"__hash__":1006,"title":1007,"body":1008,"description":1012,"lang":560,"navigation":570,"path":2563,"seo":2564,"sitemap":2565,"kind":996,"artifactItem":-1},"article\u002Fblog\u002Fcloudflare-hyperdrive-to-supabase\u002Findex.zh-CN.md","2026-06-23",{"artifactId":7,"lastmod":7,"backgroundImg":7,"ogImage":7,"listPreviewImg":-1},"blog\u002Fcloudflare-hyperdrive-to-supabase\u002Findex.zh-CN",[14,1003,1004,1005],"deployment","cloudflare","supabase","Bm5h8-0MGrdsUNXqK2Kco08neDkrh3li6JGvlFwj-q8","Cloudflare Pages 如何通过 Hyperdrive 连接到 Supabase",{"type":22,"value":1009,"toc":2552},[1010,1013,1016,1019,1022,1025,1028,1033,1036,1039,1042,1046,1052,1055,1058,1062,1069,1072,1115,1120,1123,1129,2265,2270,2508,2511,2520,2523,2526,2535,2538,2546,2549],[25,1011,1012],{},"起因还要从我正在做的第二个项目说起。",[25,1014,1015],{},"我一直想要有一款软件：可以记录自己的待办，记录自己的零碎想法，能够很方便的做计划，然后还可以定期复盘。我找了很久，试过滴答清单、flomo、wolai、flowus、obsidian，还有各种习惯打卡的 app。但是每个软件都没有使用很久，总会有一些不符合我习惯的别扭感。最后我决定自己写一个。",[25,1017,1018],{},"但我是个前端，涉及后端的东西我并不擅长。好在有AI帮忙出技术方案，最终选定用 Supabase 做后端数据库（免费额度够用，还自带用户认证），前端用 Cloudflare Pages 部署（免费额度比 Vercel 大方太多），ORM 用 Drizzle，查询写起来更符合 TypeScript 的风格。",[25,1020,1021],{},"本地开发一切顺利，两个月后 MVP 版本出炉。我兴冲冲地部署上线，然后 —— 连不上服务器。",[25,1023,1024],{},"这一卡，就是半个月。",[145,1026,1027],{"id":1027},"核心问题",[1029,1030,1032],"h3",{"id":1031},"_1-cloudflare-pages-的-serverless-function","1. Cloudflare Pages 的 serverless function",[25,1034,1035],{},"Cloudflare Pages 的 serverless function 是基于 Cloudflare Worker 的。Worker 运行在 Cloudflare 的边缘节点上，和传统的 Node.js 环境有很大不同。Worker 默认情况下是没有 Node.js 的内置模块，默认不保持长连接，每次请求独立。",[25,1037,1038],{},"Drizzle 通过 pg 模块使用 TCP 协议连接数据库，而 pg 依赖的长连接池机制与 Cloudflare Worker 的运行时环境不兼容 —— Worker 的每个请求都是独立短生命周期的，无法维持持久的 TCP 连接。",[25,1040,1041],{},"后来折腾出一种方式可以短暂的链接成功：那就是每个请求建立一个单独的链接，然后在请求结束后关闭链接。这样就不会有长连接的问题了。但是这样做的性能非常差，每次请求都要建立和关闭连接，开销很大。随便访问几次页面就会碰到 cloudflare 的 cpu 限制，导致请求被中断。",[1029,1043,1045],{"id":1044},"_2-什么是-hyperdrive","2. 什么是 Hyperdrive",[32,1047,1050],{"className":1048,"code":1049,"language":37},[35],"Cloudflare Hyperdrive 是一项专为 Cloudflare Workers 设计的服务，旨在大幅加速其访问传统数据库（如 PostgreSQL 和 MySQL）的速度。它通过在全球边缘网络建立连接池和智能缓存，大幅度提升数据库的访问效率。\n\n- 显著降低延迟：消除冗余网络往返，可为每次查询节省数百毫秒\n- 减少数据库负载：通过连接复用和查询缓存，有效降低源数据库的 CPU 和连接数压力\n- 无需修改代码：它兼容现有的数据库驱动和库，你只需更换连接字符串，无需重写查询\n",[39,1051,1049],{"__ignoreMap":41},[25,1053,1054],{},"看来事件出现了转机。于是我开始折腾基于 Hyperdrive 的链接方式。这需要我即保留本地开发环境原本的链接方式，在线上环境又要使用 Hyperdrive 的链接方式。",[145,1056,1057],{"id":1057},"最终答案",[1029,1059,1061],{"id":1060},"cloudflare-的配置","Cloudflare 的配置",[25,1063,1064,1065,1068],{},"配置有几种方式可以选择。可以把相关的变量配置写到代码中，比如用 ",[39,1066,1067],{},"wrangler.toml"," 配置文件。如果本地有这个文件，部署到线上后，cloudflare pages 会自动读取这个文件中的配置。好处就是要修改什么配置不用去管理后台了，直接代码里操作。反正每次修改配置，都要重新部署一遍的。缺点也很明显：如果都放这里的话，数据库的密码就暴漏在代码里了。另外一种就是在 cloudflare pages 的后台配置环境变量，这样不会暴露数据库密码。",[25,1070,1071],{},"首先，要创建一个 Hyperdrive binding。这个 binding 是一个 cloudflare pages 的资源，绑定了一个数据库的连接。具体创建方式我就不赘述了，网上很多资料。创建好后，要去自己的 page 项目中，打开 settings。",[1073,1074,1075,1082,1092],"ul",{},[49,1076,1077,1078],{},"在 Bindings 的栏目里进行绑定刚才创建的 Hyperdrive。",[1079,1080,1081],"strong",{},"注意，绑定时，设定的 name 名称要跟代码里的名称一致。",[49,1083,1084,1085,1088,1089],{},"在 Compatibility Flags 里，添加 ",[39,1086,1087],{},"nodejs_compat"," 和 ",[39,1090,1091],{},"no_nodejs_compat_v2",[49,1093,1094,1095,1098,1099,1102,1103,1088,1106,1109,1110],{},"此时 ",[39,1096,1097],{},"Variables and secrets"," 原来的环境变量会清空，需要重新添加 ",[39,1100,1101],{},"secrets","。主要是：",[39,1104,1105],{},"SUPABASE_KEY",[39,1107,1108],{},"SUPABASE_URL","。",[1073,1111,1112],{},[49,1113,1114],{},"因为前面开启了那两个 flag 后，要求所有的环境变量都要是 secret 才能使用。secrets 也是环境变量，只是值不再能查看，只会在服务端运行时可以获取到，安全性更高而已。",[25,1116,1117],{},[1079,1118,1119],{},"PS：Cloudflare pages 默认是支持 production 和 preview 两个环境的，想要两边都使用，需要分别配置。",[1029,1121,1122],{"id":1122},"代码",[25,1124,1125,1128],{},[39,1126,1127],{},"client.ts"," drizzle 连接数据库的入口文件",[32,1130,1132],{"className":157,"code":1131,"language":159,"meta":41,"style":41},"import { drizzle, type PostgresJsDatabase } from \"drizzle-orm\u002Fpostgres-js\";\nimport postgres from \"postgres\";\nimport { tables } from \".\u002Fschema\";\n\ntype BaseCloudflareHyperdriveBinding = {\n  connectionString: string;\n};\n\ntype BaseCloudflareRuntimeEnv = Record\u003Cstring, unknown>;\ntype BaseHyperdriveGlobalScope = typeof globalThis & {\n  __DAYFLOWY_HYPERDRIVE_CONNECTION_STRING__?: string;\n};\n\nexport type DrizzleDb = PostgresJsDatabase\u003Ctypeof tables>;\n\n\u002F\u002F 全局变量的引用\nconst hyperdriveGlobalScope = globalThis as BaseHyperdriveGlobalScope;\n\nconst resolveCloudflareBindingConnectionString = (): string | undefined => {\n  \u002F\u002F 从全局变量上取 hyperdrive 的连接字符串\n  const connectionString =\n    hyperdriveGlobalScope.__DAYFLOWY_HYPERDRIVE_CONNECTION_STRING__;\n\n  return typeof connectionString === \"string\" &&\n    connectionString.trim().length > 0\n    ? connectionString.trim()\n    : undefined;\n};\n\n\u002F\u002F 获取最终的数据库链接地址\nconst resolveDatabaseUrl = (): string | undefined => {\n  return (resolveCloudflareBindingConnectionString() ||\n    process.env.DATABASE_URL ||\n    process.env.SUPABASE_DB_URL) as string | undefined;\n};\n\n\u002F\u002F drizzle 链接数据库的函数，业务方可以通过返回的实例来操作数据库\nexport function useDb(): DrizzleDb {\n  const databaseUrl = resolveDatabaseUrl();\n\n  if (!databaseUrl) {\n    throw new Error(\n      \"Missing database connection. Configure Hyperdrive binding or DATABASE_URL\u002FSUPABASE_DB_URL.\",\n    );\n  }\n\n  if (\n    !databaseUrl.startsWith(\"postgres:\u002F\u002F\") &&\n    !databaseUrl.startsWith(\"postgresql:\u002F\u002F\")\n  ) {\n    throw new Error(\n      \"Invalid DATABASE_URL\u002FSUPABASE_DB_URL for Drizzle client. Expected postgres:\u002F\u002F... or postgresql:\u002F\u002F...\",\n    );\n  }\n\n  const sql = postgres(databaseUrl, {\n    prepare: false,\n  });\n\n  return drizzle(sql, {\n    schema: tables,\n    casing: \"snake_case\",\n  });\n}\n\n\u002F\u002F 最关键的是这里，从环境变量中获取 hyperdrive 的连接字符串\nexport const cacheHyperdriveConnectionString = (\n  env: BaseCloudflareRuntimeEnv | undefined,\n): void => {\n  \u002F\u002F env 的入参是在线上环境中 cloudflare pages 的 serverless function 的环境变量对象，里面包含了 hyperdrive 的 binding\n\n  if (!env) {\n    return;\n  }\n\n  \u002F\u002F 这里的 HYPERDRIVE_BINDING_NAME 是在 cloudflare pages 的环境变量中配置的，指向 hyperdrive 的 binding 名称\n  const bindingName = (\n    process.env.HYPERDRIVE_BINDING_NAME || \"HYPERDRIVE\"\n  ).trim();\n\n  \u002F\u002F 根据配置的名称，从线上环境变量里获取 hyperdrive 的 binding 对象\n  const binding = env[bindingName] as\n    | BaseCloudflareHyperdriveBinding\n    | undefined;\n\n  \u002F\u002F 从 binding 对象中获取连接字符串 - hyperdrive 连接数据库的连接\n  const connectionString = binding?.connectionString;\n\n  if (\n    typeof connectionString !== \"string\" ||\n    connectionString.trim().length === 0\n  ) {\n    return;\n  }\n\n  \u002F\u002F 将连接字符串缓存到全局变量中，供后续使用\n  hyperdriveGlobalScope.__DAYFLOWY_HYPERDRIVE_CONNECTION_STRING__ =\n    connectionString.trim();\n};\n",[39,1133,1134,1167,1186,1208,1212,1224,1236,1241,1245,1271,1291,1303,1307,1311,1332,1336,1341,1359,1363,1386,1391,1402,1414,1418,1439,1463,1478,1487,1492,1497,1503,1525,1541,1560,1586,1591,1596,1602,1620,1637,1642,1659,1673,1685,1692,1698,1703,1711,1738,1760,1768,1779,1791,1798,1803,1808,1829,1843,1853,1858,1874,1886,1903,1912,1917,1922,1928,1943,1960,1974,1980,1985,2000,2007,2012,2017,2023,2035,2059,2073,2078,2084,2109,2118,2125,2130,2136,2155,2160,2167,2186,2205,2212,2219,2224,2229,2235,2247,2260],{"__ignoreMap":41},[163,1135,1136,1139,1141,1144,1146,1149,1152,1155,1158,1160,1163,1165],{"class":165,"line":166},[163,1137,1138],{"class":292},"import",[163,1140,431],{"class":173},[163,1142,1143],{"class":254}," drizzle",[163,1145,622],{"class":173},[163,1147,1148],{"class":292}," type",[163,1150,1151],{"class":254}," PostgresJsDatabase",[163,1153,1154],{"class":173}," }",[163,1156,1157],{"class":292}," from",[163,1159,216],{"class":173},[163,1161,1162],{"class":219},"drizzle-orm\u002Fpostgres-js",[163,1164,223],{"class":173},[163,1166,565],{"class":173},[163,1168,1169,1171,1174,1177,1179,1182,1184],{"class":165,"line":180},[163,1170,1138],{"class":292},[163,1172,1173],{"class":254}," postgres ",[163,1175,1176],{"class":292},"from",[163,1178,216],{"class":173},[163,1180,1181],{"class":219},"postgres",[163,1183,223],{"class":173},[163,1185,565],{"class":173},[163,1187,1188,1190,1192,1195,1197,1199,1201,1204,1206],{"class":165,"line":196},[163,1189,1138],{"class":292},[163,1191,431],{"class":173},[163,1193,1194],{"class":254}," tables",[163,1196,1154],{"class":173},[163,1198,1157],{"class":292},[163,1200,216],{"class":173},[163,1202,1203],{"class":219},".\u002Fschema",[163,1205,223],{"class":173},[163,1207,565],{"class":173},[163,1209,1210],{"class":165,"line":208},[163,1211,571],{"emptyLinePlaceholder":570},[163,1213,1214,1217,1220,1222],{"class":165,"line":229},[163,1215,1216],{"class":427},"type",[163,1218,1219],{"class":169}," BaseCloudflareHyperdriveBinding",[163,1221,445],{"class":173},[163,1223,177],{"class":173},[163,1225,1226,1229,1231,1234],{"class":165,"line":246},[163,1227,1228],{"class":192},"  connectionString",[163,1230,174],{"class":173},[163,1232,1233],{"class":169}," string",[163,1235,565],{"class":173},[163,1237,1238],{"class":165,"line":268},[163,1239,1240],{"class":173},"};\n",[163,1242,1243],{"class":165,"line":275},[163,1244,571],{"emptyLinePlaceholder":570},[163,1246,1247,1249,1252,1254,1257,1260,1263,1265,1268],{"class":165,"line":286},[163,1248,1216],{"class":427},[163,1250,1251],{"class":169}," BaseCloudflareRuntimeEnv",[163,1253,445],{"class":173},[163,1255,1256],{"class":169}," Record",[163,1258,1259],{"class":173},"\u003C",[163,1261,1262],{"class":169},"string",[163,1264,622],{"class":173},[163,1266,1267],{"class":169}," unknown",[163,1269,1270],{"class":173},">;\n",[163,1272,1273,1275,1278,1280,1283,1286,1289],{"class":165,"line":303},[163,1274,1216],{"class":427},[163,1276,1277],{"class":169}," BaseHyperdriveGlobalScope",[163,1279,445],{"class":173},[163,1281,1282],{"class":173}," typeof",[163,1284,1285],{"class":254}," globalThis ",[163,1287,1288],{"class":173},"&",[163,1290,177],{"class":173},[163,1292,1293,1296,1299,1301],{"class":165,"line":311},[163,1294,1295],{"class":192},"  __DAYFLOWY_HYPERDRIVE_CONNECTION_STRING__",[163,1297,1298],{"class":173},"?:",[163,1300,1233],{"class":169},[163,1302,565],{"class":173},[163,1304,1305],{"class":165,"line":317},[163,1306,1240],{"class":173},[163,1308,1309],{"class":165,"line":331},[163,1310,571],{"emptyLinePlaceholder":570},[163,1312,1313,1316,1318,1321,1323,1325,1328,1330],{"class":165,"line":348},[163,1314,1315],{"class":292},"export",[163,1317,1148],{"class":427},[163,1319,1320],{"class":169}," DrizzleDb",[163,1322,445],{"class":173},[163,1324,1151],{"class":169},[163,1326,1327],{"class":173},"\u003Ctypeof",[163,1329,1194],{"class":254},[163,1331,1270],{"class":173},[163,1333,1334],{"class":165,"line":365},[163,1335,571],{"emptyLinePlaceholder":570},[163,1337,1338],{"class":165,"line":383},[163,1339,1340],{"class":271},"\u002F\u002F 全局变量的引用\n",[163,1342,1343,1345,1348,1350,1352,1355,1357],{"class":165,"line":389},[163,1344,428],{"class":427},[163,1346,1347],{"class":254}," hyperdriveGlobalScope ",[163,1349,725],{"class":173},[163,1351,1285],{"class":254},[163,1353,1354],{"class":292},"as",[163,1356,1277],{"class":169},[163,1358,565],{"class":173},[163,1360,1361],{"class":165,"line":398},[163,1362,571],{"emptyLinePlaceholder":570},[163,1364,1365,1367,1370,1372,1375,1377,1379,1382,1384],{"class":165,"line":408},[163,1366,428],{"class":427},[163,1368,1369],{"class":254}," resolveCloudflareBindingConnectionString ",[163,1371,725],{"class":173},[163,1373,1374],{"class":173}," ():",[163,1376,1233],{"class":169},[163,1378,555],{"class":173},[163,1380,1381],{"class":169}," undefined",[163,1383,502],{"class":427},[163,1385,177],{"class":173},[163,1387,1388],{"class":165,"line":808},[163,1389,1390],{"class":271},"  \u002F\u002F 从全局变量上取 hyperdrive 的连接字符串\n",[163,1392,1393,1396,1399],{"class":165,"line":826},[163,1394,1395],{"class":427},"  const",[163,1397,1398],{"class":254}," connectionString",[163,1400,1401],{"class":173}," =\n",[163,1403,1404,1407,1409,1412],{"class":165,"line":831},[163,1405,1406],{"class":254},"    hyperdriveGlobalScope",[163,1408,258],{"class":173},[163,1410,1411],{"class":254},"__DAYFLOWY_HYPERDRIVE_CONNECTION_STRING__",[163,1413,565],{"class":173},[163,1415,1416],{"class":165,"line":837},[163,1417,571],{"emptyLinePlaceholder":570},[163,1419,1420,1423,1425,1427,1430,1432,1434,1436],{"class":165,"line":866},[163,1421,1422],{"class":292},"  return",[163,1424,1282],{"class":173},[163,1426,1398],{"class":254},[163,1428,1429],{"class":173}," ===",[163,1431,216],{"class":173},[163,1433,1262],{"class":219},[163,1435,223],{"class":173},[163,1437,1438],{"class":173}," &&\n",[163,1440,1441,1444,1446,1449,1451,1453,1456,1459],{"class":165,"line":872},[163,1442,1443],{"class":254},"    connectionString",[163,1445,258],{"class":173},[163,1447,1448],{"class":188},"trim",[163,1450,743],{"class":192},[163,1452,258],{"class":173},[163,1454,1455],{"class":254},"length",[163,1457,1458],{"class":173}," >",[163,1460,1462],{"class":1461},"sbssI"," 0\n",[163,1464,1466,1469,1471,1473,1475],{"class":165,"line":1465},26,[163,1467,1468],{"class":173},"    ?",[163,1470,1398],{"class":254},[163,1472,258],{"class":173},[163,1474,1448],{"class":188},[163,1476,1477],{"class":192},"()\n",[163,1479,1481,1484],{"class":165,"line":1480},27,[163,1482,1483],{"class":173},"    :",[163,1485,1486],{"class":173}," undefined;\n",[163,1488,1490],{"class":165,"line":1489},28,[163,1491,1240],{"class":173},[163,1493,1495],{"class":165,"line":1494},29,[163,1496,571],{"emptyLinePlaceholder":570},[163,1498,1500],{"class":165,"line":1499},30,[163,1501,1502],{"class":271},"\u002F\u002F 获取最终的数据库链接地址\n",[163,1504,1506,1508,1511,1513,1515,1517,1519,1521,1523],{"class":165,"line":1505},31,[163,1507,428],{"class":427},[163,1509,1510],{"class":254}," resolveDatabaseUrl ",[163,1512,725],{"class":173},[163,1514,1374],{"class":173},[163,1516,1233],{"class":169},[163,1518,555],{"class":173},[163,1520,1381],{"class":169},[163,1522,502],{"class":427},[163,1524,177],{"class":173},[163,1526,1528,1530,1532,1535,1538],{"class":165,"line":1527},32,[163,1529,1422],{"class":292},[163,1531,579],{"class":192},[163,1533,1534],{"class":188},"resolveCloudflareBindingConnectionString",[163,1536,1537],{"class":192},"() ",[163,1539,1540],{"class":173},"||\n",[163,1542,1544,1547,1549,1552,1554,1557],{"class":165,"line":1543},33,[163,1545,1546],{"class":254},"    process",[163,1548,258],{"class":173},[163,1550,1551],{"class":254},"env",[163,1553,258],{"class":173},[163,1555,1556],{"class":254},"DATABASE_URL",[163,1558,1559],{"class":173}," ||\n",[163,1561,1563,1565,1567,1569,1571,1574,1576,1578,1580,1582,1584],{"class":165,"line":1562},34,[163,1564,1546],{"class":254},[163,1566,258],{"class":173},[163,1568,1551],{"class":254},[163,1570,258],{"class":173},[163,1572,1573],{"class":254},"SUPABASE_DB_URL",[163,1575,588],{"class":192},[163,1577,1354],{"class":292},[163,1579,1233],{"class":169},[163,1581,555],{"class":173},[163,1583,1381],{"class":169},[163,1585,565],{"class":173},[163,1587,1589],{"class":165,"line":1588},35,[163,1590,1240],{"class":173},[163,1592,1594],{"class":165,"line":1593},36,[163,1595,571],{"emptyLinePlaceholder":570},[163,1597,1599],{"class":165,"line":1598},37,[163,1600,1601],{"class":271},"\u002F\u002F drizzle 链接数据库的函数，业务方可以通过返回的实例来操作数据库\n",[163,1603,1605,1607,1610,1613,1616,1618],{"class":165,"line":1604},38,[163,1606,1315],{"class":292},[163,1608,1609],{"class":427}," function",[163,1611,1612],{"class":188}," useDb",[163,1614,1615],{"class":173},"():",[163,1617,1320],{"class":169},[163,1619,177],{"class":173},[163,1621,1623,1625,1628,1630,1633,1635],{"class":165,"line":1622},39,[163,1624,1395],{"class":427},[163,1626,1627],{"class":254}," databaseUrl",[163,1629,445],{"class":173},[163,1631,1632],{"class":188}," resolveDatabaseUrl",[163,1634,743],{"class":192},[163,1636,565],{"class":173},[163,1638,1640],{"class":165,"line":1639},40,[163,1641,571],{"emptyLinePlaceholder":570},[163,1643,1645,1648,1650,1652,1655,1657],{"class":165,"line":1644},41,[163,1646,1647],{"class":292},"  if",[163,1649,579],{"class":192},[163,1651,582],{"class":173},[163,1653,1654],{"class":254},"databaseUrl",[163,1656,588],{"class":192},[163,1658,205],{"class":173},[163,1660,1662,1665,1668,1671],{"class":165,"line":1661},42,[163,1663,1664],{"class":292},"    throw",[163,1666,1667],{"class":173}," new",[163,1669,1670],{"class":188}," Error",[163,1672,193],{"class":192},[163,1674,1676,1678,1681,1683],{"class":165,"line":1675},43,[163,1677,913],{"class":173},[163,1679,1680],{"class":219},"Missing database connection. Configure Hyperdrive binding or DATABASE_URL\u002FSUPABASE_DB_URL.",[163,1682,223],{"class":173},[163,1684,226],{"class":173},[163,1686,1688,1690],{"class":165,"line":1687},44,[163,1689,306],{"class":192},[163,1691,565],{"class":173},[163,1693,1695],{"class":165,"line":1694},45,[163,1696,1697],{"class":173},"  }\n",[163,1699,1701],{"class":165,"line":1700},46,[163,1702,571],{"emptyLinePlaceholder":570},[163,1704,1706,1708],{"class":165,"line":1705},47,[163,1707,1647],{"class":292},[163,1709,1710],{"class":192}," (\n",[163,1712,1714,1717,1719,1721,1724,1726,1728,1731,1733,1735],{"class":165,"line":1713},48,[163,1715,1716],{"class":173},"    !",[163,1718,1654],{"class":254},[163,1720,258],{"class":173},[163,1722,1723],{"class":188},"startsWith",[163,1725,202],{"class":192},[163,1727,223],{"class":173},[163,1729,1730],{"class":219},"postgres:\u002F\u002F",[163,1732,223],{"class":173},[163,1734,588],{"class":192},[163,1736,1737],{"class":173},"&&\n",[163,1739,1741,1743,1745,1747,1749,1751,1753,1756,1758],{"class":165,"line":1740},49,[163,1742,1716],{"class":173},[163,1744,1654],{"class":254},[163,1746,258],{"class":173},[163,1748,1723],{"class":188},[163,1750,202],{"class":192},[163,1752,223],{"class":173},[163,1754,1755],{"class":219},"postgresql:\u002F\u002F",[163,1757,223],{"class":173},[163,1759,701],{"class":192},[163,1761,1763,1766],{"class":165,"line":1762},50,[163,1764,1765],{"class":192},"  ) ",[163,1767,205],{"class":173},[163,1769,1771,1773,1775,1777],{"class":165,"line":1770},51,[163,1772,1664],{"class":292},[163,1774,1667],{"class":173},[163,1776,1670],{"class":188},[163,1778,193],{"class":192},[163,1780,1782,1784,1787,1789],{"class":165,"line":1781},52,[163,1783,913],{"class":173},[163,1785,1786],{"class":219},"Invalid DATABASE_URL\u002FSUPABASE_DB_URL for Drizzle client. Expected postgres:\u002F\u002F... or postgresql:\u002F\u002F...",[163,1788,223],{"class":173},[163,1790,226],{"class":173},[163,1792,1794,1796],{"class":165,"line":1793},53,[163,1795,306],{"class":192},[163,1797,565],{"class":173},[163,1799,1801],{"class":165,"line":1800},54,[163,1802,1697],{"class":173},[163,1804,1806],{"class":165,"line":1805},55,[163,1807,571],{"emptyLinePlaceholder":570},[163,1809,1811,1813,1816,1818,1821,1823,1825,1827],{"class":165,"line":1810},56,[163,1812,1395],{"class":427},[163,1814,1815],{"class":254}," sql",[163,1817,445],{"class":173},[163,1819,1820],{"class":188}," postgres",[163,1822,202],{"class":192},[163,1824,1654],{"class":254},[163,1826,622],{"class":173},[163,1828,177],{"class":173},[163,1830,1832,1835,1837,1841],{"class":165,"line":1831},57,[163,1833,1834],{"class":192},"    prepare",[163,1836,174],{"class":173},[163,1838,1840],{"class":1839},"sfNiH"," false",[163,1842,226],{"class":173},[163,1844,1846,1849,1851],{"class":165,"line":1845},58,[163,1847,1848],{"class":173},"  }",[163,1850,281],{"class":192},[163,1852,565],{"class":173},[163,1854,1856],{"class":165,"line":1855},59,[163,1857,571],{"emptyLinePlaceholder":570},[163,1859,1861,1863,1865,1867,1870,1872],{"class":165,"line":1860},60,[163,1862,1422],{"class":292},[163,1864,1143],{"class":188},[163,1866,202],{"class":192},[163,1868,1869],{"class":254},"sql",[163,1871,622],{"class":173},[163,1873,177],{"class":173},[163,1875,1877,1880,1882,1884],{"class":165,"line":1876},61,[163,1878,1879],{"class":192},"    schema",[163,1881,174],{"class":173},[163,1883,1194],{"class":254},[163,1885,226],{"class":173},[163,1887,1889,1892,1894,1896,1899,1901],{"class":165,"line":1888},62,[163,1890,1891],{"class":192},"    casing",[163,1893,174],{"class":173},[163,1895,216],{"class":173},[163,1897,1898],{"class":219},"snake_case",[163,1900,223],{"class":173},[163,1902,226],{"class":173},[163,1904,1906,1908,1910],{"class":165,"line":1905},63,[163,1907,1848],{"class":173},[163,1909,281],{"class":192},[163,1911,565],{"class":173},[163,1913,1915],{"class":165,"line":1914},64,[163,1916,411],{"class":173},[163,1918,1920],{"class":165,"line":1919},65,[163,1921,571],{"emptyLinePlaceholder":570},[163,1923,1925],{"class":165,"line":1924},66,[163,1926,1927],{"class":271},"\u002F\u002F 最关键的是这里，从环境变量中获取 hyperdrive 的连接字符串\n",[163,1929,1931,1933,1936,1939,1941],{"class":165,"line":1930},67,[163,1932,1315],{"class":292},[163,1934,1935],{"class":427}," const",[163,1937,1938],{"class":254}," cacheHyperdriveConnectionString ",[163,1940,725],{"class":173},[163,1942,1710],{"class":254},[163,1944,1946,1950,1952,1954,1956,1958],{"class":165,"line":1945},68,[163,1947,1949],{"class":1948},"sHdIc","  env",[163,1951,174],{"class":173},[163,1953,1251],{"class":169},[163,1955,555],{"class":173},[163,1957,1381],{"class":169},[163,1959,226],{"class":173},[163,1961,1963,1965,1967,1970,1972],{"class":165,"line":1962},69,[163,1964,281],{"class":254},[163,1966,174],{"class":173},[163,1968,1969],{"class":169}," void",[163,1971,502],{"class":427},[163,1973,177],{"class":173},[163,1975,1977],{"class":165,"line":1976},70,[163,1978,1979],{"class":271},"  \u002F\u002F env 的入参是在线上环境中 cloudflare pages 的 serverless function 的环境变量对象，里面包含了 hyperdrive 的 binding\n",[163,1981,1983],{"class":165,"line":1982},71,[163,1984,571],{"emptyLinePlaceholder":570},[163,1986,1988,1990,1992,1994,1996,1998],{"class":165,"line":1987},72,[163,1989,1647],{"class":292},[163,1991,579],{"class":192},[163,1993,582],{"class":173},[163,1995,1551],{"class":254},[163,1997,588],{"class":192},[163,1999,205],{"class":173},[163,2001,2003,2005],{"class":165,"line":2002},73,[163,2004,840],{"class":292},[163,2006,565],{"class":173},[163,2008,2010],{"class":165,"line":2009},74,[163,2011,1697],{"class":173},[163,2013,2015],{"class":165,"line":2014},75,[163,2016,571],{"emptyLinePlaceholder":570},[163,2018,2020],{"class":165,"line":2019},76,[163,2021,2022],{"class":271},"  \u002F\u002F 这里的 HYPERDRIVE_BINDING_NAME 是在 cloudflare pages 的环境变量中配置的，指向 hyperdrive 的 binding 名称\n",[163,2024,2026,2028,2031,2033],{"class":165,"line":2025},77,[163,2027,1395],{"class":427},[163,2029,2030],{"class":254}," bindingName",[163,2032,445],{"class":173},[163,2034,1710],{"class":192},[163,2036,2038,2040,2042,2044,2046,2049,2051,2053,2056],{"class":165,"line":2037},78,[163,2039,1546],{"class":254},[163,2041,258],{"class":173},[163,2043,1551],{"class":254},[163,2045,258],{"class":173},[163,2047,2048],{"class":254},"HYPERDRIVE_BINDING_NAME",[163,2050,850],{"class":173},[163,2052,216],{"class":173},[163,2054,2055],{"class":219},"HYPERDRIVE",[163,2057,2058],{"class":173},"\"\n",[163,2060,2062,2065,2067,2069,2071],{"class":165,"line":2061},79,[163,2063,2064],{"class":192},"  )",[163,2066,258],{"class":173},[163,2068,1448],{"class":188},[163,2070,743],{"class":192},[163,2072,565],{"class":173},[163,2074,2076],{"class":165,"line":2075},80,[163,2077,571],{"emptyLinePlaceholder":570},[163,2079,2081],{"class":165,"line":2080},81,[163,2082,2083],{"class":271},"  \u002F\u002F 根据配置的名称，从线上环境变量里获取 hyperdrive 的 binding 对象\n",[163,2085,2087,2089,2092,2094,2097,2100,2103,2106],{"class":165,"line":2086},82,[163,2088,1395],{"class":427},[163,2090,2091],{"class":254}," binding",[163,2093,445],{"class":173},[163,2095,2096],{"class":254}," env",[163,2098,2099],{"class":192},"[",[163,2101,2102],{"class":254},"bindingName",[163,2104,2105],{"class":192},"] ",[163,2107,2108],{"class":292},"as\n",[163,2110,2112,2115],{"class":165,"line":2111},83,[163,2113,2114],{"class":173},"    |",[163,2116,2117],{"class":254}," BaseCloudflareHyperdriveBinding\n",[163,2119,2121,2123],{"class":165,"line":2120},84,[163,2122,2114],{"class":173},[163,2124,1486],{"class":173},[163,2126,2128],{"class":165,"line":2127},85,[163,2129,571],{"emptyLinePlaceholder":570},[163,2131,2133],{"class":165,"line":2132},86,[163,2134,2135],{"class":271},"  \u002F\u002F 从 binding 对象中获取连接字符串 - hyperdrive 连接数据库的连接\n",[163,2137,2139,2141,2143,2145,2147,2150,2153],{"class":165,"line":2138},87,[163,2140,1395],{"class":427},[163,2142,1398],{"class":254},[163,2144,445],{"class":173},[163,2146,2091],{"class":254},[163,2148,2149],{"class":173},"?.",[163,2151,2152],{"class":254},"connectionString",[163,2154,565],{"class":173},[163,2156,2158],{"class":165,"line":2157},88,[163,2159,571],{"emptyLinePlaceholder":570},[163,2161,2163,2165],{"class":165,"line":2162},89,[163,2164,1647],{"class":292},[163,2166,1710],{"class":192},[163,2168,2170,2173,2175,2178,2180,2182,2184],{"class":165,"line":2169},90,[163,2171,2172],{"class":173},"    typeof",[163,2174,1398],{"class":254},[163,2176,2177],{"class":173}," !==",[163,2179,216],{"class":173},[163,2181,1262],{"class":219},[163,2183,223],{"class":173},[163,2185,1559],{"class":173},[163,2187,2189,2191,2193,2195,2197,2199,2201,2203],{"class":165,"line":2188},91,[163,2190,1443],{"class":254},[163,2192,258],{"class":173},[163,2194,1448],{"class":188},[163,2196,743],{"class":192},[163,2198,258],{"class":173},[163,2200,1455],{"class":254},[163,2202,1429],{"class":173},[163,2204,1462],{"class":1461},[163,2206,2208,2210],{"class":165,"line":2207},92,[163,2209,1765],{"class":192},[163,2211,205],{"class":173},[163,2213,2215,2217],{"class":165,"line":2214},93,[163,2216,840],{"class":292},[163,2218,565],{"class":173},[163,2220,2222],{"class":165,"line":2221},94,[163,2223,1697],{"class":173},[163,2225,2227],{"class":165,"line":2226},95,[163,2228,571],{"emptyLinePlaceholder":570},[163,2230,2232],{"class":165,"line":2231},96,[163,2233,2234],{"class":271},"  \u002F\u002F 将连接字符串缓存到全局变量中，供后续使用\n",[163,2236,2238,2241,2243,2245],{"class":165,"line":2237},97,[163,2239,2240],{"class":254},"  hyperdriveGlobalScope",[163,2242,258],{"class":173},[163,2244,1411],{"class":254},[163,2246,1401],{"class":173},[163,2248,2250,2252,2254,2256,2258],{"class":165,"line":2249},98,[163,2251,1443],{"class":254},[163,2253,258],{"class":173},[163,2255,1448],{"class":188},[163,2257,743],{"class":192},[163,2259,565],{"class":173},[163,2261,2263],{"class":165,"line":2262},99,[163,2264,1240],{"class":173},[25,2266,2267],{},[39,2268,2269],{},"server\u002Fmiddlewares\u002Fhyperdirve-context.ts",[32,2271,2273],{"className":157,"code":2272,"language":159,"meta":41,"style":41},"\u002F\u002F 在服务端增加一个中间件，每次请求时，都获取线上的环境变量，并缓存 hyperdrive 的连接字符串到全局变量中，供 drizzle 链接数据库时使用\nimport { cacheHyperdriveConnectionString } from \"PATH_TO_CLIENT\u002Fclient.ts\";\n\nexport default defineEventHandler((event) => {\n  const contextEnv = (\n    event.context.cloudflare as { env?: Record\u003Cstring, unknown> } | undefined\n  )?.env;\n  const runtimeEnv = (\n    event.req as {\n      runtime?: { cloudflare?: { env?: Record\u003Cstring, unknown> } };\n    }\n  ).runtime?.cloudflare?.env;\n\n  cacheHyperdriveConnectionString(contextEnv ?? runtimeEnv);\n});\n\n",[39,2274,2275,2280,2302,2306,2329,2340,2382,2392,2403,2416,2453,2458,2477,2481,2500],{"__ignoreMap":41},[163,2276,2277],{"class":165,"line":166},[163,2278,2279],{"class":271},"\u002F\u002F 在服务端增加一个中间件，每次请求时，都获取线上的环境变量，并缓存 hyperdrive 的连接字符串到全局变量中，供 drizzle 链接数据库时使用\n",[163,2281,2282,2284,2286,2289,2291,2293,2295,2298,2300],{"class":165,"line":180},[163,2283,1138],{"class":292},[163,2285,431],{"class":173},[163,2287,2288],{"class":254}," cacheHyperdriveConnectionString",[163,2290,1154],{"class":173},[163,2292,1157],{"class":292},[163,2294,216],{"class":173},[163,2296,2297],{"class":219},"PATH_TO_CLIENT\u002Fclient.ts",[163,2299,223],{"class":173},[163,2301,565],{"class":173},[163,2303,2304],{"class":165,"line":196},[163,2305,571],{"emptyLinePlaceholder":570},[163,2307,2308,2310,2313,2316,2318,2320,2323,2325,2327],{"class":165,"line":208},[163,2309,1315],{"class":292},[163,2311,2312],{"class":292}," default",[163,2314,2315],{"class":188}," defineEventHandler",[163,2317,202],{"class":254},[163,2319,202],{"class":173},[163,2321,2322],{"class":1948},"event",[163,2324,281],{"class":173},[163,2326,502],{"class":427},[163,2328,177],{"class":173},[163,2330,2331,2333,2336,2338],{"class":165,"line":229},[163,2332,1395],{"class":427},[163,2334,2335],{"class":254}," contextEnv",[163,2337,445],{"class":173},[163,2339,1710],{"class":192},[163,2341,2342,2345,2347,2350,2352,2354,2356,2358,2360,2362,2364,2366,2368,2370,2372,2375,2377,2379],{"class":165,"line":246},[163,2343,2344],{"class":254},"    event",[163,2346,258],{"class":173},[163,2348,2349],{"class":254},"context",[163,2351,258],{"class":173},[163,2353,1004],{"class":254},[163,2355,293],{"class":292},[163,2357,431],{"class":173},[163,2359,2096],{"class":192},[163,2361,1298],{"class":173},[163,2363,1256],{"class":169},[163,2365,1259],{"class":173},[163,2367,1262],{"class":169},[163,2369,622],{"class":173},[163,2371,1267],{"class":169},[163,2373,2374],{"class":173},">",[163,2376,1154],{"class":173},[163,2378,555],{"class":173},[163,2380,2381],{"class":169}," undefined\n",[163,2383,2384,2386,2388,2390],{"class":165,"line":268},[163,2385,2064],{"class":192},[163,2387,2149],{"class":173},[163,2389,1551],{"class":254},[163,2391,565],{"class":173},[163,2393,2394,2396,2399,2401],{"class":165,"line":275},[163,2395,1395],{"class":427},[163,2397,2398],{"class":254}," runtimeEnv",[163,2400,445],{"class":173},[163,2402,1710],{"class":192},[163,2404,2405,2407,2409,2412,2414],{"class":165,"line":286},[163,2406,2344],{"class":254},[163,2408,258],{"class":173},[163,2410,2411],{"class":254},"req",[163,2413,293],{"class":292},[163,2415,177],{"class":173},[163,2417,2418,2421,2423,2425,2428,2430,2432,2434,2436,2438,2440,2442,2444,2446,2448,2450],{"class":165,"line":303},[163,2419,2420],{"class":192},"      runtime",[163,2422,1298],{"class":173},[163,2424,431],{"class":173},[163,2426,2427],{"class":192}," cloudflare",[163,2429,1298],{"class":173},[163,2431,431],{"class":173},[163,2433,2096],{"class":192},[163,2435,1298],{"class":173},[163,2437,1256],{"class":169},[163,2439,1259],{"class":173},[163,2441,1262],{"class":169},[163,2443,622],{"class":173},[163,2445,1267],{"class":169},[163,2447,2374],{"class":173},[163,2449,1154],{"class":173},[163,2451,2452],{"class":173}," };\n",[163,2454,2455],{"class":165,"line":311},[163,2456,2457],{"class":173},"    }\n",[163,2459,2460,2462,2464,2467,2469,2471,2473,2475],{"class":165,"line":317},[163,2461,2064],{"class":192},[163,2463,258],{"class":173},[163,2465,2466],{"class":254},"runtime",[163,2468,2149],{"class":173},[163,2470,1004],{"class":254},[163,2472,2149],{"class":173},[163,2474,1551],{"class":254},[163,2476,565],{"class":173},[163,2478,2479],{"class":165,"line":331},[163,2480,571],{"emptyLinePlaceholder":570},[163,2482,2483,2486,2488,2491,2494,2496,2498],{"class":165,"line":348},[163,2484,2485],{"class":188},"  cacheHyperdriveConnectionString",[163,2487,202],{"class":192},[163,2489,2490],{"class":254},"contextEnv",[163,2492,2493],{"class":173}," ??",[163,2495,2398],{"class":254},[163,2497,281],{"class":192},[163,2499,565],{"class":173},[163,2501,2502,2504,2506],{"class":165,"line":365},[163,2503,442],{"class":173},[163,2505,281],{"class":254},[163,2507,565],{"class":173},[25,2509,2510],{},"配置弄好，代码改好后，就可以部署到线上了。访问页面，终于可以正常访问数据库了。Hyperdrive 的 metrics 中也终于可以正常显示数据流量了：",[25,2512,2513],{},[2514,2515],"img",{":zoom":2516,"alt":2517,"loading":2518,"src":2519},"false","Hyperdrive Metrics","lazy","\u002Fimages\u002Fillustration\u002Fhyperdrive-metrics.webp",[145,2521,2522],{"id":2522},"结语",[25,2524,2525],{},"这个事件让我意识到一个很严重的事情：",[2527,2528,2530],"blog-style-highlight",{"status":2529},"error",[25,2531,2532],{},[1079,2533,2534],{},"在不知不觉中，我已经养成了过度依赖AI的习惯，自己几乎停止了学习和思考，总是希望这个黑盒能帮我解决所有问题。",[25,2536,2537],{},"这可不是一个好现象。思来想去，我的决定是：",[2527,2539,2541],{"status":2540},"info",[25,2542,2543],{},[1079,2544,2545],{},"不管 AI 多厉害，多强大，知识还是要掌握在自己脑袋里，才是最夯实的。永远要保证自己对问题的理解和解决方案的掌控，而不是完全依赖 AI 的输出。",[25,2547,2548],{},"前几天找来了一些界面设计、产品设计相关的资料，每天还是要安排固定的时间学习才行。",[986,2550,2551],{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}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);}",{"title":41,"searchDepth":180,"depth":180,"links":2553},[2554,2558,2562],{"id":1027,"depth":180,"text":1027,"children":2555},[2556,2557],{"id":1031,"depth":196,"text":1032},{"id":1044,"depth":196,"text":1045},{"id":1057,"depth":180,"text":1057,"children":2559},[2560,2561],{"id":1060,"depth":196,"text":1061},{"id":1122,"depth":196,"text":1122},{"id":2522,"depth":180,"text":2522},"\u002Fblog\u002Fcloudflare-hyperdrive-to-supabase",{"title":1007,"description":1012},{"loc":2566},"\u002Fblog\u002Fcloudflare-hyperdrive-to-supabase\u002Findex.zh-cn",{"id":2568,"artifactId":2569,"backgroundImg":7,"category":2570,"date":2571,"extension":10,"lastmod":7,"listPreviewImg":2572,"meta":2577,"ogImage":2573,"stem":2579,"tags":2580,"__hash__":2585,"title":2586,"body":2587,"description":2591,"lang":560,"navigation":570,"path":2672,"seo":2673,"sitemap":2674,"kind":996,"artifactItem":2676},"article\u002Fblog\u002Fconcert-black-myth-wukong-2026\u002Findex.zh-CN.md","concert-black-myth-wukong","life","2026-06-21",{"url":2573,"alt":2574},"\u002Fimages\u002Fartifacts\u002Fconcert-black-myth-wukong\u002F0.webp",{"en":2575,"zh-CN":2576},"black myth wukong concert","《黑神话:悟空》音乐会",{"artifactId":2569,"lastmod":7,"backgroundImg":7,"ogImage":2573,"listPreviewImg":2578},{"url":2573,"alt":2576},"blog\u002Fconcert-black-myth-wukong-2026\u002Findex.zh-CN",[2581,2582,2583,2584],"concert","video_game","explore_the_world","slow_living","QEL9W7qJMLCRMc9Ge_9gJRsieDbRKIZHNX7txSUXCsQ","音乐会 - 黑神话：悟空 - 随乐西行，且听天命",{"type":22,"value":2588,"toc":2670},[2589,2592,2595,2598,2602,2605,2608,2611,2614,2617,2620,2623,2637,2640,2643,2645,2648,2651,2654,2656,2659,2661],[25,2590,2591],{},"黑猴的音乐会，从去年起我就满心期待。今年终于开到了长沙。",[25,2593,2594],{},"到了现场，看到乌泱泱的人群，我才真切意识到：黑猴的影响力竟如此之大。这个周末长沙排了四场，每天下午和晚上各一场。我买的是周日下午场。领票时，似乎还听到有观众是从外地专程赶来的，恰逢端午，顺便来长沙旅游。",[25,2596,2597],{},"真好，国产游戏正在崛起。这份自豪感，让我对音乐会更添几分期待。",[2599,2600],"blog-style-img-row",{":images":2601},"[{\"src\":\"\u002Fimages\u002Fartifacts\u002Fconcert-black-myth-wukong\u002F1.webp\",\"alt\":\"黑神话:悟空 - 随乐西行，且听天命 户外招牌\"},{\"src\":\"\u002Fimages\u002Fartifacts\u002Fconcert-black-myth-wukong\u002F2.webp\",\"alt\":\"黑神话:悟空 - 随乐西行，且听天命 现场近景\"}]",[25,2603,2604],{},"这次买的是二楼票，没想到视野出奇地好。现场座无虚席，每个人脸上都写着兴奋。等待开场时，是猪八戒的配音演员在介绍流程和注意事项——二师兄一如既往地风趣幽默。等到指挥登台的那一刻，全场爆发出热烈的掌声。",[2599,2606],{":images":2607},"[{\"src\":\"\u002Fimages\u002Fartifacts\u002Fconcert-black-myth-wukong\u002F3.webp\",\"alt\":\"黑神话:悟空 - 随乐西行，且听天命 现场全景\"}]",[25,2609,2610],{},"整个音乐会是按照游戏的章节演绎的，一章一章的推进。把章节里代表性的音乐用交响乐的形式演绎出来，配合着大屏幕上游戏的画面，营造出一种沉浸式的体验。",[25,2612,2613],{},"起初，眼睛还有些忙不过来——一会儿看屏幕，一会儿看指挥，一会儿循着声音去找乐器。但很快便适应了，整个人完全沉浸其中。",[25,2615,2616],{},"上半场的亮点是第二章的陕北说书，原唱亲临现场。他一登台，掌声如雷。琴弦一拨，嗓子一亮，当初玩游戏时的画面瞬间涌回脑海。全场观众跟着节奏摇头晃脑，那种过瘾劲儿，真不是言语能形容的。",[2599,2618],{":images":2619},"[{\"src\":\"\u002Fimages\u002Fartifacts\u002Fconcert-black-myth-wukong\u002F4.webp\",\"alt\":\"黑神话:悟空 - 随乐西行，且听天命 现场演出\"}]",[25,2621,2622],{},"下半场更是高潮迭起。《敢问路在何方》与《云宫讯音》接连奏响，听得人热血翻涌。《敢问路在何方》由两位男歌手现场演唱，把《西游记》特有的史诗感演绎得淋漓尽致。那一瞬间我甚至有些恍惚——从前听这首歌，只想起电视剧的画面；此刻，才真正读懂了它的深意：",[2527,2624,2626,2632],{"status":2625},"warning",[25,2627,2628],{},[2629,2630,2631],"em",{},"敢问路在何方？路在脚下",[25,2633,2634],{},[1079,2635,2636],{},"人生路漫漫，我该走向何方？随心而行，且听天命。",[25,2638,2639],{},"《云宫讯音》则由女歌手献唱，声音清亮悠扬，宛若仙气拂面。主旋律响起时，一股史诗般的使命感扑面而来。内心的情绪翻涌不止，仿佛自己也成了天命人——只不过，踏上的是自己的人生之路。",[25,2641,2642],{},"返场环节，游戏科学放出了新作《黑神话：钟馗》的小曲。相比悟空，风格俏皮了不少，我猜正片里大概有不少黑色幽默。最后一曲是《黑神话：悟空》的主旋律，荡气回肠，余韵悠长。上半场铺垫情绪，踏上征途；下半场层层推进，直至爆发——妙哉，妙哉。",[977,2644],{},[25,2646,2647],{},"中场休息时去领了伴手礼：一本纪念卡册、一枚戒指、一枚徽章、一张卡纸，件件精美。卡册背面有硬纸板支架，可以立起来当摆台。我老婆虽然没有通关游戏，但整场听下来也直呼过瘾。",[2599,2649],{":images":2650},"[{\"src\":\"\u002Fimages\u002Fartifacts\u002Fconcert-black-myth-wukong\u002F5.webp\",\"alt\":\"黑神话:悟空 - 随乐西行，且听天命 伴手礼包装袋\"}]",[2599,2652],{":images":2653},"[{\"src\":\"\u002Fimages\u002Fartifacts\u002Fconcert-black-myth-wukong\u002F6.webp\",\"alt\":\"黑神话:悟空 - 随乐西行，且听天命 伴手礼展示\"}]",[977,2655],{},[2599,2657],{":images":2658},"[{\"src\":\"\u002Fimages\u002Fartifacts\u002Fconcert-black-myth-wukong\u002F7.webp\",\"alt\":\"黑神话:悟空 - 随乐西行，且听天命 制作人冯骥的话\"}]",[977,2660],{},[2527,2662,2665],{"status":2663,"extraClass":2664},"success","text-center",[25,2666,2667],{},[1079,2668,2669],{},"每个人都是自己人生的天命人。愿各位随心而行，且听天命。",{"title":41,"searchDepth":180,"depth":180,"links":2671},[],"\u002Fblog\u002Fconcert-black-myth-wukong-2026",{"title":2586,"description":2591},{"loc":2675},"\u002Fblog\u002Fconcert-black-myth-wukong-2026\u002Findex.zh-cn",{"title":2677,"url":2678,"cover":2573,"type":2581,"rating":2679},"黑神话:悟空 - 随乐西行，且听天命","\u002Fmind-collection?target=concert-black-myth-wukong","9",{"id":2681,"artifactId":7,"backgroundImg":7,"category":2570,"date":2682,"extension":10,"lastmod":7,"listPreviewImg":2683,"meta":2688,"ogImage":2684,"stem":2690,"tags":2691,"__hash__":2692,"title":2693,"body":2694,"description":2698,"lang":560,"navigation":570,"path":2731,"seo":2732,"sitemap":2733,"kind":996,"artifactItem":-1},"article\u002Fblog\u002F20260615-a-dream-about-gaming\u002Findex.zh-CN.md","2026-06-15",{"url":2684,"alt":2685},"\u002Fimages\u002Fillustration\u002F20260615-01.webp",{"en":2686,"zh-CN":2687},"dreaming","梦境",{"artifactId":7,"lastmod":7,"backgroundImg":7,"ogImage":2684,"listPreviewImg":2689},{"url":2684,"alt":2687},"blog\u002F20260615-a-dream-about-gaming\u002Findex.zh-CN",[2686],"MQpUuVNw7AA4Dt6awIQkCbu7U_9MiaM_5l_4ds5Pvn0","做梦",{"type":22,"value":2695,"toc":2729},[2696,2699,2702,2705,2714,2721,2724,2726],[25,2697,2698],{},"昨晚做了一个梦，身临其境。人脑的梦境宛如AI渲染，但是多了一层真实感。醒来后，浑身的紧张感还迟迟未能消退。",[25,2700,2701],{},"我梦见英语角的 Chris 在打游戏，2-3人组队的那种。画面开始就是在一个大桥的地下奔跑，好像 apex 的毒圈来了，子弹也打光了。内心紧张无比，期望不要碰到任何敌人。安全屋就在前方不远处。",[25,2703,2704],{},"跑着跑着右前方扫描出其他其他战队，他们说没有子弹了，举起双手，正在慢慢走出来。就在这时，正右方突然出现了枪声，子弹打到了附近。我们瞬间紧张到极点，更快的提升了奔跑的速度。枪声响了好几下，不知道是打我们还是打别人，但是弹道在附近，我们没受到伤害。",[25,2706,2707,2708,2713],{},"这时候 Chris 突然喊麦：",[163,2709,2712],{"className":2710},[2711],"text-info","This guy is gonna set off a bomb！","一直在重复。画面的左下角，世界频道里出现了一条重武器爆炸的信息，我们的紧张感提到了嗓子眼。双腿摆动又加快一分。刚跑进安全屋，整个画面开始颤抖，一声巨大的爆炸出现在身后。我们赶紧在安全屋拿取各种补给。内心是惊魂未定。",[2514,2715],{"src":2716,"alt":2686,"className":2717,"style":2720,":zoom":2516},"\u002Fimages\u002Fillustration\u002F20260615-02.webp",[2718,2719],"my-4","w-full","object-fit: cover; object-position: center;",[2722,2723],"br",{},[2722,2725],{},[2514,2727],{"src":2684,"alt":2686,"className":2728,"style":2720,":zoom":2516},[2718,2719],{"title":41,"searchDepth":180,"depth":180,"links":2730},[],"\u002Fblog\u002F20260615-a-dream-about-gaming",{"title":2693,"description":2698},{"loc":2734,"images":2735},"\u002Fblog\u002F20260615-a-dream-about-gaming\u002Findex.zh-cn",[2736,2737],{"loc":2716},{"loc":2684},{"id":2739,"artifactId":2740,"backgroundImg":7,"category":2570,"date":2741,"extension":10,"lastmod":7,"listPreviewImg":2742,"meta":2747,"ogImage":7,"stem":2749,"tags":2750,"__hash__":2751,"title":2752,"body":2753,"description":2787,"lang":560,"navigation":570,"path":2788,"seo":2789,"sitemap":2790,"kind":996,"artifactItem":2792},"article\u002Fblog\u002Fvideo-game-hogwarts-legacy\u002Findex.zh-CN.md","game-hogwarts-legacy","2026-06-14",{"url":2743,"alt":2744},"\u002Fimages\u002Fartifacts\u002Fgame-hogwarts-legacy.webp",{"en":2745,"zh-CN":2746},"Hogwarts Legacy game cover","霍格沃兹之遗游戏封面",{"artifactId":2740,"lastmod":7,"backgroundImg":7,"ogImage":7,"listPreviewImg":2748},{"url":2743,"alt":2746},"blog\u002Fvideo-game-hogwarts-legacy\u002Findex.zh-CN",[2582,2584],"ZdEALnQwzv4Es3dWdgqNVmI80LE265jibO2agm57xc0","霍格沃兹之遗通关小记",{"type":22,"value":2754,"toc":2785},[2755,2762,2782],[25,2756,2757,2761],{},[163,2758,2760],{"className":2759},[2711],"拉文克劳的学生前来报到！","最近陆陆续续花了 50 个小时通关了《霍格沃兹之遗》。游戏是 Epic 平台去年圣诞的时候送的。整体上来说还算不错，亲自去霍格沃兹里到处看看还是很神奇的。另外游戏还很好的弥补了看哈利波特电影时，战斗太弱，观感不强的问题。",[1073,2763,2764,2770,2776],{},[49,2765,2766,2769],{},[1079,2767,2768],{},"剧情：6分","，中规中矩，没有太多惊喜的地方。塞巴斯蒂安黑化那里有一些意外，但处理得很僵硬。最终的大决战场面很宏大，让人很热血，但有些过于突出主角了。主角一个五年级的插班生独自干掉了 BOSS 还是太牵强，那怕多几个老师在附近当背景板呢。",[49,2771,2772,2775],{},[1079,2773,2774],{},"战斗：8分","，这个没得黑，比看电影爽太多了。有不同的流派可以自行尝试。后来看攻略才知道，不同的怪还有针对性的打法。不过装备这块有点拉，虽然有一些机制，但是我基本上无脑看数值，根本不讲究搭配也可以玩得很顺畅。",[49,2777,2778,2781],{},[1079,2779,2780],{},"探索：6分","，学校和霍格莫德做得很好，有很多的细节。世界地图上只有主线涉及到的还不错，其他地方就有些凑数了。最主要是 NPC 太僵硬了，没有活人感，让人比较出戏。不像塞尔达旷野之息里面，不同的村子各种不同故事，甚至有专属的 bgm。",[25,2783,2784],{},"通关后搜彩蛋视频才知道，原来不同的学院还有不同的专属任务！好家伙，这不得再去看看。二周目可以尝试下各种各样的 mod。我看社区里，有好多服装，额外的咒语，感觉还能玩 20 小时，哈哈哈，再次感谢 Epic。",{"title":41,"searchDepth":180,"depth":180,"links":2786},[],"拉文克劳的学生前来报到！最近陆陆续续花了 50 个小时通关了《霍格沃兹之遗》。游戏是 Epic 平台去年圣诞的时候送的。整体上来说还算不错，亲自去霍格沃兹里到处看看还是很神奇的。另外游戏还很好的弥补了看哈利波特电影时，战斗太弱，观感不强的问题。","\u002Fblog\u002Fvideo-game-hogwarts-legacy",{"title":2752,"description":2787},{"loc":2791},"\u002Fblog\u002Fvideo-game-hogwarts-legacy\u002Findex.zh-cn",{"title":2793,"url":2794,"cover":2743,"type":2795,"rating":2796},"霍格沃兹之遗","\u002Fmind-collection?target=game-hogwarts-legacy","game","7",{"id":2798,"artifactId":2799,"backgroundImg":7,"category":2570,"date":2800,"extension":10,"lastmod":7,"listPreviewImg":2801,"meta":2806,"ogImage":7,"stem":2808,"tags":2809,"__hash__":2811,"title":2812,"body":2813,"description":2849,"lang":560,"navigation":570,"path":2850,"seo":2851,"sitemap":2852,"kind":996,"artifactItem":2854},"article\u002Fblog\u002Freading-blindness-human-nature-and-order\u002Findex.zh-CN.md","book-blindness","2026-06-12",{"url":2802,"alt":2803},"\u002Fimages\u002Fartifacts\u002FEnsaio sobre a Cegueira-1.webp",{"en":2804,"zh-CN":2805},"Blindness book cover","失明症漫记封面",{"artifactId":2799,"lastmod":7,"backgroundImg":7,"ogImage":7,"listPreviewImg":2807},{"url":2802,"alt":2805},"blog\u002Freading-blindness-human-nature-and-order\u002Findex.zh-CN",[2810],"reading","5_IaYt5OnrLZynBFXF-GKHj7iTjpAlet12mJBmI8oKU","读《失明症漫记》：在压抑与混乱中思考人性和秩序",{"type":22,"value":2814,"toc":2847},[2815,2826,2829,2832,2835,2838,2841,2844],[25,2816,2817,2818,2825],{},"昨天看完了 ",[2819,2820,2824],"a",{"href":2821,"rel":2822},"https:\u002F\u002Fbook.douban.com\u002Fsubject\u002F20428302\u002F",[2823],"nofollow","《失明症漫记》","。看完后第一感觉是：压抑，然后有点莫名其妙。",[25,2827,2828],{},"压抑很明显，因为作者刻意描写人性之恶。在人们都看不见的世界里，人性的黑暗被放大到了极致。再也没有组织和秩序，只有混乱和恐惧。我生活在和平以及集体教育为主的环境里，读到那样的场面真的当人感到害怕。",[25,2830,2831],{},"莫名其妙是因为疑惑：为什么没有人站出来，为什么大家不能组织起来。跟 AI 探讨一番才知，这就是作者想表达的：在人们看不见的世界里，猜忌和自私会无限放大，让人们组织不起来，作者通过描写苦难来警醒世人。",[25,2833,2834],{},"如果要我想象一个大家逐渐失明的世界，可能会是：文明和秩序一开始是混乱，然后猜忌和冲突蔓延，随后有人、有组织站了出来承担了领头的责任，最终大家克服各种艰难，暂时有序且尽可能体面地生存着。",[25,2836,2837],{},"我也问了 AI，假设人类都失明后，还有可能恢复文明的巅峰吗？AI 的回答是不可能，因为当前的文明科技体系是极端依赖视力的。各种生产没有了视力是无法恢复的。",[25,2839,2840],{},"读这样的书，是没法像《太白金星有点烦》那样酣畅淋漓又幽默有趣的。虽然两者都有讽刺和思考，但完全是不同的路子，用不同的方式和角度刺激读者的思想。",[25,2842,2843],{},"通过看评论我知道了《失明症漫记》还有续集《复明症漫记》，不过我暂时是不想看了，我要缓一缓。",[2599,2845],{":images":2846},"[{\"src\":\"\u002Fimages\u002Fartifacts\u002FEnsaio sobre a Cegueira-1.webp\",\"alt\":\"失明症漫记封面\"},{\"src\":\"\u002Fimages\u002Fartifacts\u002FEnsaio sobre a Cegueira-2.webp\",\"alt\":\"失明症漫记封底\"}]",{"title":41,"searchDepth":180,"depth":180,"links":2848},[],"记录读完《失明症漫记》后的复杂感受：压抑、疑惑，以及对人性、组织与文明恢复可能性的思考。","\u002Fblog\u002Freading-blindness-human-nature-and-order",{"title":2812,"description":2849},{"loc":2853},"\u002Fblog\u002Freading-blindness-human-nature-and-order\u002Findex.zh-cn",{"title":2855,"url":2856,"cover":2802,"type":2857,"rating":2858},"失明症漫记","\u002Fmind-collection?target=book-blindness","book","8",{"id":2860,"artifactId":2861,"backgroundImg":7,"category":2570,"date":2862,"extension":10,"lastmod":7,"listPreviewImg":2863,"meta":2868,"ogImage":7,"stem":2870,"tags":2871,"__hash__":2873,"title":2874,"body":2875,"description":2891,"lang":560,"navigation":570,"path":2892,"seo":2893,"sitemap":2894,"kind":996,"artifactItem":2896},"article\u002Fblog\u002Fharry-potter-eastern-vs-western-magic\u002Findex.zh-CN.md","movie-harry-potter","2026-06-11",{"url":2864,"alt":2865},"\u002Fimages\u002Fartifacts\u002Fmovie-harry-potter.webp",{"en":2866,"zh-CN":2867},"Harry Potter movie cover","哈利波特电影封面",{"artifactId":2861,"lastmod":7,"backgroundImg":7,"ogImage":7,"listPreviewImg":2869},{"url":2864,"alt":2867},"blog\u002Fharry-potter-eastern-vs-western-magic\u002Findex.zh-CN",[2872],"movie","8PLvIGk3HEnAZAqoCBPGeMv-ZzfLPCstj71VTp8e9ps","哈利波特电影简评：东西方魔法体系的差异感受",{"type":22,"value":2876,"toc":2889},[2877,2880,2883,2886],[25,2878,2879],{},"最近打完了霍格沃兹之遗，想着把哈利波特电影都过一遍。花了几天的时间刷完了。其实我一直觉得哈利波特的系列电影有哪里不对劲，虽然是魔法世界，很奇妙，但是对我的吸引力不够强。这次看完总算搞明白了。对比《凡人修仙传》的话很明显，不够吸引我的原因就是东西方魔法的巨大差异。",[25,2881,2882],{},"西方的魔法世界，重在\"玄妙\"，魔法就这样奇迹般的发生了，一切尽在不言中。而东方的魔法会更成体系，甚至有明确的等级划分：从练气直到道祖，魔力多少、技能相克什么的很明确，而且咱们的修仙除了放魔法，最亮眼的是有武术的底蕴。战斗这一块，东方的修仙者们从\"实用\"和\"炫酷\"的角度来说，都要碾压西方魔法。",[25,2884,2885],{},"所以总结来说，哈利波特的电影是可看的，西方魔法世界的经典作品。但是电影呈现出来的魔法是不够成体系的，更多的是为故事服务。如果期待看魔法 PK，炫酷的战斗，多半是会失望的。",[25,2887,2888],{},"据说哈利波特的原书会有更多的魔法细节和体系。等我看完手边几本书，找来看看，也顺便提升下英文的阅读能力。说到原书我忽然想起，哈利波特系列好像是儿童文学？尤其是前几部。这种\"玄妙\"\"离奇\"发生的魔法，好像就能解释得通了。毕竟小孩子才不管那么多，只要足够神奇，充满想象就能看得很欢乐了。最近我给 Evan 也看了一点，他马上迷上了，要我教他念魔法咒语，哈哈哈。",{"title":41,"searchDepth":180,"depth":180,"links":2890},[],"刷完《霍格沃兹之遗》和哈利波特系列电影后，我对东西方魔法体系差异的一些观感与思考。","\u002Fblog\u002Fharry-potter-eastern-vs-western-magic",{"title":2874,"description":2891},{"loc":2895},"\u002Fblog\u002Fharry-potter-eastern-vs-western-magic\u002Findex.zh-cn",{"title":2897,"url":2898,"cover":2864,"type":2872,"rating":2899},"哈利波特系列","\u002Fmind-collection?target=movie-harry-potter","6",{"id":2901,"artifactId":7,"backgroundImg":7,"category":2570,"date":2902,"extension":10,"lastmod":7,"listPreviewImg":7,"meta":2903,"ogImage":7,"stem":2904,"tags":2905,"__hash__":2909,"title":2910,"body":2911,"description":2988,"lang":560,"navigation":570,"path":2989,"seo":2990,"sitemap":2991,"kind":996,"artifactItem":-1},"article\u002Fblog\u002Fafter-school-cycling-adventures-with-evan\u002Findex.zh-CN.md","2026-06-10",{"artifactId":7,"lastmod":7,"backgroundImg":7,"ogImage":7,"listPreviewImg":-1},"blog\u002Fafter-school-cycling-adventures-with-evan\u002Findex.zh-CN",[2584,2906,2907,2583,2908],"after_school","cycling","parenting","AFaOzSep6WjviYJg-2pNnFMo2OHxf_YIrQLwMEC6qlA","和 Evan 骑行探路",{"type":22,"value":2912,"toc":2986},[2913,2916,2919,2939,2942,2945,2947,2950,2953,2962,2968,2977],[25,2914,2915],{},"最近跟 Evan 解锁了一个新的活动：骑共享单车压马路。我们专门走不同的路、没有去过的路，像游戏里探索世界一样，带着一颗好奇心四处探索，点亮未知的区域。",[25,2917,2918],{},"每次骑行都会有新的发现和惊喜：",[1073,2920,2921,2924,2927,2930,2933,2936],{},[49,2922,2923],{},"\"噢！原来是这里\"。",[49,2925,2926],{},"\"噢！原来这里跟那里是连着的\"。",[49,2928,2929],{},"\"哇，这个地方不错，我们停下来去拍照吧！\"",[49,2931,2932],{},"\"这里好多人钓鱼欸，回去后可以告诉爷爷\"。",[49,2934,2935],{},"\"原来江边有好多适合露营的地方，开车过来根本找不到\"。",[49,2937,2938],{},"\"骑行真是太好玩了！\"",[25,2940,2941],{},"这便是带娃的好处之一，为了把原本无聊的时间变成共同的快乐记忆，你会不由自主地绞尽脑汁。",[25,2943,2944],{},"这种不看导航，不看时间，骑到哪算哪的随心随意，是一种最纯粹和原始的快乐。今晚和 Evan 去探索哪一个板块好呢？",[977,2946],{},[25,2948,2949],{},"DeepSeek 写的诗",[25,2951,2952],{},"《骑行》",[25,2954,2955,2956,2958,2959,2961],{},"世界是一本没翻完的书",[2722,2957],{},"\n我们骑车",[2722,2960],{},"\n一页页去读",[25,2963,2964,2965,2967],{},"拐弯，猜测",[2722,2966],{},"\n下一个段落",[25,2969,2970,2971,2973,2974,2976],{},"\"哦，原来你在这里\"",[2722,2972],{},"\n路与路",[2722,2975],{},"\n悄悄握手",[25,2978,2979,2980,2982,2983,2985],{},"慢一点",[2722,2981],{},"\n让迷路",[2722,2984],{},"\n成为唯一的出路",{"title":41,"searchDepth":180,"depth":180,"links":2987},[],"记录我和 Evan 骑共享单车探索城市陌生道路的日常，以及这种不看导航、不赶时间的纯粹快乐。","\u002Fblog\u002Fafter-school-cycling-adventures-with-evan",{"title":2910,"description":2988},{"loc":2992},"\u002Fblog\u002Fafter-school-cycling-adventures-with-evan\u002Findex.zh-cn",{"id":2994,"artifactId":7,"backgroundImg":7,"category":2570,"date":2995,"extension":10,"lastmod":7,"listPreviewImg":2996,"meta":3001,"ogImage":2997,"stem":3003,"tags":3004,"__hash__":3009,"title":3010,"body":3011,"description":3429,"lang":560,"navigation":570,"path":3430,"seo":3431,"sitemap":3432,"kind":996,"artifactItem":-1},"article\u002Fblog\u002Fa-letter-to-evan-education-and-growth-2026\u002Findex.zh-CN.md","2026-05-16",{"url":2997,"alt":2998},"\u002Fimages\u002Fillustration\u002Fevan-closed-loop-parenting-framework.webp",{"en":2999,"zh-CN":3000},"evan closed loop parenting framework","埃文闭环育儿框架",{"artifactId":7,"lastmod":7,"backgroundImg":7,"ogImage":2997,"listPreviewImg":3002},{"url":2997,"alt":3000},"blog\u002Fa-letter-to-evan-education-and-growth-2026\u002Findex.zh-CN",[2908,3005,3006,3007,3008],"parenting_philosophy","letter_to_my_son","only_child_family","lifelong_learning","iLKDSQ7v8ZZEp0_229EGwA9e6cVKA_0OS35wScRqrqM","写给 Evan：小学前的人生寄语，不内卷的家庭教育思考",{"type":22,"value":3012,"toc":3415},[3013,3016,3018,3022,3025,3028,3031,3040,3043,3046,3049,3056,3060,3063,3066,3069,3076,3079,3085,3088,3091,3095,3098,3102,3110,3113,3124,3131,3135,3138,3141,3169,3176,3179,3183,3186,3200,3211,3213,3217,3220,3227,3234,3241,3245,3253,3256,3266,3269,3272,3283,3295,3305,3309,3315,3318,3321,3328,3341,3345,3348,3351,3354,3373,3376,3380,3383,3386,3389,3392,3406],[25,3014,3015],{},"夜深人静，你睡得很安稳。我坐在书桌前，忽然意识到，一晃六年就这么过去了。你马上要幼儿园毕业，下半年，就要背着小书包，踏入小学，开启一段全新的旅程。在这个节点，我想安静地写点什么。我知道你现在还认不全这些字，没关系，这封信我会一直存在我的博客里，就像一个飘在时间长河里的漂流瓶，等你长大到能读懂它的那天，再亲手捞起它。",[977,3017],{},[145,3019,3021],{"id":3020},"to-evan","To Evan:",[25,3023,3024],{},"Evan，你知道吗？你来到这个世界，对我们全家来说，是一场温柔又彻底的改变。",[25,3026,3027],{},"坦白讲，你的到来，让爸爸妈妈失去了很多“属于自己”的时间。睡不成整觉、不能随意出门、想安静看会儿书都变成奢侈。我们偶尔也会疲惫，也会小声抱怨，但只要看到你笑、看到你扑进怀里、看到你一点点长大，那些抱怨就像风吹散的云，一下子就不见了。",[25,3029,3030],{},"陪伴你的这六年，我们收获的不是辛苦，而是一种从未体验过的快乐、柔软与责任。也是因为你，我们才真正学会怎样做父母，怎样变得更成熟、更稳重、更像一个能撑起家的大人。",[25,3032,3033,3034,3039],{},"看着你从一个连翻身都不会的小不点，长成现在这样能跑能跳、爱笑爱闹、像风一样的小男孩，我心里常常一阵恍惚。",[1079,3035,3038],{"className":3036},[3037],"text-warning","时间真的很神奇，它不声不响，却把一切都悄悄变了模样","。尤其是上幼儿园之后，你的语言、行为、情绪、思维，几乎是一天一个样。我们也跟着你一起“升级”，不断调整教育方式，不断重新认识你。",[25,3041,3042],{},"虽然咱们爷俩经常为了“能不能吃一个冰淇淋”、“能不能再玩五分钟游戏”这种关乎人生尊严的小事斗智斗勇，但每次这种思维的碰撞，对我来说都是一次有趣的挑战。我从不觉得这是麻烦。每一次思维碰撞，每一次你坚持自己的想法，都是你在长大、在独立、在形成自我。",[25,3044,3045],{},"最让我惊喜和欣慰的，是你最近的改变。",[25,3047,3048],{},"以前做错事，你会生气、会辩解、会把责任推给别人，注意力全在“爸爸妈妈凶不凶”，而不在事情本身。但最近，你开始愿意承认自己错了，会主动道歉，会平静下来听我们说话。",[25,3050,3051,3052,1109],{},"这个小小的转变，在我们心里，分量很重。它让我们确信：",[1079,3053,3055],{"className":3054},[2711],"一直以来，我们的耐心、陪伴、沟通，没有白费",[145,3057,3059],{"id":3058},"关于教育我们选择的是一条不拥挤但很用心的路","关于教育：我们选择的，是一条不拥挤、但很用心的路",[25,3061,3062],{},"很快你就要上小学了，“教育”这两个字，会越来越频繁地出现在我们的生活里。",[25,3064,3065],{},"我想很认真地告诉你：我们对你的教育，一直比较“佛系”。\n整个幼儿园，我们没有给你报过任何课外班。\n这不是不重视，恰恰相反，是因为我们太重视。",[25,3067,3068],{},"在我们的观念里，最好的教育，从来不是补习班堆出来的，也不是花钱就能买到的。再好的老师，也替代不了家庭的陪伴；再贵的课程，也比不上父母言传身教的力量。所以，除非是你真心热爱、我们又无法教给你的东西，否则，我们宁愿自己多花时间、多花心思，陪着你一点点长大。",[25,3070,3071,3072,1109],{},"说到陪伴，我可以很自豪地说：",[1079,3073,3075],{"className":3074},[2711],"我们做得真的不错",[25,3077,3078],{},"你需要玩伴，我们就放下手里的事陪你玩；你好奇提问，我们就认真回答；你情绪不好，我们就接住你的委屈。在玩中教你知识，在聊天中传递价值观，在陪伴里给你安全感。久而久之，你喜欢和我们待在一起，甚至和别的小朋友一起玩时，他们也愿意跟着我们。",[25,3080,3081,1109],{},[1079,3082,3084],{"className":3083},[2711],"你把我们锻炼成了“顶级陪玩父母”，想想也是挺有趣",[25,3086,3087],{},"也正因如此，我们做了一个很郑重的决定：我们大概率，不会再给你生弟弟或妹妹了。",[25,3089,3090],{},"我们想把所有的时间、精力、耐心、陪伴，完完整整地给你一个人，让你从小浸泡在充足、稳定、不被分割的爱里长大。爱不是均分，而是足够。",[145,3092,3094],{"id":3093},"我们的教育理念今天写下来未来一起检验","我们的教育理念，今天写下来，未来一起检验",[25,3096,3097],{},"关于你上学这件事，我想把我们最核心的想法，清清楚楚写在这里。既是警醒我们自己，也是等你长大以后，回头看看，我们是否做到了。",[1029,3099,3101],{"id":3100},"一最好的教育是耳濡目染","一、最好的教育，是耳濡目染",[25,3103,3104,3105,3109],{},"我们始终相信：",[1079,3106,3108],{"className":3107},[3037],"父母是什么样，孩子就会长成什么样。","\n与其逼你努力，不如我们自己先努力；与其对你“内卷”，不如我们自己先成长。",[25,3111,3112],{},"所以你会看到：",[1073,3114,3115,3118,3121],{},[49,3116,3117],{},"爸爸放弃高薪的工作，选择自由职业，不是任性，而是想活成自己喜欢的样子，也想让你知道：人生不只打工一条路。",[49,3119,3120],{},"妈妈在职场认真打拼，也坚持看书、学习、考证，从不停下成长。",[49,3122,3123],{},"我们不算书虫，但愿意阅读、愿意去图书馆、愿意持续学习新知识。",[25,3125,3126,3127],{},"我们想让你明白：",[1079,3128,3130],{"className":3129},[2711],"学习不是学生时代的任务，而是一辈子的事。真正的优秀，不是被逼出来的，是被环境影响、被榜样带动、被热爱驱动的。",[1029,3132,3134],{"id":3133},"二分数只是表象内在驱动力才是根本","二、分数只是表象，内在驱动力才是根本",[25,3136,3137],{},"长远来看，我们并不执着于你必须考高分、拿排名。分数只是结果，是表象，不是目的。",[25,3139,3140],{},"我们更在意的，是这几件事：",[1073,3142,3143,3150,3158,3166],{},[49,3144,3145,3146],{},"你是否拥有",[1079,3147,3149],{"className":3148},[3037],"自驱力",[49,3151,3152,3153,3157],{},"你是否具备",[1079,3154,3156],{"className":3155},[3037],"独立思考","的能力",[49,3159,3160,3161,3165],{},"你是否对",[1079,3162,3164],{"className":3163},[3037],"知识本身","抱有好奇",[49,3167,3168],{},"你是否不会因为迎合别人，而丢失自己",[25,3170,3171,3172,1109],{},"我们会尽全力保护你的天马行空、你的与众不同、甚至你的“小叛逆”。我们不想把你培养成一个只会服从命令、只会满足别人期待的孩子。",[1079,3173,3175],{"className":3174},[2711],"原始的生命力很珍贵，只要引导到正确的地方，就会变成巨大的能量",[25,3177,3178],{},"我一直相信：当一个人真正体会到知识的魅力，感受到世界被知识一点点构建出来的美妙，分数自然会水到渠成。",[1029,3180,3182],{"id":3181},"三你不是一个人在学习是全家陪你一起学习","三、你不是一个人在学习，是全家陪你一起学习",[25,3184,3185],{},"等你上了小学，我们不会站在旁边“监督”你，而是会和你一起重新走一遍学习之路。",[1073,3187,3188,3191,3194,3197],{},[49,3189,3190],{},"你学历史，我们就陪你聊历史；",[49,3192,3193],{},"你学地理，我们就陪你看地图；",[49,3195,3196],{},"你学古诗，我们就尽量带你去看一看诗里写的地方；",[49,3198,3199],{},"我们一起去看庐山真面目，去听两岸猿声啼不住，去感受悠然见南山的心境",[25,3201,3202,3203,3207,3208,1109],{},"别人家里可能是“鸡飞狗跳”，我却对我们的未来很有信心。\n",[1079,3204,3206],{"className":3205},[2711],"我们一起成长的情绪管理、沟通方式、耐心与理解，不会让学习变成战场。","\n也正因这份期待，我们更确定：",[1079,3209,3210],{},"所有精力，只够好好陪伴你一个",[977,3212],{},[145,3214,3216],{"id":3215},"如果将来你问为什么我没有兄弟姐妹","如果将来你问：为什么我没有兄弟姐妹？",[25,3218,3219],{},"我想提前把答案告诉你。",[25,3221,3222,3223,3226],{},"第一，是",[1079,3224,3225],{},"时间与精力不可复制","。\n爸爸妈妈只有一双，一天只有24小时。多一个孩子，就必然分走一半陪伴。钱可以解决很多问题，但陪伴不能。我们不想让你在“被分摊”的爱里长大。",[25,3228,3229,3230,3233],{},"第二，",[1079,3231,3232],{},"兄弟姐妹不是人生的必需品","。\n有兄弟姐妹，未必就是助力；争吵、疏远、反目，也很常见。真正可靠的关系，不是血缘，是真心换真心。你未来一定能遇到志同道合的朋友，甚至能拥有胜似亲人的伙伴。",[25,3235,3236,3237,1109],{},"人际关系是一门大课，有人依赖，有人淡然，没有高低对错。\n你未来想活成什么样子，由你自己选。\n",[1079,3238,3240],{"className":3239},[2711],"有没有兄弟姐妹，都不影响你拥有温暖、支持、有深度的人生",[145,3242,3244],{"id":3243},"关于读书工作与人生我们希望你更早找到自己的路","关于读书、工作与人生：我们希望你更早找到自己的路",[25,3246,3247,3248,1109],{},"爸爸妈妈都经历过完整的读书、升学、就业之路。\n我们那一代被教育：考好大学=有好工作=人生稳了。\n可真正走过来才明白：",[1079,3249,3252],{"className":3250},[3251],"text-error","世界不是这样的",[25,3254,3255],{},"尤其在今天这个时代，文凭越来越薄，道路越来越多。\n所以我们对你的教育目标，和大多数家庭不一样：",[3257,3258,3259],"blockquote",{},[25,3260,3261,3262,3265],{},"我们不把“考大学”当作终点。我们希望你从小学开始，就慢慢接触",[1079,3263,3264],{},"真实的职业世界","。了解不同职业需要什么能力、什么知识、什么热爱，让你在读书阶段，就慢慢找到自己喜欢什么、适合什么、未来想成为谁。",[25,3267,3268],{},"我们的目标是：\n在你初中结束时，就能拥有一个相对清晰的职业方向。\n然后再一起决定：读不读高中、选什么科、上什么学、走什么路。\n这些选择，不该由我们替你拍板，而要由你自己判断。",[25,3270,3271],{},"在我们眼里，教育的根本不是一张文凭，而是这三件事：",[1073,3273,3274,3277,3280],{},[49,3275,3276],{},"学会社会生存的基本知识",[49,3278,3279],{},"学会自力更生的能力",[49,3281,3282],{},"学会度过有意义、有幸福感的一生",[25,3284,3285,3286,3290,3291,1109],{},"而我们眼中“有意义的一生”也很简单：\n",[1079,3287,3289],{"className":3288},[2711],"做自己热爱的工作，拥有深度真诚的人际关系。","\n这也是我们现在对自己的要求。\n爸爸敢离开高薪、做自己喜欢的事，就是想以身作则：",[1079,3292,3294],{"className":3293},[3251],"我们做不到的，绝不要求你",[3296,3297],"nuxt-img",{"alt":2999,"className":3298,"fit":3304,"src":2997},[3299,3300,3301,3302,3303],"mx-auto","mt-10","mb-10","rounded-lg","object-cover","cover",[145,3306,3308],{"id":3307},"人生很长容错率比你想象的更高","人生很长，容错率比你想象的更高",[25,3310,3311,3312,1109],{},"这个世界总有人告诉你：\n",[2629,3313,3314],{},"要趁早、要抓紧、要领先、要赢在起跑线上",[25,3316,3317],{},"但爸爸想告诉你：人生不是短跑。\n很多事，没有“必须”“一定”“唯一”。",[25,3319,3320],{},"就像学英语，有人幼儿园开始，有人小学开始，有人成年才学，只要方法对、肯用心，最终都能掌握。\n人生大多数事情都是如此。",[25,3322,3323,3324,3327],{},"出名要趁早也好，大器晚成也好，听听就好，不必全信。\n我们对你唯一的硬性要求，只有",[1079,3325,3326],{},"完成义务教育","。\n剩下的，都是选择。",[25,3329,3330,3331,3335,3336,3340],{},"我们想教给你的，不是“走哪条路”，\n而是“",[1079,3332,3334],{"className":3333},[3251],"如何选择、如何判断、如何为自己负责","”。\n我们希望你",[1079,3337,3339],{"className":3338},[2711],"做自己人生的探索者，而不是被动的执行者","。\n独立的人生，从小学就该开始，而不是等到大学、等到工作以后。",[145,3342,3344],{"id":3343},"什么才是教育成功","什么才是“教育成功”？",[25,3346,3347],{},"身边很多家庭，都有不同的教育方式。\n我们也会迷茫、会反思、会自我怀疑：\n我们这样是不是太松？是不是应该逼一逼？是不是应该多给压力？",[25,3349,3350],{},"后来我们慢慢想明白了：\n没有绝对正确的教育，只有适合自己孩子的教育。",[25,3352,3353],{},"对我们来说，判断“对不对”的标准很简单：",[1073,3355,3356,3362,3368],{},[49,3357,3358,3359],{},"你是否",[1079,3360,3361],{},"开心、健康、独立",[49,3363,3364,3365],{},"你是否能和我们",[1079,3366,3367],{},"坦诚相处、像朋友一样",[49,3369,3145,3370],{},[1079,3371,3372],{},"感受幸福的能力",[25,3374,3375],{},"至于未来成多大才、挣多少钱，真的不是最重要。\n我们自己也只是普通人，过着比上不足、比下有余、知足常乐的小日子。\n我们只希望你长大后，也能拥有这样平静、踏实、愉悦的人生。",[145,3377,3379],{"id":3378},"尾声这封信是时光的礼物","尾声：这封信，是时光的礼物",[25,3381,3382],{},"Evan，我不知道你在几岁、什么心境下读到这封信。\n但我相信，不同年龄，你会读出完全不同的感受。",[25,3384,3385],{},"爸爸写公众号、拍视频、记录生活，一方面是喜欢，另一方面，也是想给你多留下一些痕迹。等你真正长大，你可以看到：爸爸在不同年龄段想什么、做什么、为什么选择、怎样坚持、如何面对迷茫与热爱。",[25,3387,3388],{},"等我将来不在这个世界了（虽然现在说这个还早得很，哈哈），这些文字、这些记录，也能换一种方式陪着你。",[25,3390,3391],{},"最后，我想对你说：",[1073,3393,3394,3397,3400,3403],{},[49,3395,3396],{},"谢谢你，愿意做我们的孩子。",[49,3398,3399],{},"谢谢你，让我们成为更好的自己。",[49,3401,3402],{},"未来的路，我们不急，慢慢走。",[49,3404,3405],{},"你只管大胆向前，我们永远在你身后。",[25,3407,3408],{},[1079,3409,3414],{"className":3410,"style":3413},[3411,3412],"block","text-right","margin-top: 50px","爱你的老爸",{"title":41,"searchDepth":180,"depth":180,"links":3416},[3417,3418,3419,3424,3425,3426,3427,3428],{"id":3020,"depth":180,"text":3021},{"id":3058,"depth":180,"text":3059},{"id":3093,"depth":180,"text":3094,"children":3420},[3421,3422,3423],{"id":3100,"depth":196,"text":3101},{"id":3133,"depth":196,"text":3134},{"id":3181,"depth":196,"text":3182},{"id":3215,"depth":180,"text":3216},{"id":3243,"depth":180,"text":3244},{"id":3307,"depth":180,"text":3308},{"id":3343,"depth":180,"text":3344},{"id":3378,"depth":180,"text":3379},"这不仅是给 6 岁儿子 Evan 的毕业寄语，也是一个正在经历职业转型的父亲，对未来十年教育、职业和人生意义的深度反思。愿这些文字能成为他成长路上的‘外挂’，也送给每一位在时代浪潮中努力前行的父母。","\u002Fblog\u002Fa-letter-to-evan-education-and-growth-2026",{"title":3010,"description":3429},{"loc":3433,"images":3434},"\u002Fblog\u002Fa-letter-to-evan-education-and-growth-2026\u002Findex.zh-cn",[3435],{"loc":2997},{"id":3437,"artifactId":7,"backgroundImg":3438,"category":8,"date":3439,"extension":10,"lastmod":7,"listPreviewImg":3440,"meta":3444,"ogImage":3438,"stem":3446,"tags":3447,"__hash__":3452,"title":3453,"body":3454,"description":3708,"lang":560,"navigation":570,"path":3709,"seo":3710,"sitemap":3711,"kind":996,"artifactItem":-1},"article\u002Fblog\u002Fai-assisted-fullstack-workflow-and-developer-growth\u002Findex.zh-CN.md","\u002Fimages\u002Fblog-bg\u002Fkevin-ku-w7ZyuGYNpRQ-unsplash.webp","2026-03-10",{"url":3438,"alt":3441},{"en":3442,"zh-CN":3443},"coding kevin-ku-w7ZyuGYNpRQ-unsplash","编程 kevin-ku-w7ZyuGYNpRQ-unsplash",{"artifactId":7,"lastmod":7,"backgroundImg":3438,"ogImage":3438,"listPreviewImg":3445},{"url":3438,"alt":3443},"blog\u002Fai-assisted-fullstack-workflow-and-developer-growth\u002Findex.zh-CN",[3448,3449,3450,3451],"freelancing","productivity","personal_growth","ai","VBP6YqCRuAtfjVLNRbs7zUKt1RBSJGPHb5Esb-ALB-c","久违的开发心流：我在 AI 时代找回了技术热忱",{"type":22,"value":3455,"toc":3698},[3456,3464,3467,3471,3474,3481,3489,3497,3511,3514,3519,3526,3529,3531,3535,3538,3552,3556,3563,3567,3574,3581,3594,3598,3605,3612,3614,3618,3621,3624,3634,3642,3644,3648,3651,3654,3665,3672,3675,3682,3690],[25,3457,3458,3459,3463],{},"在这个快节奏的时代，能让人 ",[1079,3460,3462],{"className":3461},[2711],"“废寝忘食”","的东西不多了。对我来说，上一次这种感觉可能还要追溯到大学里第一次折腾 Linux 系统，对着黑漆漆的屏幕敲下一串命令，看它一行行跑代码，那种“掌控感”能让人忘记窗外天色已晚。",[25,3465,3466],{},"春节过后的这两周，这种感觉奇迹般地回来了。",[145,3468,3470],{"id":3469},"_1-这种心流久违了","1. 这种“心流”，久违了",[25,3472,3473],{},"从正月初八到现在，我几乎处于一种“连轴转”的开发状态。每天睁眼的第一件事就是打开电脑，晚上迟迟舍不得合上盖子，甚至连做梦都在构思代码的架构。",[25,3475,3476,3477,1109],{},"这种心流状态甚至蔓延到了生活琐事里。陪娃玩耍的间隙，我也会忍不住溜回屏幕前，跟 AI 聊上几句，修正一下正在执行的任务。太太看我的眼神，大概就像看一个被屏幕“绑架”了的中年大叔。但我心里明白，",[1079,3478,3480],{"className":3479},[3037],"那不是沉迷，而是一种久违的、单纯的对创造的渴望",[25,3482,3483,3484,3488],{},"坦白说，作为一名做了十年的前端开发，我以前对“全栈”这件事是有畏难情绪的。一想到要重新去啃后端那一套复杂的生态，就觉得像是在武侠小说里要 ",[1079,3485,3487],{"className":3486},[3251],"“散去全身功力重新修炼”","，还没等开始，气就先泄了一半。",[25,3490,3491,3492,3496],{},"但现在，AI 就像是给我装上了一套 ",[1079,3493,3495],{"className":3494},[2711],"“思维外骨骼”","。那些以前一个人搞不定的逻辑、不敢碰的领域，现在可以大着胆子去尝试、去执行。",[25,3498,3499,3500,1109],{},"很多人担心 AI 会取代程序员，我也曾有过这种焦虑。但当真正深入使用后，我反而觉得未来会越来越好。AI 就像当年的编译器或搜索引擎一样，它只是大大降低了“执行”的门槛。",[163,3501,3503,3504,3507,3508],{"className":3502},[3037],"它能代替一个优秀的执行者，但永远无法替代一个人的",[1079,3505,3506],{},"主观审美","和",[1079,3509,3510],{},"故事灵魂",[25,3512,3513],{},"正如亚马逊 CEO 贝索斯说过的：",[3257,3515,3516],{},[25,3517,3518],{},"我经常被问“未来十年什么会变”，但几乎没人问“未来十年什么不会变”。我认为第二个问题更重要，因为你可以围绕那些不变的东西来建立战略。",[25,3520,3521,3522,3525],{},"对我而言，未来十年不会变的，始终是",[1079,3523,3524],{},"我想成为什么样的人、过什么样的生活、创造什么样的东西","。AI 负责跑腿，而我负责定义方向。",[25,3527,3528],{},"甚至我还在想，等以后 AI 视频工具更亲民了，我想拍一部自己的短片。前两天跟 AI 练英语聊到电影，我突然脑洞大开：如果用赛博朋克风来重写《西游记》会怎样？为什么修仙和魔法非要待在古代呢？这种灵感的碰撞，才是作为“人”最有趣的地方。",[977,3530],{},[145,3532,3534],{"id":3533},"_2-我的单人开发超级工作流","2. 我的“单人开发”超级工作流",[25,3536,3537],{},"这两周之所以能维持高效，很大程度上是因为我摸索出了一套顺滑的工作流。如果你也想尝试独立开发，希望这段分享能让你少走弯路。",[25,3539,3540,3541,3507,3544,3547,3548,1109],{},"作为一个前端，我的短板很明显：",[1079,3542,3543],{},"视觉设计",[1079,3545,3546],{},"后端架构","。但我现在的流程已经打通了：",[1079,3549,3551],{"className":3550},[2711],"功能设计 -> 页面视觉 -> 代码架构 -> 开发微调",[1029,3553,3555],{"id":3554},"第一阶段功能与架构的头脑风暴","第一阶段：功能与架构的“头脑风暴”",[25,3557,3558,3559,3562],{},"这个阶段我主要用 ",[1079,3560,3561],{},"Gemini","。它像是一个博学的架构师，当我拿不定主意时，它会对比分析各种方案的优劣。\n比如这次项目，我参考了它的建议：使用 Nuxt.js 全栈开发，利用 layer 功能做客户端分割。如果靠我自己去啃那厚如字典的文档，估计个把星期就过去了。",[1029,3564,3566],{"id":3565},"第二阶段从视觉到技术文档的打通","第二阶段：从视觉到技术文档的“打通”",[25,3568,3569,3570,3573],{},"我使用了谷歌家的 ",[1079,3571,3572],{},"Stitch","。通过文字描述布局，它能直接生成设计稿甚至是 Demo 代码。最棒的是，它支持 MCP 服务，能直接把设计稿喂给编码 AI。",[25,3575,3576,3577,3580],{},"接下来，我会写一份详尽的技术设计文档（也就是几千字的“超级 Prompt”）。我会用 Markdown 写好初稿，放进项目里，然后让 ",[1079,3578,3579],{},"Codex","（我的主力编码 AI）结合现有的代码库进行补全。",[3257,3582,3583],{},[25,3584,3585,3588,3589,3593],{},[1079,3586,3587],{},"经验分享："," 让 AI 完善计划时，一定要补上一句：",[1079,3590,3592],{"className":3591},[3037],"“请查找计划中的逻辑问题、遗漏点，以及与现有功能的冲突，列在末尾。”这就像是让它在动工前先帮我做一次“风险评估”","，能省去后期无数的回退工作。",[1029,3595,3597],{"id":3596},"第三阶段开发与小心翼翼的微调","第三阶段：开发与“小心翼翼”的微调",[25,3599,3600,3601,3604],{},"有了详细文档，Codex 能在几十分钟内生成几十个文件。但别高兴太早，AI 写的代码有时就像个 ",[1079,3602,3603],{},"“看起来很美”的精装修房","，进屋一看，水龙头可能是漏的。",[25,3606,3607,3608,3611],{},"这时候，我会坚持一个原则：",[1079,3609,3610],{},"大规模生成靠 AI，细节微调靠手动。"," 千万不要让 AI 进行大范围的二次修改，这极容易导致代码“崩盘”。曾经一个下午，我就毁在了让 AI 二次调整里，代码成了四不像，最后只能含泪 Git Reset。",[977,3613],{},[145,3615,3617],{"id":3616},"_3-一个意外的性能发现别让系统成了短板","3. 一个意外的性能发现：别让系统成了短板",[25,3619,3620],{},"在这里，我要给广大 Windows 用户分享一个“瞳孔震惊”的冷知识。",[25,3622,3623],{},"一开始，Codex 执行一个万字计划需要一个多小时。我偶然在 Mac 上试了一下，发现速度快得惊人。去问了 Gemini 才知道：由于系统底层架构差异，Mac 和 Linux 处理批量文件读写的效率确实由于 Windows。",[25,3625,3626,3627,3630,3631,1109],{},"于是，我昨晚连夜把项目迁移到了 ",[1079,3628,3629],{},"WSL（Windows 的 Linux 子系统）"," 里。\n倒腾完之后，效率提升简直像从绿皮车换成了高铁：一份万字技术文档，读取 4 张设计图，最终生成 50 多个文件，只用了不到 ",[1079,3632,3633],{},"30 分钟",[25,3635,3636,3637,3641],{},"那种感觉，就像是终于找回了 ",[1079,3638,3640],{"className":3639},[3251],"“满血版”"," 的开发状态。前几天还要两天写完的功能，现在一天就能搞定！",[977,3643],{},[145,3645,3647],{"id":3646},"_4-结语科技终究是为了生活","4. 结语：科技终究是为了生活",[25,3649,3650],{},"忙碌了两周，虽然身体有些疲惫，但精神却是丰盈的。",[25,3652,3653],{},"在折腾 WSL 期间，我发现 AI 也有“智商掉线”的时候。Gemini 给出了一些常规指导，但在遇到具体的网络代理冲突时，它翻来覆去就那几句废话。最终，还是靠我自己的经验和传统的搜索才解决了问题。",[25,3655,3656,3657,3661,3662,1109],{},"这让我更加确信：",[1079,3658,3660],{"className":3659},[3037],"未来，人类的累积和内容的生产依然是不可替代的灯塔","。 即使在 AI 时代，我们依然需要那个 ",[1079,3663,3664],{},"“能为结果担责任的人”",[25,3666,3667,3668,1109],{},"沉寂了一个多月，我终于从这个心流的深潭中浮出水面，呼吸一下新鲜空气。我始终相信那句话：",[1079,3669,3671],{"className":3670},[3037],"“美好的事情即将发生”",[25,3673,3674],{},"与其在这个充满变数的时代里焦虑徘徊，倒不如好好享受科技进步带来的红利。毕竟，工具再强大，握着方向盘的那个“我”，才是唯一的主角。",[3296,3676],{":width":3677,"alt":3678,"className":3679,"fit":3304,"src":3680,"style":3681},"500","snow johannes-plenio-DKix6Un55mw-unsplash",[3299,3300,3301,3302,3303],"\u002Fimages\u002Fillustration\u002Fjohannes-plenio-DKix6Un55mw-unsplash.webp","width: 500px; height: 300px;",[25,3683,3684],{},[1079,3685,3689],{"className":3686},[3411,3300,2664,3687,3688],"text-primary","text-2xl","既然有了好用的桨，为何不划向更远的大海呢？",[25,3691,3692],{},[163,3693,3697],{"className":3694},[3411,2664,3695,3696],"text-muted","text-sm","乱星海，我来了。哈哈哈",{"title":41,"searchDepth":180,"depth":180,"links":3699},[3700,3701,3706,3707],{"id":3469,"depth":180,"text":3470},{"id":3533,"depth":180,"text":3534,"children":3702},[3703,3704,3705],{"id":3554,"depth":196,"text":3555},{"id":3565,"depth":196,"text":3566},{"id":3596,"depth":196,"text":3597},{"id":3616,"depth":180,"text":3617},{"id":3646,"depth":180,"text":3647},"在 AI 浪潮下，我分享了如何利用 Gemini、Stitch 和 Codex 构建高效全栈开发流，实现从功能设计到视觉落地的闭环。文章深入探讨了 AI 时代的开发者心态，并分享了 WSL 环境优化等实战提效技巧。与其焦虑被取代，不如拥抱科技，找回久违的创造热忱。","\u002Fblog\u002Fai-assisted-fullstack-workflow-and-developer-growth",{"title":3453,"description":3708},{"loc":3712,"images":3713},"\u002Fblog\u002Fai-assisted-fullstack-workflow-and-developer-growth\u002Findex.zh-cn",[3714],{"loc":3680},{"id":3716,"artifactId":7,"backgroundImg":3717,"category":2570,"date":3718,"extension":10,"lastmod":7,"listPreviewImg":3719,"meta":3724,"ogImage":3720,"stem":3726,"tags":3727,"__hash__":3730,"title":3731,"body":3732,"description":3897,"lang":560,"navigation":570,"path":3898,"seo":3899,"sitemap":3900,"kind":996,"artifactItem":-1},"article\u002Fblog\u002Ffriends-annual-gathering-2026\u002Findex.zh-CN.md","\u002Fimages\u002Fillustration\u002F20260131\u002F1770007607463.webp","2026-02-02",{"url":3720,"alt":3721},"\u002Fimages\u002Fillustration\u002F20260131\u002FIMG_20260130203852.webp",{"en":3722,"zh-CN":3723},"friends meetup","朋友聚会",{"artifactId":7,"lastmod":7,"backgroundImg":3717,"ogImage":3720,"listPreviewImg":3725},{"url":3720,"alt":3723},"blog\u002Ffriends-annual-gathering-2026\u002Findex.zh-CN",[3728,3729,3450],"gathering","teahouse","bGReuYhqqg8ABOA7eH1lTCb15-pYReXuEbaQJWJKvUY","秋名山老友记：2026，我们在“不夜侯”碰头",{"type":22,"value":3733,"toc":3895},[3734,3745,3750,3758,3761,3765,3768,3771,3774,3777,3780,3784,3787,3797,3807,3817,3830,3840,3844,3851,3859,3863,3866,3869,3872,3875,3892],[25,3735,3736,3740,3741,1109],{},[163,3737,3739],{"className":3738},[2711],"“秋名山”","群里，总有人隔三差五冒个泡，从带娃头疼聊到旅行攻略，从代码bug侃到世界局势。这个当初为了比拼“车技”（技术）而建的群，五六年过去，大部分人早已不在同一家公司，",[163,3742,3744],{"className":3743},[3037],"可当年攒下的交情，却像一壶老茶，越泡越有味道",[3296,3746],{"className":3747,"fit":3304,"src":3748,"style":3749},[3299,3300,3301,3302,3303],"\u002Fimages\u002Fillustration\u002F20260131\u002F1770007755049.webp","width: 500px;",[25,3751,3752,3753,3757],{},"一年一度的聚会，今年定在了一家叫",[163,3754,3756],{"className":3755},[2711],"“不夜侯”","的茶馆。我想着这群人的“拖延症”传统，干脆也悠哉点儿。约的两点，我两点半才到停车场，正好碰见笑笑和她两岁的女儿小薏米。得，我俩成了最先到的“积极分子”。",[25,3759,3760],{},"没想到，这一聊就是一个小时，第三位伙伴才姗姗来迟。这帮人的时间观念啊，你说它强吧，没人准时；你说它弱吧，大冷天能出门来聚，已经算是深情厚谊了。",[3296,3762],{"className":3763,"fit":3304,"src":3764,"style":3749},[3299,3300,3301,3302,3303],"\u002Fimages\u002Fillustration\u002F20260131\u002F1770007996048.webp",[25,3766,3767],{},"这一个小时里，我跟笑笑聊了不少。我真服了她哪来那么多用不完的精力。平时工作就忙，加班常事，周末带娃之余，居然还在读研究生，兼职当外聘老师，人生宽度和深度一把抓。她好像巴不得一天有48个小时。",[25,3769,3770],{},"说起我在试的自由职业，她很认真地说：“这需要很大勇气。”她说她一直有看我写的文章，希望我能走到想看的风景里。她也坦言：“我自己停不下来，像个落不了地的鸟，一有空闲就想把所有时间塞满。”",[25,3772,3773],{},"她女儿小薏米是真乖，两岁的小人儿，安安静静在旁边自己玩，这儿摸摸那里看看，不吵不闹，几乎没打断过我们聊天。我说：“你家娃真省心，要是我家那个来了，不到十分钟就能把这儿掀个底朝天。”",[25,3775,3776],{},"巧的是，她也在重新捡起英语。我们简单交流了下方法，我把她拉进了我最近在玩的英语角，约着以后有机会一起练练。",[25,3778,3779],{},"刘同学来了之后，聊起了不一样的三一集团。外面都说那儿的人都是“牛马中的牛马”，可她部门两年没加过班，领导也挺好。我说：“那真不错，在职场遇到个好领导，算中彩票了。”我也想起曾经面试过他们的国际部门，但一想到要从城市西南角穿越到东北角，就觉得这班不上也罢。",[3296,3781],{"className":3782,"fit":3304,"src":3783,"style":3749},[3299,3300,3301,3302,3303],"\u002Fimages\u002Fillustration\u002F20260131\u002F1770007700168.webp",[25,3785,3786],{},"人慢慢到齐了，熟悉的气氛一下子就回来了，就像群里聊天搬到了线下：",[3257,3788,3789],{},[1073,3790,3791,3794],{},[49,3792,3793],{},"老江，你过着职场人羡慕的神仙日子啊，工作不忙没压力，公司制度、福利又好。",[49,3795,3796],{},"咳，说的倒没错，呵呵。不过，讲真，这种模式，把自己给搞懒了，没得斗志了。还得是老孙，有这种破圈的勇气，活成了很多程序员想要的样子",[3257,3798,3799],{},[1073,3800,3801,3804],{},[49,3802,3803],{},"老张，你这职业生涯也算是一波三折啊，最近几家的状况都遇到了滑铁卢。",[49,3805,3806],{},"其实也还好，每家都拿到了补偿，也不亏。",[3257,3808,3809],{},[1073,3810,3811,3814],{},[49,3812,3813],{},"阿坤你小子，到底是有相声演员的底子，从程序员转到销售后，丝滑过度，现在新车子开着，圆子挣着，整个人脸色变红润，身材也变厚（发福）了",[49,3815,3816],{},"哪里哪里，还是怀念当初跟大家一起写代码，插科打诨，比拼车技的日子",[3257,3818,3819],{},[1073,3820,3821,3824,3827],{},[49,3822,3823],{},"来晚了，车位难找啊，看到了老孙的小 mini，还想着打给你，说让你挪一下车给我停的，哈哈哈哈",[49,3825,3826],{},"也就你敢做这样的事",[49,3828,3829],{},"那咋了，这是老孙，又不是别人，嘿嘿，这不最后还是没有做这缺德事么",[3257,3831,3832],{},[1073,3833,3834,3837],{},[49,3835,3836],{},"老沙，你终于来了，平时咋也不在秋名山里现现身呢",[49,3838,3839],{},"我也想啊，公司管的严，微信啥的好多工具不让用，一上班人像失踪了一样",[3296,3841],{"className":3842,"fit":3304,"src":3843,"style":3749},[3299,3300,3301,3302,3303],"\u002Fimages\u002Fillustration\u002F20260131\u002F1770007644724.webp",[25,3845,3846,3847,3850],{},"晚餐时分，当饮料杯举起，我心中感慨万千。这种情谊，恰似",[163,3848,3756],{"className":3849},[2711],"——不浓烈，不粘腻，平日静静待在通讯录里，互不打扰。但只要一壶茶的时间，就能迅速找回毫无顾忌、掏心掏肺的频道。",[25,3852,3853,3854,3858],{},"席间有人笑道：",[163,3855,3857],{"className":3856},[2711],"“得亏现在不在一个公司了，没了利害关系，咱才能这么纯粹地聚，放肆地聊吧？”","。众人哄堂大笑，仿佛一语道破了这份温暖背后，最朴素也最坚固的基石。",[3296,3860],{"className":3861,"fit":3304,"src":3862,"style":3749},[3299,3300,3301,3302,3303],"\u002Fimages\u002Fillustration\u002F20260131\u002F1770007937450.webp",[25,3864,3865],{},"忽然间，手机嗡嗡作响，家里来了电话——带娃的“重大项目”需要支援。我只好收收心，跟大家提前道别。大伙儿都特理解，纷纷摆手：“下次再聚，路上慢点。”",[25,3867,3868],{},"回家的路上，我跟手机里的AI口语搭子有一搭没一搭地聊着今天的聚会，把那些热乎的片段又回味了一遍。车窗外路灯流过，心里揣着一点老朋友给的暖意。",[25,3870,3871],{},"这一天，就这样平平常常、心满意足地结束了。",[25,3873,3874],{},"最后，以 AI 帮我作的一首《围炉纪》作结，为这份小确幸存档：",[3257,3876,3877],{},[25,3878,3879,3880,3882,3883,3885,3886,3888,3889,3891],{},"《围炉纪》",[2722,3881],{},"\n同袍昔在格子间，今如星散各云天。",[2722,3884],{},"\n金波浮沉商海阔，电车轻驰世路前。",[2722,3887],{},"\n昔时共议案头事，今各弄瓦复著鞭。",[2722,3890],{},"\n岁寒幸得一年约，围炉犹似初见年。",[3296,3893],{"className":3894,"fit":3304,"src":3720,"style":3749,"alt":3722},[3299,3300,3301,3302,3303],{"title":41,"searchDepth":180,"depth":180,"links":3896},[],"记录“秋名山”群组一年一度的老友聚会。2026年初，一群已散落各方的老同事在“不夜侯”茶馆重聚，畅谈职业转变、育儿生活与人生近况。本文记录了这次超越同事的淡泊友情，以及那些无需常见面却始终温暖的时刻。","\u002Fblog\u002Ffriends-annual-gathering-2026",{"title":3731,"description":3897},{"loc":3901,"images":3902},"\u002Fblog\u002Ffriends-annual-gathering-2026\u002Findex.zh-cn",[3903,3904,3905,3906,3907,3908],{"loc":3748},{"loc":3764},{"loc":3783},{"loc":3843},{"loc":3862},{"loc":3720},{"id":3910,"artifactId":7,"backgroundImg":7,"category":8,"date":3911,"extension":10,"lastmod":7,"listPreviewImg":3912,"meta":3917,"ogImage":3913,"stem":3919,"tags":3920,"__hash__":3922,"title":3923,"body":3924,"description":4095,"lang":560,"navigation":570,"path":4096,"seo":4097,"sitemap":4098,"kind":996,"artifactItem":-1},"article\u002Fblog\u002Fbeyond-schedule-time-and-work\u002Findex.zh-CN.md","2026-01-30",{"url":3913,"alt":3914},"\u002Fimages\u002Fillustration\u002Faaron-burden-5AiWn2U10cw-unsplash.webp",{"en":3915,"zh-CN":3916},"snow aaron-burden-5AiWn2U10cw-unsplash","雪 aaron-burden-5AiWn2U10cw-unsplash",{"artifactId":7,"lastmod":7,"backgroundImg":7,"ogImage":3913,"listPreviewImg":3918},{"url":3913,"alt":3916},"blog\u002Fbeyond-schedule-time-and-work\u002Findex.zh-CN",[3448,3449,3450,3921],"time_management","LmLQr6PdWbwCLbIMSeagU0svW99AHzObCPUrZVZQrKU","不再被日程绑架后，我的时间与工作",{"type":22,"value":3925,"toc":4090},[3926,3929,3936,3939,3942,3945,3949,3952,3959,3962,3968,3975,3978,3985,3992,3995,4002,4005,4010,4014,4017,4020,4023,4026,4031,4034,4040,4043,4046,4049,4052,4064,4069,4073,4076,4079,4082],[25,3927,3928],{},"猛然抬头，发现2026年的一月已接近尾声。自从告别打卡上班的日子，时间仿佛被按下了加速键——这大概就是“自由”附赠的小小副作用：当你真正拥有时间时，才发觉它溜走得如此之快。",[25,3930,3931,3932,1109],{},"年初，我在计划本上郑重写下今年的唯一目标：",[1079,3933,3935],{"className":3934},[3037],"全力以赴自由职业，年底前通过自己的产品挣到生活费",[25,3937,3938],{},"目标清晰得像冬日早晨的寒霜。但随之而来的问题是：如何抵达？",[3296,3940],{"alt":3915,"className":3941,"fit":3304,"src":3913,"style":3681,":width":3677},[3299,3300,3301,3302,3303],[25,3943,3944],{},"整个一月，我几乎每天早晨睁眼，这个问题就在脑中自动播放。今天，我想和你分享这一个月来，我关于“时间”与“路径”的两个关键发现。它们不算什么惊天动地的道理，更像是在迷雾中为自己摸索出的、实实在在的路标。",[145,3946,3948],{"id":3947},"一与时间和解从管理到相处","一、与时间“和解”：从“管理”到“相处”",[25,3950,3951],{},"过去，我曾是个不折不扣的“日程表暴君”。我迷恋把每一天的每个小时都填满，看着日历APP上五彩斑斓的色块，仿佛那就是生产力本身。结果呢？第二天，我往往被自己设定的严密日程追得喘不过气，完不成的焦虑感如影随形。那种感觉，就像试图用一把直尺去丈量一条奔流的河——徒劳，且令人崩溃。",[25,3953,3954,3955,1109],{},"今年，我终于“学乖了”。我意识到，",[1079,3956,3958],{"className":3957},[3251],"与其执着于“管理”每一分每一秒，不如学习如何与时间和平地“相处”",[25,3960,3961],{},"我卸载了复杂的日历APP，回归最朴素的“待办清单+习惯追踪”。每天清晨，泡杯咖啡，只看一眼清单上最重要的两三件事。然后，凭当下的“心意”，随手开始其中一项。奇怪的是，当我放弃了“几点种开始必须做什么”的执念，事情反而在一种更松弛的节奏中稳步推进了。",[3296,3963],{"alt":3964,"className":3965,"fit":3304,"src":3966,"style":3967},"习惯打卡",[3299,3300,3301,3302,3303],"\u002Fimages\u002Fillustration\u002FIMG_202601_habits.webp","height: 300px;",[25,3969,3970,3971,1109],{},"上图是我这个月的习惯追踪。你看，大部分项目并非“全勤”。放在以前，我可能会为此沮丧，甚至开始自我攻击：“看，你又没坚持住。”但现在，我的心态变了。我不再把习惯养成当作一场必须满分的考试，而视其为一场邀请——",[1079,3972,3974],{"className":3973},[3687],"邀请这些美好的事物，自然而然地融入我的生活",[25,3976,3977],{},"我逐渐发现，晨起早餐后的一小时，很适合学英语；晚上陪孩子玩闹后，抱起吉他练一会儿，心会特别静。至于其他想培养的习惯，我相信它们也会在未来，找到自己在一天中最舒适的“座位”。",[25,3979,3980,3981],{},"我不再用“工作时长”来证明自己的努力。自由职业的初衷，不正是为了挣脱“坐班”的束缚，换取真正的“时间自由”吗？何必从一个格子间，跳进另一个由自己打造的无形牢笼？",[1079,3982,3984],{"className":3983},[3037],"如今，我每天只关心一件事：今天最重要的任务，完成了吗？",[25,3986,3987,3988],{},"甚至，我也放下了那个完美的借口——“孩子回家后，我就没法工作了”。现在，如果需要，我会先全心陪他玩半小时，然后再回到电脑前。",[1079,3989,3991],{"className":3990},[3251],"生活与工作的界限，不再是非黑即白的城墙，而成了一条可以灵活调节的波浪线。",[25,3993,3994],{},"这个一月，我在与时间的关系上，终于“成熟”了一点。我不再与它为敌，不再试图禁锢它。我学会将有限的注意力，像聚光灯一样，打在当下最值得照耀的“刀刃”上。",[25,3996,3997,4001],{},[1079,3998,4000],{"className":3999},[2711],"庄子说：“吾生也有涯，而知也无涯。以有涯随无涯，殆已！”","​ 以前不懂，现在深以为然。以有限的人生，去追逐无限的时间刻度，怎能不焦虑？与时间和解，就是接纳它的流动性，然后，在流动中，稳稳地做好那几件最重要的事。",[25,4003,4004],{},"二月份，再接再厉。",[3296,4006],{"alt":4007,"className":4008,"fit":3304,"src":4009,"style":3681,":width":3677},"guitar jacek-dylag-hUHzaiAHuUc-unsplash",[3299,3300,3301,3302,3303],"\u002Fimages\u002Fillustration\u002Fjacek-dylag-hUHzaiAHuUc-unsplash.webp",[145,4011,4013],{"id":4012},"二自由职业的路从广撒网到深打井","二、自由职业的“路”：从“广撒网”到“深打井”",[25,4015,4016],{},"如果说时间管理是“内功”，那具体做什么，就是我要闯荡的“江湖”。",[25,4018,4019],{},"起初，我接受的“主流叙事”极具诱惑力：出海做独立站，就要快速试错，大量上新。在不断的实践中，训练出发现需求的“嗅觉”，像滚雪球一样，让雪球越滚越大。",[25,4021,4022],{},"去年底，我也曾沿着这条路摸索。但今年一月，在不断搜寻所谓的“痛点需求”后，我感到了某种不适。我发现自己陷入了一种“为找需求而找需求”的迷茫。我忽然意识到一个根本问题：我最终想要的，是打造一个（或几个）能长期运营、带来真实价值的产品，而不是拥有一堆转瞬即逝的“数字快消品”。",[25,4024,4025],{},"那个看似正确的“广撒网”策略，真的适合我吗？",[3296,4027],{"alt":4028,"className":4029,"fit":3304,"src":4030,"style":3681,":width":3677},"success razvan-chisu-Ua-agENjmI4-unsplash",[3299,3300,3301,3302,3303],"\u002Fimages\u002Fillustration\u002Frazvan-chisu-Ua-agENjmI4-unsplash.webp",[25,4032,4033],{},"一个月来，我泡在Reddit、Indie Hackers上，看了无数成功案例。某个瞬间，我恍然大悟：所有的“方法论”，都是成功者回头为自己走过的路描绘的地图。地图很美，但并不意味着，你沿着同样的经纬度出发，就能抵达同一个终点。",[25,4035,4036],{},[1079,4037,4039],{"className":4038},[3251],"成功的故事是“已建好的桥”，而探索者的路，需要自己“摸着石头过河”。该撞的南墙，不会因为你读过一百篇“避坑指南”而消失；该收获的洞察，也往往诞生于你自己的躬身入局。",[25,4041,4042],{},"于是，我的思路发生了转变。我从向外“大海捞针”，转为向内“深挖矿井”。",[25,4044,4045],{},"我最懂的需求是什么？是我自己的需求。​ 那些在我工作流中让我隐隐觉得不便、却一直没被很好解决的需求；那些我作为用户，内心深处一直期待却未被满足的渴望。",[25,4047,4048],{},"我锚定了一个自己的真实痛点，开始画原型图。同时，我不再漫无目的地浏览，而是有目标地在相关社区寻找竞品，学习、互动、收集反馈。下一步，我计划先做一个简单的着陆页，去论坛里发起讨论，验证这个需求是否真实存在，是否也有其他人为此困扰。",[25,4050,4051],{},"这条路，我称之为“深打井”：从自己真实的生命体验出发，向下挖掘，直到触及那口可能存在于更深处、连接着更多人的“需求之泉”。它或许不如“广撒网”热闹，但更适合此刻的我——把有限的注意力和热情，凝聚起来，浇灌在少数有长期想象力的事物上。",[25,4053,4054,4055,4059,4060],{},"这个过程充满不确定性，但正如 ",[1079,4056,4058],{"className":4057},[2711],"《荀子》所言：“道虽迩，不行不至；事虽小，不为不成。”​"," 路再近，不走也到不了；事再小，不做也不会成。 ",[1079,4061,4063],{"className":4062},[3037],"自由职业这条路，终究是“行”出来的，不是“看”出来的。",[3296,4065],{"alt":4066,"className":4067,"fit":3304,"src":4068,"style":3681,":width":3677},"path jamie-street-EShuzrworjI-unsplash",[3299,3300,3301,3302,3303],"\u002Fimages\u002Fillustration\u002Fjamie-street-EShuzrworjI-unsplash.webp",[145,4070,4072],{"id":4071},"一月将尽我的自由职业实验刚刚启程","一月将尽，我的自由职业实验刚刚启程",[25,4074,4075],{},"我最大的收获，或许不是完成了多少任务，而是心态上的两次“转向”：在时间上，从“僵化管理”转向“灵活相处”；在路径上，从“盲目追随”转向“向内探索”。",[25,4077,4078],{},"我不确定年底是否真能实现那个目标。但我知道，真正的自由，不在于你能做任何事，而在于你能拒绝大多数事，并专注于那一两件真正重要的事。",[25,4080,4081],{},"这条路上，没有标准答案，只有属于自己的、不断修正的“心法”。二月，我将继续这场实验，并期待与你分享新的发现。",[25,4083,4084,4085,4089],{},"毕竟，",[1079,4086,4088],{"className":4087},[3037],"“道阻且长，行则将至。”","​ 与所有在路上的人，共勉。",{"title":41,"searchDepth":180,"depth":180,"links":4091},[4092,4093,4094],{"id":3947,"depth":180,"text":3948},{"id":4012,"depth":180,"text":4013},{"id":4071,"depth":180,"text":4072},"一位前程序员在开启自由职业后，如何告别严苛的日程管理，找到与时间和平相处的方式；并从“广撒网”转向“深打井”，探索适合自己的产品之路。这是一份关于内耗、效率与个人工作哲学的真诚实验笔记。","\u002Fblog\u002Fbeyond-schedule-time-and-work",{"title":3923,"description":4095},{"loc":4099,"images":4100},"\u002Fblog\u002Fbeyond-schedule-time-and-work\u002Findex.zh-cn",[4101,4102,4103,4104,4105],{"loc":3913},{"loc":3966},{"loc":4009},{"loc":4030},{"loc":4068},{"id":4107,"artifactId":7,"backgroundImg":4108,"category":2570,"date":4109,"extension":10,"lastmod":7,"listPreviewImg":4110,"meta":4114,"ogImage":4108,"stem":4116,"tags":4117,"__hash__":4121,"title":4122,"body":4123,"description":4127,"lang":560,"navigation":570,"path":4148,"seo":4149,"sitemap":4150,"kind":996,"artifactItem":-1},"article\u002Fblog\u002Fmy-first-english-meetup\u002Findex.zh-CN.md","\u002Fimages\u002Fblog-bg\u002FIMG_20260118095031.webp","2026-01-18",{"url":4108,"alt":4111},{"en":4112,"zh-CN":4113},"English meetup photo","英语角活动的照片",{"artifactId":7,"lastmod":7,"backgroundImg":4108,"ogImage":4108,"listPreviewImg":4115},{"url":4108,"alt":4113},"blog\u002Fmy-first-english-meetup\u002Findex.zh-CN",[4118,4119,3450,4120,2583],"english_learning","meetups","motivation","RHFZsRVdKSOXKt7Y6CZdxWN1zbccorcUVCAbKx1-fho","新体验：第一次参加英语角",{"type":22,"value":4124,"toc":4146},[4125,4128,4131,4134,4137,4140,4143],[25,4126,4127],{},"学了这么多年的英语，昨天第一次参加英语角，感觉很棒。第一次参加活动就直接玩狼人杀，挑战满满啊。回家后用英语写了一段日记，锻炼锻炼，哈哈哈。",[25,4129,4130],{},"I had a great time at my first English meetup yesterday. Everyone was so nice. We introduced ourselves and then started playing Werewolf. I hope the rule sheets I brought were helpful.",[25,4132,4133],{},"During the game, I tried to talk as much as I could. However, whenever it was my turn to speak, my mind would go blank. I couldn't analyze the situation like the others could. I really don't know how to play this game well yet.",[25,4135,4136],{},"But I could understand most of what others were saying, which made me very happy since it was my first time using English in a real conversation.",[25,4138,4139],{},"There was one really clever play during the game. In the first round, the werewolves killed one of their own teammates to mislead the good side, and they won that round with this strategy. It was so tricky! They said they didn't play much, but they played like pros — real wolves in sheep's clothing! Haha.",[25,4141,4142],{},"I'm already looking forward to the next event. But before that, I need to keep improving my speaking. In fact, today's meetup gave me huge motivation to keep learning English. I'll keep going, and I know I'll get better and better.",[3296,4144],{"alt":4113,"className":4145,"fit":3304,"src":4108,"style":3681},[3299,3300,3302,3303],{"title":41,"searchDepth":180,"depth":180,"links":4147},[],"\u002Fblog\u002Fmy-first-english-meetup",{"title":4122,"description":4127},{"loc":4151,"images":4152},"\u002Fblog\u002Fmy-first-english-meetup\u002Findex.zh-cn",[4153],{"loc":4108},{"id":4155,"artifactId":7,"backgroundImg":4156,"category":2570,"date":4157,"extension":10,"lastmod":7,"listPreviewImg":4158,"meta":4163,"ogImage":4156,"stem":4165,"tags":4166,"__hash__":4169,"title":4170,"body":4171,"description":4541,"lang":560,"navigation":570,"path":4542,"seo":4543,"sitemap":4544,"kind":996,"artifactItem":-1},"article\u002Fblog\u002Flife-lessons-i-wish-i-knew-earlier\u002Findex.zh-CN.md","\u002Fimages\u002Fblog-bg\u002Fmichael-denning-LXomcUwf4vQ-unsplash.webp","2026-01-14",{"url":4159,"alt":4160},"\u002Fimages\u002Fillustration\u002Fandrew-charney-PZZ31takeSU-unsplash.webp",{"en":4161,"zh-CN":4162},"lighthouse andrew-charney-PZZ31takeSU-unsplash","灯塔 andrew-charney-PZZ31takeSU-unsplash",{"artifactId":7,"lastmod":7,"backgroundImg":4156,"ogImage":4156,"listPreviewImg":4164},{"url":4159,"alt":4162},"blog\u002Flife-lessons-i-wish-i-knew-earlier\u002Findex.zh-CN",[3450,4167,3448,4168],"career_advice","life_lessons","wsaA7GF1NhibK0P7uYNB451IIIuObGKjb0gvnYkpjSM","如果能重来，哪些观念我希望早点明白？",{"type":22,"value":4172,"toc":4533},[4173,4181,4188,4193,4197,4200,4203,4206,4220,4226,4229,4232,4265,4268,4271,4274,4282,4290,4295,4299,4302,4305,4317,4320,4323,4328,4331,4339,4342,4346,4349,4352,4355,4366,4374,4377,4382,4386,4389,4401,4411,4414,4425,4428,4433,4437,4440,4448,4451,4469,4474,4477,4484,4493,4497,4505,4508,4511,4514,4522,4528],[25,4174,4175,4176,4180],{},"前几天和妈妈聊天，谈到工作和收入，我突然意识到：",[1079,4177,4179],{"className":4178},[2711],"人与人之间的选择差异，其实源于观念的差异","。这让我不禁回想：如果重回二十出头，有哪些观念，是我希望自己能早点明白的？",[25,4182,4183,4184,1109],{},"十年职业生涯，像一场漫长的徒步。我整理行囊，发现",[1079,4185,4187],{"className":4186},[3037],"有些道理如同指南针，虽朴素，却始终指向远方",[3296,4189],{"alt":4190,"className":4191,"fit":3304,"src":4192,"style":3681},"指南针 jordan-madrid-iDzKdNI7Qgc-unsplash",[3299,3300,3302,3303],"\u002Fimages\u002Fillustration\u002Fjordan-madrid-iDzKdNI7Qgc-unsplash.webp",[145,4194,4196],{"id":4195},"_1-你是谁你要去哪","1. 你是谁？你要去哪？",[25,4198,4199],{},"如果我问你：“你想成为什么样的人？” 你会不会像当年的我一样，第一反应是：“这不是学生时代的作文题吗？”",[25,4201,4202],{},"这事儿特别割裂：上学时，老师天天催着我们 “要有梦想”“向伟人学习”，可一旦走出校园，没有了外界的引导，很多人就把 “思考未来” 这事儿丢到了脑后，活得像台没有目的地的列车，只知道往前开，却不知道要驶向何方。",[25,4204,4205],{},"但其实，“成为什么样的人”“过什么样的生活”，从来不是学生时代的专属命题。哪怕到了三十岁、五十岁，这些问题依然需要我们反复琢磨：",[1073,4207,4208,4214],{},[49,4209,4210],{},[163,4211,4213],{"className":4212},[2711],"未来我想培养什么习惯？磨砺什么性格？作为伴侣、父母、职场人，这些角色我该怎么做好？",[49,4215,4216],{},[163,4217,4219],{"className":4218},[2711],"我向往的生活是什么样子？需要具备哪些能力、积累哪些资源才能抵达？",[25,4221,4222],{},[1079,4223,4225],{"className":4224},[3037],"生活就像航海，没有目标，任何风向都是逆风。哪怕目标很小，也能让你在迷茫时找到方向。",[3296,4227],{"alt":4161,"className":4228,"fit":3304,"src":4159,"style":3681},[3299,3300,3302,3303],[25,4230,4231],{},"这个问题听起来很大，但其实能拆成几个接地气的小动作，帮你慢慢捋清楚：",[1073,4233,4234,4241,4248,4255,4262],{},[49,4235,4236,4240],{},[163,4237,4239],{"className":4238},[3687],"先做一个 “简化版 5 年规划”","：不用太复杂，就想象 5 年后的你，最理想的状态是什么？是在某个领域成为专家，还是有时间陪伴家人、发展兴趣？",[49,4242,4243,4247],{},[163,4244,4246],{"className":4245},[3687],"倒推年度计划","：要达到 5 年后的状态，今年最该做的 3 件事是什么？别贪多，聚焦核心才容易坚持。",[49,4249,4250,4254],{},[163,4251,4253],{"className":4252},[3687],"多 “见世面”","：看书、刷纪录片、关注不同行业的人，了解世界上还有哪些生活方式，把喜欢的、值得借鉴的都记在心里，慢慢丰富自己的 “人生选项库”。",[49,4256,4257,4261],{},[163,4258,4260],{"className":4259},[3687],"持续调整","：计划不是刻在石头上的，随着阅历增长，随时可以修正。我刚毕业时想做 “技术大神”，工作三年后想尝试管理，现在又转向自由职业 —— 不同阶段的想法变化很正常，重要的是始终有 “向前看” 的意识。",[49,4263,4264],{},"重复以上步骤，形成闭环。",[25,4266,4267],{},"作为程序员，我就是靠这套方法规划职业的：从初级到中级、高级，再到技术管理，以终为始倒推每年该学什么、该做什么。十年间，虽然很多细节计划没完成，但大方向从没跑偏，职业道路顺风顺水，薪资也水涨船\"高\"。",[25,4269,4270],{},"可就像游戏通关到一定阶段会遇到瓶颈，打工十年后，我突然发现眼前的路越走越窄 —— 一眼能望到头的职业生涯，让我看不到更多可能性。于是我静下心来调整思路，把挂在脑海里很久的 “自由职业”“数字游民”，认真搬到了 “人生桌面” 上，开始新一轮征程。",[25,4272,4273],{},"我始终相信，这条路和做程序员没什么不同：刚开始是 “新手村打怪”，慢慢积累经验升 “中级”，再到摸透规律的 “高级”。所以我愿意舍弃眼前的稳定收入，去赌一个更自由、更有想象空间的未来。",[25,4275,4276,4277,4281],{},"写到这里，你大概能发现这套方法的底层逻辑：",[1079,4278,4280],{"className":4279},[3037],"人生没有捷径，所有的收获都藏在 “日复一日的坚持” 里","。就像老木匠刨木头，一刨子一刨子看似枯燥，却能让木头逐渐成型。别幻想一夜暴富，也别嫌弃进步太慢，象棋里的兵看似走得笨，一步一个脚印，却总能在关键时刻抵达终点。",[3257,4283,4284],{},[25,4285,4286],{},[1079,4287,4289],{"className":4288},[2711],"真正的勇气，是改变能改变的，接受不能改变的，并用智慧区分二者",[3296,4291],{"alt":4292,"className":4293,"fit":3304,"src":4294,"style":3681},"坚持 will-gonzalez-UD4ousCrV9A-unsplash",[3299,3300,3302,3303],"\u002Fimages\u002Fillustration\u002Fwill-gonzalez-UD4ousCrV9A-unsplash.webp",[145,4296,4298],{"id":4297},"_2-持续学习坚持总结持续探索","2. 持续学习，坚持总结，持续探索",[25,4300,4301],{},"规划再好，也只是一张纸；目标再美，不执行也只是空想。而执行的核心，就是 “持续学习 + 定期总结”。",[25,4303,4304],{},"我几乎每天睡前都会花几分钟复盘：今天做了什么？哪些地方可以改进？想提升的技能有没有进展？如果没做到，是方法不对还是心态出了问题？找到问题后，再想 “有没有其他办法”“下次该怎么调整”。",[25,4306,4307,4308,4312,4313,1109],{},"这里有个小窍门：",[1079,4309,4311],{"className":4310},[3037],"总结不是 “自我批判大会”","。如果总盯着自己的不足，时间久了会陷入自我否定；不如多给自己一些鼓励，哪怕只是 “今天比昨天多学了一个知识点”“这次总结比上次更有条理”，都值得肯定。",[1079,4314,4316],{"className":4315},[3037],"呵护好自己 “愿意尝试” 的心态，比什么都重要",[25,4318,4319],{},"而且学习不该有 “边界感”。除了本职工作的专业技能，多学一些看似 “没用” 的东西，反而能给人生添彩。就像给人生攒 “彩蛋”，当下不起眼，某天说不定就弹出惊喜。",[25,4321,4322],{},"我因为喜欢尤克里里，报了兴趣班，还试着在店里帮忙代课、做地推 —— 最后发现自己只喜欢弹奏，不适合教学和做生意，但这段经历让我更清楚 “自己想要什么”；后来迷上模拟赛车，关注了很多赛车博主，去年还幸运地联系上一支车队，近距离看他们比赛、备赛，那种热血和专业，让我对 “团队氛围” 有了新的理解。",[3296,4324],{"alt":4325,"className":4326,"fit":3304,"src":4327,"style":3681},"湖南国际赛车场 超吉联赛 IMG_20250816_094043",[3299,3300,3302,3303],"\u002Fimages\u002Fillustration\u002FIMG_20250816_094043.webp",[25,4329,4330],{},"这些尝试没有给我带来经济收入，却让我的人生变得更厚重。我不再是 “只会写代码的程序员”，而是有自己的热爱、有故事可讲的普通人。而这些 “没用” 的经历，说不定某天就会和工作、机会产生奇妙的化学反应。",[3257,4332,4333],{},[25,4334,4335],{},[1079,4336,4338],{"className":4337},[2711],"The unexamined life is not worth living.（不审视自己的生活，就失去了活着的意义。）",[25,4340,4341],{},"这句话一直提醒我：别只顾着往前跑，偶尔停下来回头看，才能走得更稳、更远。",[145,4343,4345],{"id":4344},"_3-展示自己不是炫耀是连接","3. 展示自己，不是炫耀，是连接",[25,4347,4348],{},"当初选择做程序员，一半是真的喜欢代码，一半是抱着 “不用跟人打交道” 的私心 —— 现在回头看，这想法简直是职场 “自我设限” 的典范，相当于主动把机会的门焊死了一半。",[25,4350,4351],{},"职场里有个很现实的情况：两个人业绩、技术差不多，年度评选时，往往是那个更善于表达、更愿意和同事交流的人胜出。这不是 “拍马屁”，而是正常的社交逻辑：同事更了解他的工作，更认可他的付出，自然会倾向于他。",[25,4353,4354],{},"如果你和我当年一样，习惯 “闷头做事”，不妨试着改变：",[1073,4356,4357,4360,4363],{},[49,4358,4359],{},"同事遇到难题时，顺手搭个手；自己有好的想法时，大胆说出来，分享给团队。",[49,4361,4362],{},"公司有评比、项目机会时，别退缩，主动参与 —— 这不是争强好胜，而是让你的努力被看见。",[49,4364,4365],{},"别只守着自己的 “一亩三分地”，多和其他部门的人交流，参与跨部门项目，既能拓展视野，也能积累人脉。",[25,4367,4368,4369,4373],{},"这些做法，其实就是 “",[1079,4370,4372],{"className":4371},[3037],"运营自己的职场口碑","”。专业技能是硬实力，决定你的职业下限；而口碑、人脉这些软实力，能帮你突破上限，获得更多意想不到的机会。",[25,4375,4376],{},"我刚做技术管理时，就是因为平时喜欢和团队的小伙伴，以及产品、测试部门沟通，了解他们的需求和痛点，后来公司组织结构调整，就把我任命为部门经理。职场里的每一次真诚交流，都可能成为未来的 “铺路石”。",[3296,4378],{"alt":4379,"className":4380,"fit":3304,"src":4381,"style":3681},"团队合作 antonio-janeski-CHVTt0aGbx0-unsplash",[3299,3300,3302,3303],"\u002Fimages\u002Fillustration\u002Fantonio-janeski-CHVTt0aGbx0-unsplash.webp",[145,4383,4385],{"id":4384},"_4-培养自己的心灵力量","4. 培养自己的心灵力量",[25,4387,4388],{},"我们总说 “身心健康”，但很多人只关注身体，却忽略了心灵的 “保养”。其实心灵健康和身体健康一样重要，它能让你在遇到挫折时不崩溃，在焦虑时不内耗，始终保持情绪稳定。",[25,4390,4391,4392,4396,4397,1109],{},"这些年，对我帮助最大的两本书，一本是 ",[1079,4393,4395],{"className":4394},[2711],"《被讨厌的勇气》","，一本是 ",[1079,4398,4400],{"className":4399},[2711],"《十分钟冥想》",[25,4402,4403,4406,4407,1109],{},[1079,4404,4395],{"className":4405},[2711],"彻底治愈了我的 “讨好型人格”：它告诉我，你不需要让所有人满意，也不可能让所有人满意。别人喜欢你与否，是别人的事，和你无关；",[1079,4408,4410],{"className":4409},[3037],"你只需要做好自己，接纳自己的不完美，自然会吸引同频的人",[25,4412,4413],{},"以前我总怕 “得罪人”，开会时明明有不同意见，也不敢说；同事找我帮忙，哪怕自己没时间，也硬着头皮答应。看完这本书后，我慢慢学会了 “拒绝”，学会了 “坚持自己的想法”，反而活得更轻松，也赢得了更多尊重。",[25,4415,4416,4419,4420,4424],{},[1079,4417,4400],{"className":4418},[2711],"则教会我 “和情绪和平共处”：它说情绪就像天气，有晴天也有暴雨，但太阳始终在云层后面。生气时不用强迫自己 “不许怒”，伤心时也不用硬撑 “不许哭”，",[1079,4421,4423],{"className":4422},[3037],"接纳情绪的存在，再慢慢引导自己的行为"," —— 生气可以，但别大吼大叫；伤心可以，但别沉溺其中。",[25,4426,4427],{},"现在遇到烦心事，我会花十分钟冥想，把注意力拉回当下，告诉自己 “先做好眼前的事，剩下的交给时间”。这种 “情绪自控力”，让我在自由职业的波动期里，少了很多焦虑，多了很多笃定。",[3296,4429],{"alt":4430,"className":4431,"fit":3304,"src":4432,"style":3681},"坐在山上的男人 ian-stauffer-uftqFbfWGFY-unsplash",[3299,3300,3302,3303],"\u002Fimages\u002Fillustration\u002Fian-stauffer-uftqFbfWGFY-unsplash.webp",[145,4434,4436],{"id":4435},"_5-挣钱的方式不止一条路","5. 挣钱的方式，不止一条路",[25,4438,4439],{},"我们从小被教育 “好好学习→考个好大学→找份好工作→拿稳定工资”，以至于很多人长大后，把 “打工挣钱” 当成了唯一的谋生方式。",[25,4441,4442,4443,4447],{},"我工作十年后，才真正读懂《穷爸爸富爸爸》里 ",[1079,4444,4446],{"className":4445},[2711],"“工资是毒药”"," 的含义。工资确实稳定、可靠，每月按时到账，每年可能还会涨一点，但它也像温水煮青蛙，慢慢消耗掉你探索其他挣钱方式的动力。",[25,4449,4450],{},"一旦职业遇到瓶颈，或者行业走下坡路，很多人就会慌神，第一反应是 “换份工作”“降低薪资要求”，却没想过：挣钱，真的只有打工这一条路吗？",[25,4452,4453,4454,4458,4459,4463,4464,4468],{},"纳瓦尔在 ",[1079,4455,4457],{"className":4456},[2711],"《纳瓦尔宝典》"," 里说：",[1079,4460,4462],{"className":4461},[2711],"“判断力是财富的关键，远超努力程度。”"," 挣钱这件事，从来都是 ",[1079,4465,4467],{"className":4466},[3251],"“选择大于努力”","。有些工作天生有天花板，哪怕你再努力，也很难突破收入上限；而有些挣钱方式，看似前期难，但一旦跑通，就能让钱为你工作。",[3296,4470],{"alt":4471,"className":4472,"fit":3304,"src":4473,"style":3681},"钱罐子 micheile-henderson-ZVprbBmT8QA-unsplash",[3299,3300,3302,3303],"\u002Fimages\u002Fillustration\u002Fmicheile-henderson-ZVprbBmT8QA-unsplash.webp",[25,4475,4476],{},"最健康的状态，是 “主业保底，副业探索”。利用业余时间，找一些低成本、自己感兴趣，又有可能带来收益的事尝试：喜欢写作就写公众号，擅长拍照就接写真，懂某个领域就做知识分享。",[25,4478,4479,4480,1109],{},"这就像学习弹钢琴，不是一蹴而就的，需要持续练习、不断试错。我现在做自由职业，一边运营独立站，一边分享自己的经历，就是在探索 “多元收入” 的可能性。哪怕现在暂时没收入，但我知道，这些尝试都是在为未来铺路 —— ",[1079,4481,4483],{"className":4482},[3037],"总有一天，这些尝试会变成能给自己带来被动收入的 “资产”",[3257,4485,4486],{},[25,4487,4488,4492],{},[1079,4489,4491],{"className":4490},[2711],"《穷爸爸富爸爸》：“穷人为钱工作，富人让钱为自己工作”。","\n这句话不是鼓励大家辞职创业，而是提醒我们：别把所有鸡蛋放在一个篮子里，多拓展一条收入渠道，就多一份抵御风险的底气。",[145,4494,4496],{"id":4495},"总结认知决定差异","总结：认知决定差异",[25,4498,4499,4500,4504],{},"回头看这十年，我走的每一步弯路、每一次进步，本质上都是 ",[1079,4501,4503],{"className":4502},[3251],"“认知升级”"," 的结果。",[25,4506,4507],{},"从 “只知道埋头干活” 到 “主动规划人生”，从 “觉得打工是唯一出路” 到 “探索多元收入”，从 “在意别人的看法” 到 “接纳自己的不完美”—— 这些变化，让我从一个迷茫的职场新人，变成了现在有目标、有底气、有热爱的自由职业者。",[25,4509,4510],{},"马云、雷军之所以能取得今天的成就，不是因为他们比别人多一个鼻子、一双眼睛，而是因为他们的认知维度远超普通人。他们看到了别人看不到的机会，想到了别人想不到的方法，所以才能在时代浪潮中脱颖而出。",[25,4512,4513],{},"我们普通人或许成不了马云、雷军，但至少可以通过学习、探索，提升自己的认知，让自己活得更通透、更自由。当你觉得努力没用时，别着急否定自己，可能是认知没跟上；当你遇到瓶颈时，别硬扛，多看看别人的生活，多学新的思维方式，说不定就能找到新的突破口。",[25,4515,4516,4517,4521],{},"人的可塑性是无限的，就像海明威说的：“",[1079,4518,4520],{"className":4519},[2711],"生活总是让我们遍体鳞伤，但到后来，那些受伤的地方一定会变成我们最强壮的地方","”。",[25,4523,4524],{},[1079,4525,4527],{"className":4526},[3037],"愿我们都能在不断升级认知的过程中，活成自己喜欢的样子，既有直面现实的勇气，也有追求梦想的底气。",[3296,4529],{"alt":4530,"className":4531,"fit":3304,"src":4532,"style":3681},"dream big do big claudio-schwarz-5c0U4CY_lwA-unsplash",[3299,3300,3302,3303],"\u002Fimages\u002Fillustration\u002Fclaudio-schwarz-5c0U4CY_lwA-unsplash.webp",{"title":41,"searchDepth":180,"depth":180,"links":4534},[4535,4536,4537,4538,4539,4540],{"id":4195,"depth":180,"text":4196},{"id":4297,"depth":180,"text":4298},{"id":4344,"depth":180,"text":4345},{"id":4384,"depth":180,"text":4385},{"id":4435,"depth":180,"text":4436},{"id":4495,"depth":180,"text":4496},"前几天和妈妈聊天，谈到工作和收入，我突然意识到：人与人之间的选择差异，其实源于观念的差异。这让我不禁回想：如果重回二十出头，有哪些观念，是我希望自己能早点明白的？十年职业生涯，像一场漫长的徒步。我整理行囊，发现有些道理如同指南针，虽朴素，却始终指向远方","\u002Fblog\u002Flife-lessons-i-wish-i-knew-earlier",{"title":4170,"description":4541},{"loc":4545,"images":4546},"\u002Fblog\u002Flife-lessons-i-wish-i-knew-earlier\u002Findex.zh-cn",[4547,4548,4549,4550,4551,4552,4553,4554],{"loc":4192},{"loc":4159},{"loc":4294},{"loc":4327},{"loc":4381},{"loc":4432},{"loc":4473},{"loc":4532},{"id":4556,"artifactId":7,"backgroundImg":7,"category":2570,"date":4557,"extension":10,"lastmod":7,"listPreviewImg":7,"meta":4558,"ogImage":7,"stem":4559,"tags":4560,"__hash__":4564,"title":4565,"body":4566,"description":4640,"lang":560,"navigation":570,"path":4641,"seo":4642,"sitemap":4643,"kind":996,"artifactItem":-1},"article\u002Fblog\u002Fstop-switching-tools-in-2026\u002Findex.zh-CN.md","2026-01-08",{"artifactId":7,"lastmod":7,"backgroundImg":7,"ogImage":7,"listPreviewImg":-1},"blog\u002Fstop-switching-tools-in-2026\u002Findex.zh-CN",[3449,4561,4562,4563],"toolkit","workflow","independent_development","OpB7cUd1XcABkA8QLg3Z-kfXddxHsBuqYx4remOOGvI","今年不再折腾各种工具了",{"type":22,"value":4567,"toc":4638},[4568,4571,4574,4577,4615,4622,4630,4633],[25,4569,4570],{},"今天花了比较多的时间把2026年的计划大概整理出来了。也梳理了一下工具。去年用了一年的 Obsidian，它最大的优点是插件丰富，扩展功能很强大。但其实UI和交互逻辑并不符合我的习惯。",[25,4572,4573],{},"我深入剖析了自己的真实需求后，我把每个核心需求点分拆分开来，用不同的工具处理不同的场景。不再妄想一个工具解决所有问题。",[25,4575,4576],{},"整理后的工具清单：",[1073,4578,4579,4586,4593,4600,4608],{},[49,4580,4581,4585],{},[1079,4582,4584],{"className":4583},[3687],"flomo","：日常、零碎的记录 - 拥有最好、最方便的回顾功能。",[49,4587,4588,4592],{},[1079,4589,4591],{"className":4590},[2711],"滴答清单","：待办、计划规划、愿望清单，等清单类，以及轻量化笔记 - 滴答清单的体验最好，而且拥有日历视图，待办事项一目了然",[49,4594,4595,4599],{},[1079,4596,4598],{"className":4597},[3037],"小日常","：用来日常打卡，记录日常习惯 - UI 简洁好看，无使用负担。光芒值的设计很有特点",[49,4601,4602,4607],{},[1079,4603,4606],{"className":4604},[4605],"text-success","豆瓣","：用来记录影音、书籍的阅读记录",[49,4609,4610,4614],{},[1079,4611,4613],{"className":4612},[2711],"腾讯文档","：大型的文档记录，思维导图，表格等等。",[25,4616,4617,4618,1109],{},"这个用法坚持一年看看，不再乱折腾工具，耽误时间了。",[1079,4619,4621],{"className":4620},[3251],"把重点放到关键目标的实现上",[25,4623,4624,4625,4629],{},"昨天整理 flomo 的时候，翻到了去年刚离职时写下的对未来的畅想：",[1079,4626,4628],{"className":4627},[3037],"最终目标，是打造一个工作与生活一体化、赚钱与热情共存的职业生涯","。希望今年，能达成里程碑式的进展。",[25,4631,4632],{},"2026加油。",[3296,4634],{"alt":4635,"src":4636,"style":4637},"flomo 笔记卡片 2025年08月08日","\u002Fimages\u002Fillustration\u002Fflomo-card-20250808.webp","margin: 20px auto; width: 400px;",{"title":41,"searchDepth":180,"depth":180,"links":4639},[],"今天花了比较多的时间把2026年的计划大概整理出来了。也梳理了一下工具。去年用了一年的 Obsidian，它最大的优点是插件丰富，扩展功能很强大。但其实UI和交互逻辑并不符合我的习惯。我深入剖析了自己的真实需求后，我把每个核心需求点分拆分开来，用不同的工具处理不同的场景。不再妄想一个工具解决所有问题。","\u002Fblog\u002Fstop-switching-tools-in-2026",{"title":4565,"description":4640},{"loc":4644,"images":4645},"\u002Fblog\u002Fstop-switching-tools-in-2026\u002Findex.zh-cn",[4646],{"loc":4636},{"id":4648,"artifactId":7,"backgroundImg":4649,"category":8,"date":4650,"extension":10,"lastmod":7,"listPreviewImg":4651,"meta":4655,"ogImage":4649,"stem":4657,"tags":4658,"__hash__":4660,"title":4661,"body":4662,"description":4878,"lang":560,"navigation":570,"path":4879,"seo":4880,"sitemap":4881,"kind":996,"artifactItem":-1},"article\u002Fblog\u002Ffreelance-experiment-journey\u002Findex.zh-CN.md","\u002Fimages\u002Fblog-bg\u002Folena-bohovyk-dIMJWLx1YbE-unsplash.webp","2026-01-06",{"url":4649,"alt":4652},{"en":4653,"zh-CN":4654},"computer desk olena-bohovyk-dIMJWLx1YbE-unsplash","电脑桌面 olena-bohovyk-dIMJWLx1YbE-unsplash",{"artifactId":7,"lastmod":7,"backgroundImg":4649,"ogImage":4649,"listPreviewImg":4656},{"url":4649,"alt":4654},"blog\u002Ffreelance-experiment-journey\u002Findex.zh-CN",[3448,4659,4563,3450],"mental_health","9UU4QVQho2krRix0PNvwZfxNpu532adQjzjVBdQhxcI","我的自由职业实验：接纳“龟速”，方能致远",{"type":22,"value":4663,"toc":4871},[4664,4670,4679,4684,4687,4694,4698,4700,4704,4707,4715,4718,4732,4735,4745,4750,4752,4756,4759,4770,4773,4782,4784,4788,4791,4799,4804,4806,4810,4813,4821,4826,4828,4832,4839,4842,4845,4853,4858,4860,4866],[25,4665,4666],{},[1079,4667,4669],{"className":4668},[3037],"辞职大半年，我的“龟速”自由职业实验",[25,4671,4672,4673],{},"——",[163,4674,4678],{"className":4675},[4676,4677],"text-inverted","bg-inverted","在不确定的时代，寻找属于自己的节奏",[25,4680,4681],{},[2629,4682,4683],{},"文\u002F一位探索中的自由职业者",[25,4685,4686],{},"看着飞书打卡记录上“不到 40 天”的工作统计，我忍不住笑了。从五月份辞职算起，大半年过去了；从十月份正式尝试自由职业算起，三个月溜走了；而我的第一个项目，像个学步的孩子，磕磕绊绊地在去年十一月底上线了，目前还在陆陆续续更新。",[25,4688,4689,4690],{},"如果按照自媒体上常见的“成功学剧本”，我大概是个反面教材：别人一个月上线几十个项目，我花两个月才磨出一个；别人谈论着高效变现，我还在纠结“每天工作几小时才算自由职业”。但奇妙的是，我并没有焦虑，反而有一种从未有过的踏实感。 ",[1079,4691,4693],{"className":4692},[3037],"自由职业的第一课，或许是先学会与“慢”和解。",[3296,4695],{"alt":4696,"className":4697,"fit":3304,"src":4649,"style":3681},"computer on desk olena-bohovyk-dIMJWLx1YbE-unsplash",[3299,3300,3302,3303],[977,4699],{},[145,4701,4703],{"id":4702},"一当时间完全属于自己我才真正认识了自律","一、当时间完全属于自己，我才真正认识了“自律”",[25,4705,4706],{},"辞职前，我幻想过无数种自由职业的潇洒：睡到自然醒，咖啡店码字，随时来场说走就走的旅行……现实却给了我一个温柔的“耳光”：时间越多，越需要梳理；没人管束，反而更要自我约束。",[25,4708,4709,4710,4714],{},"经过这几个月的摸索，我给自己定了一条铁律：",[1079,4711,4713],{"className":4712},[3037],"每天专注工作 4 小时左右","。这个数字看似“不努力”，却逼着我做减法——在有限的时间里，必须抓住重点，拒绝伪忙碌。这就像背包徒步：不是带得越多越好，而是每一件物品都要有用。",[25,4716,4717],{},"但挑战远不止于此。获得时间自主权后，我的愿望清单爆炸了：",[1073,4719,4720,4723,4726,4729],{},[49,4721,4722],{},"工作（理所当然）",[49,4724,4725],{},"打游戏（报复性补偿过去亏欠的时光）",[49,4727,4728],{},"剪视频（堆积如山的素材在呐喊）",[49,4730,4731],{},"带娃、户外、看书、练琴、运动……",[25,4733,4734],{},"每个选项都在招手，而选择本身成了新的课题。我渐渐明白：",[3257,4736,4737],{},[25,4738,4739],{},[1079,4740,4744],{"className":4741},[3411,3037,4742,4743],"py-4","mt-4","自由不是“想做什么就做什么”，而是“决定不做什么时，心里不慌”。",[3296,4746],{"alt":4747,"className":4748,"fit":3304,"src":4749,"style":3681},"clock icons8-team-dhZtNlvNE8M-unsplash",[3299,3300,3302,3303],"\u002Fimages\u002Fillustration\u002Ficons8-team-dhZtNlvNE8M-unsplash.webp",[977,4751],{},[145,4753,4755],{"id":4754},"二计划赶不上变化生活本就是一场动态平衡","二、计划赶不上变化？生活本就是一场动态平衡",[25,4757,4758],{},"自由职业的日程表，永远写满了“意外”：",[1073,4760,4761,4764,4767],{},[49,4762,4763],{},"突然抽中 TESTV 的徒步活动，立马收拾背包进山；",[49,4765,4766],{},"家人决定全家来一次旅游；",[49,4768,4769],{},"娃生病、自己生病、爷爷生日……",[25,4771,4772],{},"生活琐事轮番上阵。",[25,4774,4775,4776,4781],{},"算下来，过去的两三个月里，真正投入工作的日子才 40 天左右。但奇怪的是，",[1079,4777,4780],{"className":4778},[4779],"text-highlighted","这种“被打断”反而让我更珍惜能专注的时刻","。就像农耕时代的人们顺应节气劳作，我也在学着顺应生活的节奏——忙时深耕，闲时撒种，不急不躁。",[977,4783],{},[145,4785,4787],{"id":4786},"三放弃功利式自媒体我找到了写作的初心","三、放弃“功利式自媒体”，我找到了写作的初心",[25,4789,4790],{},"我曾试图按照主流建议，尝试以“十年前端开发者”的人设写技术文章。但每次提笔都像在写产品文档，毫无表达的快乐。这让我写作分享的欲望跌至谷底，所以更新的频率及其的低。AI 虽然可以帮我优化文案，却无法替我感受。",[25,4792,4793,4794,4798],{},"直到我彻底放下“要靠自媒体赚钱”的执念，才终于释怀：",[1079,4795,4797],{"className":4796},[3037],"如果表达本身不能带来快乐，它终将变成另一种形式的上班。","现在，我重新开始写作，只为记录真实的思考与见闻。就像画家写生，不为参展，只为捕捉那一刻的光。",[3296,4800],{"alt":4801,"className":4802,"fit":3304,"src":4803,"style":3681},"book and coffee yannick-pulver-hopX_jpVtRM-unsplash",[3299,3300,3302,3303],"\u002Fimages\u002Fillustration\u002Fyannick-pulver-hopX_jpVtRM-unsplash.webp",[977,4805],{},[145,4807,4809],{"id":4808},"四图书馆我的精神充电站","四、图书馆，我的精神充电站",[25,4811,4812],{},"状态不好时，我会带着电脑去图书馆泡一天。那里有最好的“氛围组”：埋头备考的学生、专注阅读的老人、敲代码的同行……冬暖夏凉，免费开放，还能闻到纸墨的香气。",[25,4814,4815,4816,4820],{},"坐在图书馆里，我常想起古希腊哲学家第欧根尼的故事：当亚历山大大帝问他需要什么时，他只说：",[1079,4817,4819],{"className":4818},[2711],"“请不要挡住我的阳光。”"," 在这个物质丰裕的时代，我们或许低估了免费资源的珍贵——公园的阳光、博物馆的展览、图书馆的知识，它们才是生活的底色。",[3296,4822],{"alt":4823,"className":4824,"fit":3304,"src":4825,"style":3681},"library trnava-university-sd8uJsf4XM4-unsplash",[3299,3300,3302,3303],"\u002Fimages\u002Fillustration\u002Ftrnava-university-sd8uJsf4XM4-unsplash.webp",[977,4827],{},[145,4829,4831],{"id":4830},"尾声慢下来才能看见路标","尾声：慢下来，才能看见路标",[25,4833,4834,4835],{},"有人问我，没有收入会不会焦虑？偶尔会。但更多的是一种笃定：",[1079,4836,4838],{"className":4837},[3251],"人生不是冲刺跑，而是一场定向越野。重要的不是速度，是知道自己要去哪里，以及享受途中的风景。",[25,4840,4841],{},"第一个项目练手的意义，远大于结果。它让我摸清了独立站出海的全流程，学会了用 Nuxt 框架，还验证了“4 小时工作制”的可行性。下一个项目，或许能用一半时间完成。但即使不能，也没关系。",[25,4843,4844],{},"自由职业于我，不是逃离职场的手段，而是重新认识生活的方式。比起拼命追赶别人的节奏，我更愿意在自己的时区里，种一棵树，等它自然生长。",[25,4846,4847,4848,4852],{},"正如梭罗在《瓦尔登湖》中所写：",[1079,4849,4851],{"className":4850},[2711],"“我愿意深深地扎入生活，吮尽生活的骨髓。”","现在的我，正尝试用另一种姿势，深深扎入属于自己的生活。",[3296,4854],{"alt":4855,"className":4856,"fit":3304,"src":4857,"style":3681},"slow down sign logan-weaver-lgnwvr-PJYOpJCcbRg-unsplash",[3299,3300,3302,3303],"\u002Fimages\u002Fillustration\u002Flogan-weaver-lgnwvr-PJYOpJCcbRg-unsplash.webp",[977,4859],{},[25,4861,4862],{},[1079,4863,4865],{"className":4864},[4779],"或许，最好的“自由职业计划”，就是允许自己活得像个活生生的人。",[3296,4867],{"alt":4868,"className":4869,"fit":3304,"src":4870,"style":3681},"man look up the starry sky greg-rakozy-oMpAz-DN-9I-unsplash",[3299,3300,3302,3303],"\u002Fimages\u002Fillustration\u002Fgreg-rakozy-oMpAz-DN-9I-unsplash.webp",{"title":41,"searchDepth":180,"depth":180,"links":4872},[4873,4874,4875,4876,4877],{"id":4702,"depth":180,"text":4703},{"id":4754,"depth":180,"text":4755},{"id":4786,"depth":180,"text":4787},{"id":4808,"depth":180,"text":4809},{"id":4830,"depth":180,"text":4831},"辞职大半年，我的“龟速”自由职业实验-在不确定的时代，寻找属于自己的节奏","\u002Fblog\u002Ffreelance-experiment-journey",{"title":4661,"description":4878},{"loc":4882,"images":4883},"\u002Fblog\u002Ffreelance-experiment-journey\u002Findex.zh-cn",[4884,4885,4886,4887,4888,4889],{"loc":4649},{"loc":4749},{"loc":4803},{"loc":4825},{"loc":4857},{"loc":4870},[4891,4920,4945,5032,5087,5142],{"id":4892,"anchorId":4893,"artifactId":7,"category":2570,"date":2571,"extension":4894,"meta":4895,"stem":4896,"tags":4897,"__hash__":4900,"contentFile":4901,"kind":4919,"artifactItem":-1},"thoughtsMetadata\u002Fthoughts\u002F20260621-00\u002Fmeta.json","thoughts-2026-06-21","json",{},"thoughts\u002F20260621-00\u002Fmeta",[4898,4899,2584,2583],"dating","new_things","--SwX-KkAo2KMOpK6XCIgz72Vr8Y_0CX0MLF-wFD1zQ",{"id":4902,"title":4903,"body":4904,"description":4908,"extension":10,"meta":4914,"navigation":570,"path":4915,"seo":4916,"stem":4917,"__hash__":4918},"thoughts\u002Fthoughts\u002F20260621-00\u002Findex.zh-CN.md","IndexZh CN",{"type":22,"value":4905,"toc":4912},[4906,4909],[25,4907,4908],{},"端午假期的最后一天是跟 Nova 约会的日子，我们把 Evan 交给了奶奶，尽情享受二人世界。我们一起尝试了一下火遍了全网的拼豆。不试不知道，一试就发现拼豆真的很有趣，它的本质就是手工绘制像素画。做完后还能做成各种装饰品，冰箱贴，挂在墙上或者做成钥匙扣都很不错。而且图案没有任何限制：动漫、影视、游戏、甚至复刻照片都可以。想出这门生意的人真是天才！",[2599,4910],{":images":4911},"[{\"src\":\"\u002Fimages\u002Fillustration\u002Fpindou-1.webp\",\"alt\":\"海绵宝宝拼豆原图\"},{\"src\":\"\u002Fimages\u002Fillustration\u002Fpindou-2.webp\",\"alt\":\"海绵宝宝拼豆拼好后的样子\"},{\"src\":\"\u002Fimages\u002Fillustration\u002Fpindou-3.webp\",\"alt\":\"海绵宝宝拼豆最终成品\"}]",{"title":41,"searchDepth":180,"depth":180,"links":4913},[],{},"\u002Fthoughts\u002F20260621-00\u002Findex.zh-cn",{"description":4908},"thoughts\u002F20260621-00\u002Findex.zh-CN","SMopRkrqM9d3xbSAWnus6DZkDSZ4RKhfKdmFyWFUDQs","thought",{"id":4921,"anchorId":4922,"artifactId":7,"category":2570,"date":4923,"extension":4894,"meta":4924,"stem":4925,"tags":4926,"__hash__":4927,"contentFile":4928,"kind":4919,"artifactItem":-1},"thoughtsMetadata\u002Fthoughts\u002F20260619-00\u002Fmeta.json","thoughts-2026-06-19","2026-06-19",{},"thoughts\u002F20260619-00\u002Fmeta",[4659,2908],"OelFWw7kFozxyrLJJ7ZKE1NegafH8U-Mwu7sPhb8mhg",{"id":4929,"title":4903,"body":4930,"description":4934,"extension":10,"meta":4940,"navigation":570,"path":4941,"seo":4942,"stem":4943,"__hash__":4944},"thoughts\u002Fthoughts\u002F20260619-00\u002Findex.zh-CN.md",{"type":22,"value":4931,"toc":4938},[4932,4935],[25,4933,4934],{},"人的思想有时候就很奇怪：",[25,4936,4937],{},"看到别人夸自己的孩子，脑子里不自觉的会冒出“炫耀、得瑟”。若是看到别人说自己孩子不行，脑子里则会冒出“不过如此，也就这样”的词。每每都要稍作一些斗争才能摆脱这种无聊念头。",{"title":41,"searchDepth":180,"depth":180,"links":4939},[],{},"\u002Fthoughts\u002F20260619-00\u002Findex.zh-cn",{"description":4934},"thoughts\u002F20260619-00\u002Findex.zh-CN","KtU3CH4nNqBtLqEt_5Uzfz8hxQX_NsEqkBOTaDpKOxQ",{"id":4946,"anchorId":4947,"artifactId":7,"category":2570,"date":4948,"extension":4894,"meta":4949,"stem":4950,"tags":4951,"__hash__":4953,"contentFile":4954,"kind":4919,"artifactItem":-1},"thoughtsMetadata\u002Fthoughts\u002F20260618-00\u002Fmeta.json","thoughts-2026-06-18","2026-06-18",{},"thoughts\u002F20260618-00\u002Fmeta",[4952,2908],"innocence","gge4-XDSvjtizSG3ZoJ68jY36u43o7fHPmu18IZnbVs",{"id":4955,"title":4903,"body":4956,"description":4960,"extension":10,"meta":5027,"navigation":570,"path":5028,"seo":5029,"stem":5030,"__hash__":5031},"thoughts\u002Fthoughts\u002F20260618-00\u002Findex.zh-CN.md",{"type":22,"value":4957,"toc":5025},[4958,4961,4972,4983,4989,4991,4994,4999,5005,5010,5015,5020],[25,4959,4960],{},"《兴奋》",[25,4962,4963,4966,4967],{},[1079,4964,4965],{},"Evan","：耶耶耶，大晚上的出门咯！",[2629,4968,4971],{"className":4969},[4970],"text-dimmed","（一边兴奋的大喊，一边在座位上蹦蹦跳跳的。我们23点出发回益阳，端午怕堵车）",[25,4973,4974,4977,4978,4982],{},[1079,4975,4976],{},"老婆","：",[2629,4979,4981],{"className":4980},[4970],"（开心的看着 Evan，过了一会儿对我说）","上次我们这样开心和兴奋是什么时候了？",[25,4984,4985,4988],{},[1079,4986,4987],{},"我","：记不得了",[977,4990],{},[25,4992,4993],{},"《公主》",[25,4995,4996,4998],{},[1079,4997,4987],{},"：千千你认识孙悟空吗？",[25,5000,5001,5004],{},[1079,5002,5003],{},"千千","：是谁呀",[25,5006,5007,5009],{},[1079,5008,4987],{},"：齐天大圣孙悟空你不认识吗？",[25,5011,5012,5014],{},[1079,5013,5003],{},"：？",[25,5016,5017,5019],{},[1079,5018,5003],{},"：...",[25,5021,5022,5024],{},[1079,5023,5003],{},"：我只认识公主",{"title":41,"searchDepth":180,"depth":180,"links":5026},[],{},"\u002Fthoughts\u002F20260618-00\u002Findex.zh-cn",{"description":4960},"thoughts\u002F20260618-00\u002Findex.zh-CN","xyUlSg5OFQ4fNXUn8zu04p4qDSYAemjYxFqIimDDczQ",{"id":5033,"anchorId":5034,"artifactId":7,"category":8,"date":5035,"extension":4894,"meta":5036,"stem":5037,"tags":5038,"__hash__":5041,"contentFile":5042,"kind":4919,"artifactItem":-1},"thoughtsMetadata\u002Fthoughts\u002F20260616-00\u002Fmeta.json","thoughts-2026-06-16","2026-06-16",{},"thoughts\u002F20260616-00\u002Fmeta",[5039,5040],"changelog","mind_collection","o9buSz_Wf4QdPGHhdj4F5KRUhArbo7P_ptciDUME-sY",{"id":5043,"title":4903,"body":5044,"description":5081,"extension":10,"meta":5082,"navigation":570,"path":5083,"seo":5084,"stem":5085,"__hash__":5086},"thoughts\u002Fthoughts\u002F20260616-00\u002Findex.zh-CN.md",{"type":22,"value":5045,"toc":5079},[5046,5060,5068,5076],[25,5047,5048,5049,5053,5054,5059],{},"折腾了几天，终于把",[2819,5050,5052],{"href":5051},"\u002Fmind-collection","心灵馆藏","页面做好了。设计数据、设计样式和动画，还挺有趣的。我一直想记录自己看过的书、玩过的游戏、看过的电影什么的，不过一直没有找到很好的方式。前段时间刷到一个网站 ",[2819,5055,5058],{"href":5056,"target":5057},"https:\u002F\u002Faletagency.com\u002F","_blank","Alet Agency","，感觉很有启发。于是借鉴他的布局做了这个第一版。",[25,5061,5062,5063,5067],{},"第一次用 ",[163,5064,5066],{"className":5065},[3037],"motion.dev"," 这个框架来做动画，确实比手搓要方便很多。第一版的动画还比较基础，过滤、筛选功能都还没有。后续再慢慢迭代，先把功能捣鼓出来。这次自己我感觉比较满意的几个地方是：",[1073,5069,5070,5073],{},[49,5071,5072],{},"动画是完美兼容 PC 和移动端的",[49,5074,5075],{},"新页面和博客数据是同一份数据，属于“一鸡两吃”了，而且两边通过链接合理的关联了起来",[25,5077,5078],{},"目前数据不多，后面再慢慢补充吧。",{"title":41,"searchDepth":180,"depth":180,"links":5080},[],"折腾了几天，终于把心灵馆藏页面做好了。设计数据、设计样式和动画，还挺有趣的。我一直想记录自己看过的书、玩过的游戏、看过的电影什么的，不过一直没有找到很好的方式。前段时间刷到一个网站 Alet Agency，感觉很有启发。于是借鉴他的布局做了这个第一版。",{},"\u002Fthoughts\u002F20260616-00\u002Findex.zh-cn",{"description":5081},"thoughts\u002F20260616-00\u002Findex.zh-CN","Hx2EHQicmk77-A_MqB-Y0DI3fuQdkwdAFLBrNbpxiBE",{"id":5088,"anchorId":5089,"artifactId":7,"category":2570,"date":2741,"extension":4894,"meta":5090,"stem":5091,"tags":5092,"__hash__":5093,"contentFile":5094,"kind":4919,"artifactItem":-1},"thoughtsMetadata\u002Fthoughts\u002F20260614-00\u002Fmeta.json","thoughts-2026-06-14",{},"thoughts\u002F20260614-00\u002Fmeta",[4952,2908],"qK2u645PSOv2HsbUNAnzz4PUsPSNyaU6INHww7czye4",{"id":5095,"title":4903,"body":5096,"description":5102,"extension":10,"meta":5137,"navigation":570,"path":5138,"seo":5139,"stem":5140,"__hash__":5141},"thoughts\u002Fthoughts\u002F20260614-00\u002Findex.zh-CN.md",{"type":22,"value":5097,"toc":5135},[5098,5103,5109,5115,5120,5125,5130],[25,5099,5100],{},[1079,5101,5102],{},"《普通话人》",[25,5104,5105,5108],{},[1079,5106,5107],{},"孩子妈："," 你是哪里人？",[25,5110,5111,5114],{},[1079,5112,5113],{},"Evan："," 我是长沙人",[25,5116,5117,5119],{},[1079,5118,5107],{}," 但是你不会说长沙话",[25,5121,5122,5124],{},[1079,5123,5113],{}," 我会说益阳话",[25,5126,5127,5129],{},[1079,5128,5107],{}," 那你是益阳人咯？",[25,5131,5132,5134],{},[1079,5133,5113],{}," 不是，我是普通话人",{"title":41,"searchDepth":180,"depth":180,"links":5136},[],{},"\u002Fthoughts\u002F20260614-00\u002Findex.zh-cn",{"description":5102},"thoughts\u002F20260614-00\u002Findex.zh-CN","lxMygKkDCy27Rs7hQt7v7SyzftRZwbYS0RB55BuVYfk",{"id":5143,"anchorId":5144,"artifactId":7,"category":8,"date":5145,"extension":4894,"meta":5146,"stem":5147,"tags":5148,"__hash__":5149,"contentFile":5150,"kind":4919,"artifactItem":-1},"thoughtsMetadata\u002Fthoughts\u002F20260609-00\u002Fmeta.json","thoughts-2026-06-09","2026-06-09",{},"thoughts\u002F20260609-00\u002Fmeta",[3451,4561,3450,4168],"y2hj2KSspusDz9iINSncx8YjArTOypuJ80CqkCT9Ry0",{"id":5151,"title":4903,"body":5152,"description":5156,"extension":10,"meta":5173,"navigation":570,"path":5174,"seo":5175,"stem":5176,"__hash__":5177},"thoughts\u002Fthoughts\u002F20260609-00\u002Findex.zh-CN.md",{"type":22,"value":5153,"toc":5171},[5154,5157,5163],[25,5155,5156],{},"前一段时间，被一个 serverless 服务部署与链接的问题困扰了很久，尝试了各个AI都没有解决后，最终是自己看文档搞定了细节。这时我才发现：我在不知不觉中已经养成了过度依赖AI的习惯，自己几乎停止了学习和思考，总是希望这个黑盒能帮我解决所有问题。",[25,5158,5159],{},[1079,5160,5162],{"className":5161},[3251],"这可不是一个好现象。",[25,5164,5165,5166,5170],{},"思来想去，我的决定是：不管 AI 多厉害，多强大，",[1079,5167,5169],{"className":5168},[3037],"知识还是要掌握在自己脑袋里，才是最夯实的","。永远要保证自己对问题的理解和解决方案的掌控，而不是完全依赖 AI 的输出。昨天找来了一些界面设计、产品设计相关的资料，每天还是要安排固定的时间学习才行。",{"title":41,"searchDepth":180,"depth":180,"links":5172},[],{},"\u002Fthoughts\u002F20260609-00\u002Findex.zh-cn",{"description":5156},"thoughts\u002F20260609-00\u002Findex.zh-CN","y9Bx4veGkb-lf9pWgv7y76KsBaisXrgbnJDLd81KVY4",[5179,5191,5203,5215],{"id":5180,"title":5181,"cover":2573,"coverDirection":5183,"coverWidth":5184,"createdAt":2571,"description":5185,"extension":4894,"meta":5188,"rating":2679,"stem":5189,"type":2581,"uniqueId":2569,"updatedAt":2571,"__hash__":5190},"artifacts\u002Fartifacts\u002Fconcert-black-myth-wukong.json",{"zh-CN":2677,"en":5182},"Black Myth: Wukong - Journey with Music, Listen to Destiny","landscape","320",{"zh-CN":5186,"en":5187},"一场以黑神话：悟空为主题的音乐会。","A concert themed around Black Myth: Wukong.",{},"artifacts\u002Fconcert-black-myth-wukong","04cneA0tHwEsz6UyGJNAfDr8XNmBTkAm_jGs9JvGCKk",{"id":5192,"title":5193,"cover":2743,"coverDirection":5195,"coverWidth":5196,"createdAt":2741,"description":5197,"extension":4894,"meta":5200,"rating":2796,"stem":5201,"type":2795,"uniqueId":2740,"updatedAt":2741,"__hash__":5202},"artifacts\u002Fartifacts\u002Fgame-hogwarts-legacy.json",{"zh-CN":2793,"en":5194},"Hogwarts Legacy","portrait","220",{"zh-CN":5198,"en":5199},"一款以霍格沃兹魔法世界为背景的角色扮演游戏。","A role-playing game set in the magical world of Hogwarts.",{},"artifacts\u002Fgame-hogwarts-legacy","eb03lWIcOmYr3H58ECelspO3hxqqCfb9h7_vpUNjgbM",{"id":5204,"title":5205,"cover":2864,"coverDirection":5183,"coverWidth":5207,"createdAt":5208,"description":5209,"extension":4894,"meta":5212,"rating":2899,"stem":5213,"type":2872,"uniqueId":2861,"updatedAt":5208,"__hash__":5214},"artifacts\u002Fartifacts\u002Fmovie-harry-potter.json",{"zh-CN":2897,"en":5206},"Harry Potter Series","340","2026-06-13",{"zh-CN":5210,"en":5211},"关于魔法世界的奇幻冒险故事。","A fantasy adventure story set in the magical world.",{},"artifacts\u002Fmovie-harry-potter","UIS42rAfdUHfM8YqKelCVczY_ZwrYOJp1MJ3rf-8DHU",{"id":5216,"title":5217,"cover":2802,"coverDirection":5195,"coverWidth":5219,"createdAt":2902,"description":5220,"extension":4894,"meta":5223,"rating":2858,"stem":5224,"type":2857,"uniqueId":2799,"updatedAt":2902,"__hash__":5225},"artifacts\u002Fartifacts\u002Fbook-blindness.json",{"zh-CN":2855,"en":5218},"Blindness","240",{"zh-CN":5221,"en":5222},"关于人性、秩序与恐惧边界的一次阅读记录。","A reading note on human nature, social order, and fear.",{},"artifacts\u002Fbook-blindness","Bq6r_XMlw4IMNqsqJoTakvi95JWPXpkBWlTV5jXXR9A",{"concert-black-myth-wukong":5227,"game-hogwarts-legacy":5228,"book-blindness":5229,"movie-harry-potter":5230},[2567],[2738],[2797],[2859],1782739114336]