LessJS v0.4.0 只有一个核心主题:Serverless 集成跑通了。
从 v0.3.2 开始,LessJS 的架构文档里就写着 "API Routes 可以部署为 Serverless",但直到这个版本,它才真正 CI 自动化、真正跑在生产环境上。
这 12 个 commit 是从"文档描述"到"真机部署"的全过程:
| 阶段 | 问题 | 解决方案 |
|---|---|---|
| 部署平台迁移 | deployctl(旧平台 Classic)废弃 |
迁移到 deno deploy(新平台 v2) |
| CORS | hono/cors 中间件在 Deno Deploy 上不兼容 |
手动设置 Access-Control-Allow-Origin |
| 入口路径 | deployctl 和 deno deploy 的入口解析不一致 | 用 --entrypoint=serverless.ts 明确指定 |
| Import Map | Deno Deploy 读不到 workspace 配置 | 从 clean temp dir 部署,自带 deno.json |
| CI 触发 | 只 push main + demo/** 变更 | deploy-api.yml 自动化 + workflow_dispatch |
最终成果:less-demo-api.sisyphuszheng.deno.net 生产在线,CI 自动部署,前端 less-hero-ping 一键 verify。 这是 LessJS Jamstack 承诺的 "J"(Markup)+ "A"(API)+
"M"(Markup) 全链路闭环。
| 变更 | 说明 | 版本 |
|---|---|---|
| 新组件:less-hero-ping | 可配置 API 的 ping 按钮,🟢/🔴 状态点 | 0.3.6 → 0.4.0 |
| less-layout | sidebar 240px → clamp(200px, 20vw, 280px),max-width 变量化 | 0.3.5 |
| 全组件边框统一 | less-button/card/input/code-block/layout 全部 0.5px | 0.3.5 |
| less-input | 修复 undefined string 问题 | 0.3.5 |
| less-button | 修复 nothing 输出 | 0.3.5 |
| less-code-block | 修复 timeout cleanup | 0.3.5 |
| theme-toggle | ARIA 修复,动画访问性 | 0.3.5 |
| effects token | 暗色模式阴影修复 | 0.3.5 |
| vite.config.build | 新增 less-hero-ping 构建入口 | 0.3.5 |
| index.ts | 导出 less-hero-ping,islands 数组 +1 | 0.3.6 |
| 变更 | 说明 |
|---|---|
| Service Worker | PRECACHE 删除,networkFirst(HTML)+ cacheFirst(assets),动态缓存名 |
| SSR entry | 修复 Island 组件注册缺失(Lit SSR 渲染空标签问题) |
| 扫描器 | route-scanner 重构,isDirectory() 方法调用修复 |
| 上下文 | createSsrContext 改进 |
| 构建管线 | build-client + build-ssg 稳定化 |
| deploy.yml | 加 .version 缓存清除文件 |
| deno.json/jsr.json | 添加 CLI 导出 |
| types.ts | JSDoc 修复 |
| 变更 | 说明 |
|---|---|
| abort race 修复 | RPC 调用取消竞争条件修复 |
| 类别 | 变更 |
|---|---|
| 首页 | 全中文、响应式 clamp()、比较表、Quick start 修正、auto/% 尺寸 |
| 全站边框 | 17 个文件、40+ 处 1px → 0.5px 统一 |
| 主题 | 所有非 Hero 区域硬编码色 → --less-* CSS 变量 |
| Hero 可见度 | #555→#999,#444→#777,border-bottom 隔离 |
| 布局统一 | 首页 720px 内容宽度对齐 Guide 页面 |
| 博客 | v0.4.0 发布文、kiss-compiler 设计决策 |
| 架构文档 | 设计哲学、部署指南等同步更新 |
| README | 精简 80%,加 JSR badges,诚实 JS 大小 |
| 导航 | 侧边栏组织优化 |
| 流水线 | 变更 |
|---|---|
| Lint & Format | 稳定通过(跳过 docs/ 由于 Deno fmt bug) |
| Test | 并行化 test-core + test-ui + test-create,移除 coverage 步骤 |
| Publish | 自动检测 deno.json 版本变更,多包发布 |
| Deploy | 三步构建完整 CI,缓存清除 |
| 指标 | v0.3.2 | v0.4.0 |
|---|---|---|
| Lint 错误 | 有残留 | 0 |
| TypeScript 类型 | 有残留 | 0 errors |
| UI 测试通过 | 部分 | 84/84 |
| 全站 1px 残留 | 40+ 处 | 0 |
| 硬编码色(非 Hero) | 大量 | 0(全部 CSS 变量) |
| 维度 | LessJS | Fresh | Nuxt | Next.js |
|---|---|---|---|---|
| HTTP 层 | Fetch API | Fetch API | Nitro | 定制 |
| UI 层 | Web Components | Preact/JSX | Vue | React |
| 静态页面 JS | ~0.4 KB | ~1 KB | ~60 KB | ~70 KB |
| 单交互组件 | ~2-6 KB | ~12 KB | 整包 | 整包 |
| Islands 架构 | 原生 | 原生 | 无 | 无 |
| DSD (Declarative Shadow DOM) | 内置 | — | — | — |
| SSG 原生 | 是 | 是 | 是 | 是 |
| 多运行时 | Deno/Node/Bun/CF | Deno | Node | Node |
| 类型安全 RPC | Hono RPC | — | — | — |
每个页面有约 400 字节的内联基础设施脚本(主题初始化 + Service Worker 注册)。 这是不可消除的——它们是 L2 层(平台 API),在 I 约束(Isolated)的豁免范围内。
但 Lit / Hono / 框架核心代码的确是 0 字节。零交互页面只加载这 ~400 字节。 对比之下 Fresh 每页 ~1KB,Nuxt ~60KB,Next.js ~70KB。
有交互的页面按需加载 Island chunk,每个 ~2-6 KB gzip,懒加载 + 独立 Shadow DOM。
Vite 6 → 8 的升级路径已经调研过。核心依赖(Vite SSR、Rollup 插件 API)在 Vite 7/8 中保持兼容。 主要工作是更新 Wrangler 适配层和 Deno Deploy 的 shim。预计在 v0.5.0 时完成迁移。 Vite 8 的 RSC 支持和更快的 HMR 将直接受益于 LessJS 的构建管线。
消灭 Lit 运行时依赖是终极目标。自定义编译器将 .less 文件编译为原生 HTMLElement,
消除 58KB 的 Lit 运行时。这不仅是大小优化——它意味着 真正的零依赖。
目前编译器已经完成了设计文档(详见博文),新的路线图把它后移为 v0.10.0 alpha:先把 DSD、Island、Serverless 与 SSG/ISR
做稳,再讨论默认组件语法。
通过 Custom Elements 的天然互操作性,LessJS Island 可以在任何框架中使用。 React 19 已经修复了对 Custom Elements 的属性传递支持。Vue 3 原生支持 CE。 这意味着 LessJS 组件可以作为"框架无关"的交互单元被其他应用引用。
探索将计算密集型 Island 编译为 WebAssembly,在 Shadow DOM 内运行。 适用于数据重处理、图形渲染等场景。
从 Hono 路由定义自动生成类型安全的客户端调用代码。 消除手动编写 API 客户端代码的需求。