文档Web 开发

用 Lume 构建静态站

Lume 3 初始化、插件、_components 与具名权限的实战配置

Lume 是 Deno-first 的静态站生成器,适合文档、博客与内容站:构建产物是纯静态文件,可托管在任意静态服务器上。本站就是用 Lume 3 构建的,下面的示例直接取自本仓库的真实 _config.tsdeno.json

创建项目

deno run -A https://lume.land/init.ts
cd my-site
deno task lume -s   # dev server,带监听与热重载
deno task lume      # 构建到 _site/

官方推荐项目级安装而非全局 CLI:init 脚本会生成一个 deno.json,其中包含 lume task 和同名的具名权限配置。升级用 deno task lume upgrade。如果教程里出现 deno.land/x/lume/init.ts 或要求全局 deno install lume 命令,说明写作时间较早——当前域名是 lume.land

核心概念

配置集中在 _config.ts:创建站点、注册插件、声明共享数据。

import lume from "lume/mod.ts";
import jsx from "lume/plugins/jsx.ts";
import mdx from "lume/plugins/mdx.ts";
import sitemap from "lume/plugins/sitemap.ts";

const site = lume({ location: new URL("https://example.com") });

site.use(jsx());
site.use(mdx());
site.use(sitemap({ query: "indexable=true", items: { lastmod: "=lastModified" } }));

site.copy("static", ".");
site.data("layout", "doc.tsx");

export default site;
  • 插件:Markdown、Vento、搜索、分页等开箱即用;JSX、MDX、sitemap、feed 等按需 site.use() 注册。
  • _includes/:布局与模板片段目录,页面用 frontmatter 的 layout 指定,也可用 site.data("layout", ...) 设全站默认。
  • _components/:可复用组件,所有模板里通过全局 comp 变量访问,跨引擎可用(JSX 写的组件可以在 Vento 里用)。本页底部的 Callout 就是 _components/ 里的组件。
  • preprocess vs processsite.preprocess([".mdx"], ...) 在渲染前运行,适合注入数据——本站用它给每个页面写入 localelastModifiedsite.process([".html"], ...) 在渲染后拿到 page.document 做 DOM 操作——本站用它给表格包滚动容器、给外链加 rel="noreferrer"

权限收窄

Lume 需要读源文件、写 _site/、联网拉取依赖,很多教程图省事直接 -A。Deno 2 的具名权限配置可以把权限收窄并固定下来,本站的 deno.json 就是一个完整示例:

{
  "tasks": {
    "lume": "deno run -P=lume lume/cli.ts"
  },
  "permissions": {
    "lume": {
      "read": true,
      "write": true,
      "import": ["cdn.jsdelivr.net:443", "jsr.io:443", "deno.land:443"],
      "net": ["cdn.jsdelivr.net:443", "jsr.io:443", "deno.land:443", "esm.sh:443"],
      "env": true,
      "run": true,
      "ffi": true,
      "sys": true
    }
  }
}

deno run -P=lume 表示只应用名为 lume 的这份配置,除此之外无权限。进一步收紧的方向:把 net/import 限定为你的依赖实际所在的主机(如上),把 writetrue 收窄为 ["_site"],把 env 收窄为构建真正读取的变量名(如 ["SITE_URL"])。改完跑一遍 deno task lume,缺哪个权限 Deno 会明确报出来。

构建与部署

deno task lume 输出到 _site/,是纯静态产物:Nginx、对象存储、Cloudflare Pages、GitHub Pages 都能直接托管。新版 Deno Deploy 对静态站有一等支持,并能自动识别 Lume 项目、无需额外配置;注意 Deploy Classic 不支持静态托管,老文档里的“用 Deno.serve 起一个文件服务器”方案只适用于 Classic。

Lume 还是 Fresh

决策表一致:页面在构建期就能全部确定(文档、博客、营销页)选 Lume;需要请求期渲染、数据库读写或交互 island 选 Fresh。两者的客户端 JavaScript 都可以接近零,区别在于 HTML 何时生成。

官方参考:Lume 安装ProcessorsComponents插件列表Deno Deploy 框架支持

输入关键词搜索全部文档。