#Astro
11 篇
把一座 Three.js 浮岛搬进静态站
浮岛页只下载自己那一份脚本。场景在运行时现算,Three.js 与整个三维世界都留在这一页的 chunk 里,首屏 HTML 里只有一个空舞台。
3D 的加载预算:分包、可见才加载、以及什么时候该停下
一个 3D 页面有三笔成本 —— 下载、首帧编译、每帧绘制。三笔都要单独设预算,任何一笔失控都会让「好看」变成「卡」。
Islands 不是 Web Components:两种「按需加载」根本不是一回事
Islands 在构建期决定哪里需要 JS、什么时候水合;Web Components 在运行时给浏览器一个自带行为的元素。把它们当成同一件事,会选错工具。
1059 项断言,零测试框架:纯逻辑必须零 import
我的自检是 node scripts/selftest.ts 直接跑的,没有测试框架也没有依赖。代价是纯逻辑模块一个相对 import 都不能有,而这个代价换来了代码形状。
用 Astro islands 把首屏 JS 压到零
从「异步引入」到「按需水合」,讲清楚三层懒加载分别解决什么问题,并给出这个站点里真实在跑的代码。
构建期分页:静态站的翻页为什么不该用查询参数
列表分页在构建时切成静态页,第 N 页是一个真实路由。没有客户端分页逻辑,也不用查询串,翻页就是纯链接跳转。
@/ 别名的三处配置:Vite、TypeScript 与 SCSS 缺一不可
全项目禁用深层相对引入,代价是别名要在三个地方各配一次。少配一处,症状分别是编辑器报错、构建失败、样式静默丢失。
zod 做 frontmatter 契约:把文章格式变成构建期错误
Content Collections 的 schema 是唯一真相。标题超 120 字、日期写错、标签写成字符串,都在构建期直接失败,而不是线上少一页。
为什么我又搭了一个个人主页
不是没有地方写东西,而是没有一个地方能同时放文章、小游戏和工具。顺便说说这次的技术选型为什么是 Astro 而不是 VitePress。
零配置注册表:新增一个游戏等于新建一个目录
列表、详情路由、首页精选、sitemap 全部由 import.meta.glob 自动发现。代价是必须接受「字面量相对路径」这条 Vite 的硬规则。
视图不存逻辑:把数据装配全部收进 src/server
页面里只剩路由导出与组件引入,取数、拼路径、算日期全部移到 src/server。说说这么分的收益,以及它逼出来的一个类型约束。
