面向 JavaScript 和 WebAssembly 世界的 Lean 4。Lasm 将普通的 Lean 4 程序提前编译为 WebAssembly。一个 Lean 代码库可以变成 Node 服务器、 无服务器或边缘函数、WASI/Fastly 模块或浏览器应用。因为它是 Lean,你可以证明所部署代码的性质。旗舰示例,Conduit,是 RealWorld 应用, 包含 117 个已证明的定理。Lasm 在 npm 上发布,并自带 Lean、Lake 及其构建工具;你只需要 Node(或 Bun 或 Deno)。

npm create @lasm@latest my-app -- --template hono    #然后:cd my-app && npm install && npm run dev

AI 智能体:本 README 自身即完整。llms.txt是简短 索引,而docs/AI.md列出了能让你避免走错路的规则。

如果 Lasm 对你有用,我将感谢你的赞助(更多见下文)。

快速事实

事实 值
当前版本 @lasm/cli0.3.5(发布说明);npm view @lasm/cli version
安装 npm install -D @lasm/cli(可执行文件:lasm),或不安装:npx @lasm/cli …;新项目:npm create @lasm@latest
Lean 恰好4.35.0(lean-toolchain:leanprover/lean4:v4.35.0);Lasm 会安装它,构建时你不需要 elan
开发于 Linux x64/arm64(glibc 2.34+)、macOS x64/arm64、Windows x64
编译器运行于 Node ≥ 24(已测试 24.0.0、24.22.1、26.12.1);Bun 1.4.4 和 Deno 2.9.6(已测试,作为唯一运行时)
输出 dist/带有program.wasm+ 一个 JS 启动器(Node);或一个平台包(--target …)
Node 应用运行于 Node ≥ 24,Linux x64/arm64(glibc 2.28+ 或 musl),可从任意构建机器构建,外加构建机器自身的操作系统;≥ 512 MB 内存
JS/npm 互操作 import Lasm.JS;每个你调用的函数一行@[js "pkg" "export"];没有预制绑定(指南)
Lean 中的框架 Lasm.Fetch(HTTP,所有服务器目标)、Lasm.UI(浏览器,Elm 架构,已证明的 diff)、Lasm.RPC(类型化客户端/服务器 API)、Lasm.Web(DOM 和 Web API)、Lasm.KV
运行时不可用 elaboration、#eval风格求值、加载.olean、Lean 的内核(确切列表);所有这些在构建时都可用
许可证 MIT(Lasm);模板、示例和 README 代码示例同样为 MIT-0
仓库 / 问题 https://github.com/Millillion/lasm·报告 bug(包含npx lasm --version)

平台

每一行都在 CI 中使用平台自带的本地运行时、镜像或模拟器进行测试。 按项目政策,CI 从不部署到真实云账户 (每个平台如何测试)。

部署到 lasm build Main.lean --target … 输出 自
Node 服务器或程序(任意主机、Docker/Kubernetes、Cloud Run、Fly.io、Railway、Render、Heroku、DigitalOcean) node(默认) dist/→node dist/main.mjs 0.1.0
AWS Lambda(.zip,nodejs24.x) lambda lambda.zip 0.1.0
AWS Lambda(容器镜像) lasm init … --deploy lambda Dockerfile.lambda 0.1.0
Lambda@Edge lambda-edge lambda-edge.zip 0.1.0
Vercel Functions vercel .vercel/output 0.1.0
Netlify Functions netlify netlify/functions/lasm 0.1.0
Azure Functions azure azure-functions/ 0.1.0
Google Cloud Functions (gen2) gcf gcf/ 0.1.0
Cloudflare Workers workers workers/ 0.2.0
Vercel Edge vercel-edge api/lasm.mjs,api/_lasm/ 0.2.0
Netlify Edge netlify-edge netlify/edge-functions/lasm.mjs 0.2.0
Deno Deploy deno-deploy deno/main.mjs 0.2.0
Supabase Edge Functions supabase-edge supabase/functions/<name>/ 0.2.0
Bun (≥ 1.3.14) / Deno (2.x) bun/deno bun/main.mjs/deno/main.mjs 0.2.0
Fastly Compute fastly bin/main.wasm,pkg/<name>.tar.gz 0.3.0
WASI (wasmtime、wasmer、node:wasi) wasi wasi/main.wasm 0.3.0
wasi-http(wasmtime serve、Spin) wasi-http wasi-http/main.wasm 0.3.0
浏览器(Chrome、Edge、Firefox、Safari) browser(或 Vite 插件@lasm/cli/vite) dist/静态站点 0.3.0

Node 构建拥有 Lean 的完整运行时(线程、文件、进程、套接字)。边缘、Bun/Deno、WASI 和浏览器构建以单线程运行 Lean,不支持套接字或进程(除 WASI 外也不支持文件);Lean 的其余部分正常工作。

从这里开始

我想构建…… 运行 然后查看
命令行程序 npm create @lasm@latest my-tool examples/hello,examples/wasi-cli
在 Node 上使用 npm 框架的 REST API npm create @lasm@latest my-api -- --template hono(或express,fastify) examples/js-crud(Postgres + JWT,Express 和 Hono)
纯 Lean 编写的服务器(无 npm) npm create @lasm@latest my-api -- --template fetch(任意目标)或--template std-http(Node,同时支持原生 Lean) examples/fetch;std-http模板
无服务器函数(Lambda、Vercel、Netlify、Azure、GCF) npm create @lasm@latest my-fn -- --template hono --deploy lambda-zip(或vercel,netlify,azure,gcf,lambda-edge) docs/deploy
边缘函数(Workers、Vercel/Netlify Edge、Deno Deploy、Supabase) npm create @lasm@latest my-edge -- --template hono --deploy workers(或fetch) examples/edge-pure,docs/EDGE.md
Fastly、WASI 或 Spin 服务 npm create @lasm@latest my-svc -- --template fetch --deploy fastly(或wasi-http,spin,wasi) examples/fetch,docs/WASI.md
浏览器应用 npm create @lasm@latest my-web -- --template web examples/ui(计数器、带证明的 TodoMVC、功能演示、基准测试)
一个完整的真实世界应用(API、浏览器前端、SQL、认证),带证明,运行于 Node、Workers 或 Bun cd examples/conduit && npm install && npm run build && npm start examples/conduit,旗舰示例(见下文)
带已验证 API 的全栈应用 npm create @lasm@latest my-app -- --template fullstack templates/fullstack
要从 Lean 调用 npm 包或fetchfrom Lean 添加import Lasm.JS以及每个函数@[js]一行 examples/js-fetch,JS 绑定
要在 Bun 或 Deno 上运行 bun create @lasm my-app --template hono/deno run -A npm:@lasm/create my-app --template hono docs/BUN_DENO.md

每个示例都有 README,提供一条命令即可运行;examples/README.md列出了全部示例。

旗舰示例:Conduit,包含 117 个已证明的定理

examples/conduit是Conduit,即 RealWorld 应用(一个 Medium 克隆),完全用 Lean 编写:REST API、服务端渲染的浏览器应用以及证明。

  • 117 个定理关于实际运行的代码,经检查不使用sorry且npm run proofs仅使用 Lean 的标准公理(;lists each one in plain English). They cover authorization (only authors change their articles and comments), follows and favorites, slugs that never collide, pagination that never skips or repeats, validation shared by client and server (the app never sends what the server would reject), JSON round trips and Markdown link safety. The endpoints are written against aStoreof functions, and the proofs run that same code on a model of the tables.
  • What is trusted, not proved:that each SQL statement does what its model says, the JSON text layer, concurrency between requests, and Lean, Lasm and the JavaScript runtime. Conformance to the whole RealWorld spec is tested, not proved.
  • API:the official RealWorld API suite passes unmodified (13 of 13 files, 154 requests) on Node (node:sqlite), Cloudflare Workers (D1) and Bun (bun:sqlite). Each target has one hand-written@[js]binding module.
  • Frontend: Lasm.UIon RealWorld's official templates, with server-side rendering, hydration and Markdown parsed in Lean. The official Playwright end-to-end suite passes with no retries on Node with Chromium, Firefox and WebKit, and on Workers and Bun with Chromium.

All of this runs in CI (conduit.yml, run 40615274657, with@lasm/cli0.3.4).

cd examples/conduit
npm install                                   #@lasm/cli, Hurl and Playwright (the official suites' runners)
npm run build && npm start                    #http://localhost:3000: the app and its API on Node
npm run proofs                                #check all 117 theorems
npm test                                      #the official API suite (also test:workers, test:bun)
npx playwright install chromium && npm run test:e2e   #the official end-to-end suite
npm run build:workers && npx wrangler dev     #Cloudflare Workers with local D1
npm run build:bun && npm run start:bun        #Bun with bun:sqlite

60-second start

A single file needs no project. Save this complete program asMain.lean:

def main : IO Unit := do
  IO.println s!"Hello from Lean! 2 + 3 = {2 + 3}"
npx @lasm/cli Main.lean          #builds and runs: Hello from Lean! 2 + 3 = 5
npx @lasm/cli build Main.lean    #writes dist/; run it with: node dist/main.mjs

The first build on a new machine fetches Lean and the build tools once (about 250–275 MB; 19 s for that first build on the Linux CI runner). Later dev builds of a one-line change take about 1–2 s.

Recipes

Each recipe is complete: create, develop, build, deploy. Lasm never installs or starts a platform's own CLI (wrangler,vercel,fastly, …); you run those.npm run devislasm dev: it rebuilds about 2 s after each save and restarts the server, and keeps the last good build running when there is a type error.

Node server (Hono; alsoexpress,fastify,std-http,fetch).

npm create @lasm@latest my-api -- --template hono
cd my-api && npm install
npm run dev                                   #http://localhost:3000/hello/Ada
npm run build && npm start                    #dist/ 只需要 Node 24+
docker build -t my-api . && docker run -p 8080:8080 my-api   #生成的 Dockerfile

AWS Lambda / Vercel / Netlify / Azure / Google Cloud Functions。

npm create @lasm@latest my-fn -- --template hono --deploy lambda-zip   #或 vercel、netlify、azure、gcf、lambda-edge
cd my-fn && npm install
npm run build:lambda                          #dist/ 和 lambda.zip(handler 为 lasm-lambda.handler)
#用 AWS 控制台、aws CLI 或 SAM 部署 lambda.zip;操作指南:docs/deploy/lambda.md

Cloudflare Workers(以及 Vercel Edge、Netlify Edge、Deno Deploy、Supabase)。

npm create @lasm@latest my-edge -- --template hono --deploy workers
cd my-edge && npm install
npm run build:workers                         #workers/(wrangler.toml 来自 lasm init)
npx wrangler dev                              #本地 workerd;用 npx wrangler deploy 发布

Fastly Compute、WASI、Spin。

npm create @lasm@latest my-svc -- --template fetch --deploy fastly --deploy spin
cd my-svc && npm install
npm run build:fastly && fastly compute serve  #Viceroy 运行在 http://127.0.0.1:7676
npm run build:wasi-http && spin up            #或:wasmtime serve wasi-http/main.wasm

浏览器应用。

npm create @lasm@latest my-web -- --template web
cd my-web && npm install
npm run dev                                   #http://127.0.0.1:5173,实时重载
npm run build                                 #dist/:可部署到任意主机或 CDN 的静态站点

全栈(服务端 + 浏览器 + 经过验证的 API)。

npm create @lasm@latest my-app -- --template fullstack
cd my-app && npm install
npm run dev                                   #单一 URL:http://127.0.0.1:3000
npm run build && npm start                    #Node;另有 build:workers、build:bun、build:deno

编辑器。运行npx lasm editor每个项目一次;lasm init,lasm dev和lasm build也要这样做。随后 Lean 编辑器(VS Code 的 Lean 4 扩展)会解析import Lasm.*(详情)。

整个技术栈都用 Lean 编写,并经过验证

该fullstack模板是一个 Lean 项目,包含一个服务端(Lasm.Fetch)、一个浏览器应用(Lasm.UI)以及两者之间的 API(Lasm.RPC)。请求必须满足的规则只编写并证明一次,位于Shared.lean,双方都会导入它(templates/fullstack):

--Shared.lean
@[irreducible] def checkTitle (title : String) : Except String Unit :=
  let n := (clean title).length
  if n = 0 then .error "请先写点内容。"
  else if n > maxTitle then .error s!"请保持在 {maxTitle} 个字符以内。"
  else .ok ()

/-- 只证明一次,在浏览器和服务端都成立。 -/
theorem checkTitle_ok {title : String} (h : checkTitle title = .ok ()) :
    0 < (clean title).length ∧ (clean title).length ≤ maxTitle := by
  unfold checkTitle at h
  by_cases h0 : (clean title).length = 0
  · simp [h0] at h
  · by_cases h1 : (clean title).length > maxTitle
    · simp [h0, h1] at h
    · omega

def addTodo : Endpoint NewTodo Todo := { name := "addTodo", validate := fun r => checkTitle r.title }
--Server.lean:存储 todo 要求提供其标题通过检查的证明,
--而 `addTodo.serve` 在重新验证后把该证明(`ok`)交给处理函数。
def Store.add (s : Store) (title : String) (_ : checkTitle title = .ok ()) : Store × Todo :=
  let t := { id := s.next, title := clean title, done := false }
  ({ todos := s.todos.push t, next := s.next + 1 }, t)

  addTodo.serve fun req ok => do
    let (s, t) := (← load kv).add req.title ok
    save kv s
    return .ok t
--Client.lean:一个关于浏览器应用的定理:它永远不会发送无效标题。
theorem add_invalid (m : Model) (e : String) (h : checkTitle m.draft = .error e) :
    (update .add m).2.effects = [.msg (.added (.error (.invalid e)))] :=
  addTodo.call_invalid { title := m.draft } Msg.added "" e h

证明存放在哪里,以及如何检查。

证明 位置 检查者
你的定理(例如checkTitle_ok,add_invalid) 你的.lean文件 每次lasm build/lasm dev(Lean 会对其进行精化;证明有误即为构建错误);纯模块还会用lake build
Lasm.RPC:处理函数只对通过validate(Endpoint.decodeRequest_valid)的请求运行;客户端永远不会发送未通过它的请求(Endpoint.call_invalid) library/Lasm/RPC 每次构建时编译进 Lasm 的库
Lasm.UI:DOM diff 相对于 DOM 模型是正确的,包括带 key 的移动(diff_correct,mount_correct,session_correct) library/Lasm/UI/Proofs(约 1,260 行,无sorry,仅使用标准公理) node scripts/ui/lean-tests.mjs在某个检出目录中(CI:ui.yml)
Conduit:117 条定理,涵盖授权、关注、收藏、slug、分页、共享校验、JSON 往返和 Markdown 链接安全 examples/conduit/Proofs,列于PROOFS.md npm run proofs中examples/conduit(无sorry,仅标准公理;CIconduit.yml)
TodoMVC:每个可达模型都是有效的 examples/ui/todomvc/Todo.lean lasm build;CIui.yml

未证明、改为在 CI 中测试的部分:客户端与服务器之间的 JSON/HTTP 传输、将补丁应用到真实 DOM 的 JavaScript、Lasm 编译器和运行时,以及浏览器。Lean 自身的编译器受信任,与任何 Lean 程序一样(UI.md、RPC.md)。

从 Lean 调用 JavaScript 和 npm

每个调用的 JavaScript 函数用一行声明;Lean 类型说明值如何转换。一个完整程序(Node 的全局fetch):

import Lasm.JS
open Lasm.JS

/-- `await fetch(url, init)`(Node 的全局 fetch)-/
@[js"globalThis" "fetch"] opaque fetch : String → Data → IO Value

def main : IO Unit := do
  let response ← fetch "https://example.com" (obj [])
  IO.println s!"{← response.get"status"Nat}: {(← response.callMethodAwait"text"#[] String).length} characters"

编写绑定的规则:

  • @[js "module" "export"] opaque name : A → B → IO R绑定module.export。该"marked"模块是一个 npm 包("node:fs")、一个 Node 内置模块("globalThis"),或"new Hono"用于全局变量。""调用构造函数,而
  • 是该IO R模块自身的值。Async R类型以Async结尾表示立即返回的值,以
  • 结尾表示Stringpromise。一个Nat绑定会被等待,而不占用 Lean 线程。Int使用Float、Bool、ByteArray、Array、List、Option、Data、Value、get元组、callMethod(任意 JS 数据)或callMethodAwait(一个 JS 对象引用:deriving ToJS, FromJS、
  • Function.ofFn、Function.ofFnReply)。你自己的结构体用hono转换。express/fastify将 Lean 函数转换为 JS 回调。
  • npm install框架处理器会使用它们(见lasm build、Lasm.JS binding check failed: … export "x" is missing和dist/node_modules模板)。
  • lakefile 旁边的包。

会针对已安装的包检查每个绑定(pg),并将生产依赖复制到jose。fetch每次调用都会从 Lean 线程跨越到 Node 的主线程(约 24 µs),因此优先使用一次粗粒度调用,而不是多次小调用。完整指南,包含 Express、Hono、、

和

示例以及智能体检查清单:docs/JS_BINDINGS.md。

实测数据 所有数据均来自免费 GitHub runner(4-CPU AMD EPYC,Linux x64)上的 CI,候选版本 0.1.0-experimental.40494203854(2026-10-27),除非另有指定运行。完整表格、方法和注意事项:
BENCHMARKS.md 。http项目
数值 Node:Hono + Lean 处理器,冷启动到首个 HTTP 响应http159 ms(纯 Node
:快 4.1×) Node:Hono + Lean 处理器,吞吐量 / p99 延迟
节点:Hono 应用program.wasm(brotli) /dist/ 166 KiB / 8.5 MiB 加上 1.4 MiBnode_modules
节点:内存,Hono 应用空闲 / 负载下 148 MiB / 329 MiB RSS
Lean → JS 调用往返(p50) 24 µs
Cloudflare Workers:Hono 应用包 1.40 MiB,gzip 后 245 KiB(上限 64 MiB;workers 运行 40128600109)
浏览器:计数器应用总传输量 / 首帧(Chromium) 152 KiB brotli / 30 ms(浏览器运行 40288509500)
浏览器:js-framework-benchmark 对比手写 JS 每项操作均在 1.7× 以内,大多数在 1.2× 以内(浏览器运行 40302274897)
WASI:Lasm.Fetch模块 / 在 Fastly 的 Viceroy 上每请求 0.90 MiB / 1.17 ms,每个请求使用全新实例(wasi 运行 40293231963)
构建:干净的 Hono 构建 / 一行改动后的开发重建 4.7 s / 2.0 s
npm install @lasm/cli:下载 / 安装;首次构建后的工具缓存 71 MiB / 403 MiB;2.5 GB

在 Node 上使用 Lean 需要为 WebAssembly 及其线程付出代价。冷启动受 CPU 限制,因此在小份额的无服务器 CPU 上会变大,而且每次 JavaScript 调用都要跨线程。纯 LeanStd.Http在 Node 上很慢(1,290 req/s),所以生产 HTTP 请使用 Hono、Express、Fastify 或Lasm.Fetch。对数千位数字进行算术运算比原生 Lean 慢(没有 GMP)。

已知限制

  • 仅支持提前编译。已部署的程序无法在运行时展开、求值或编译 Lean,无法加载模块数据或插件,也无法使用 Lean 的 C++ 编译器/内核(确切列表)。证明、策略、宏和#eval像往常一样在编译时运行。
  • 严格为 Lean 4.35.0。其他lean-toolchain版本会被拒绝并给出
  • 消息。Node:-l为应用至少分配 512 MB;它会预留约 22 GB 虚拟地址空间。预构建的原生库(
  • 、共享库)无法链接;包内自带的 C 源码会为你编译。Edge、Bun/Deno、浏览器、WASI:--suspend jspi单线程 Lean;没有套接字、进程或信号;除 WASI 外没有文件。在浏览器中,阻塞等待会使应用停止,除非它针对带 JSPI 的浏览器用Async构建;请使用
  • 。没有预制的绑定Lasm.Web用于 npm 包;
  • 覆盖核心 Web 平台。 Lasm.*编辑器:npx lasm editor导入在编辑器中的
  • (见上文)之后解析。平台:

没有 Windows ARM64,也没有 Alpine/musl 构建机(构建出的应用可在 Alpine 上运行)。托管平台使用其本地工具进行测试,从不使用真实账户。


支持 Lasm

如果 Lasm 对你有用,或者你希望看到它成功,我会感谢你的赞助:github.com/sponsors/lastmjs。它支持我以及 Lasm 和其他Millillion项目的工作。我的第一个目标是每月 250 美元,足够为 Lasm 提供一个专用的 Claude Code 账户。你也可以通过给仓库加星、试用它,以及报告出现的问题来提供帮助。

参考

以下所有内容都是精确的约定:每一条命令和选项、支持的机器和平台,以及部署后的 Lean 程序确切不能做什么。

CLI 参考

在项目中安装npm install -D @lasm/cli(可执行文件是lasm),或者不安装直接运行:npx @lasm/cli Main.lean。npm create @lasm运行lasm init相同@lasm/cli版本的Main.lean,参数保持不变。使用快速开始中的

npx lasm Main.lean                          #构建(开发配置)并运行:Hello from Lean! 2 + 3 = 5
npx lasm build Main.lean                    #写入 dist/(发布配置)
npx lasm --version                          #版本、Lean、运行时和平台(用于缺陷报告)
node dist/main.mjs                          #运行部署产物:只需要 Node
npx lasm build Main.lean --target lambda    #dist/ 和一个 AWS Lambda zip
命令或选项 示例 效果
运行(默认) npx lasm Main.lean 构建(开发配置)并运行 Leanmain。npm run dev在plain项目中运行此命令。
显式运行 npx lasm run Main.lean 与默认命令相同。
运行发布构建 npx lasm Main.lean --release 构建并运行lasm build所部署的确切内容。
程序参数 npx lasm Main.lean -- hello "two words" 将参数传递给main (args : List String)。
监视、重新构建、重启(0.3.0) npx lasm dev,npx lasm dev Main.lean --target workers -- arg 监视 Lean 源码和 Lake/npm 配置,每次更改后重新构建(开发配置,一个长期运行的构建工作进程)并重启程序(--target node,bun,deno;默认:运行 Lasm 的运行时)。构建错误会连同其文件、行号和源码行一起打印;最后一个正常版本的程序会继续运行。边缘目标只重新构建其输出目录,由平台自己的本地服务器提供服务(Lasm 从不启动平台工具或浏览器)。--target browser以实时重载方式提供应用(--port,--host,--no-watch);多个输出会一起构建:--target node=Server.lean,browser=Client.lean。--release构建发布配置,--no-run仅重新构建,rs+ Enter 重新构建并重启。详情。
构建 npx lasm build Main.lean 写入dist/(发布配置);不运行应用程序。
开发构建 npx lasm build Main.lean --dev 写入dist/更快,但不做体积优化。
输出目录 npx lasm build Main.lean --output "app dist" 选择部署目录。lasm build Main.lean "app dist"是一个别名。
函数平台 npx lasm build Main.lean --target lambda 构建dist/,然后打包它:node(默认;dist/仅此),lambda(lambda.zip),lambda-edge(lambda-edge.zip),vercel(.vercel/output),netlify(netlify/functions/lasm),azure(azure-functions/),gcf(gcf/)。--target=vercel也可以。Lasm 从不安装或启动平台的 CLI。Recipes。
Edge 隔离(0.2.0) npx lasm build Main.lean --target workers 用纯 JS 宿主重新链接单线程:workers(workers/),vercel-edge(api/lasm.mjs,api/_lasm/),netlify-edge(netlify/edge-functions/lasm.mjs,netlify/lasm/),deno-deploy(deno/main.mjs),supabase-edge(supabase/functions/<name>/;Asyncify,因为 Supabase 的运行时没有 JSPI)。边缘运行时随附于@lasm/cli。指南:Workers,Vercel Edge,Netlify Edge,Deno Deploy,Supabase;设计与限制。
Bun 和 Deno(0.2.0) bunx --bun @lasm/cli Main.lean,deno run -A npm:@lasm/cli Main.lean,bun create @lasm my-app --template hono 编译器以 Bun 或 Deno 作为其唯一的 JavaScript 运行时运行,并产生相同的字节。在 Bun 或 Deno 下,默认目标是该运行时:--target bun写入bun/main.mjs,--target deno写入deno/main.mjs(可移植配置)。Deno 会跳过发布不足 24 小时的 npm 版本:刚发布后,请传入--minimum-dependency-age=0。Bun 和 Deno。
浏览器(0.3.0) npx lasm build Main.lean --target browser 写入dist/作为静态站点:app.<hash>.js(加载器:mount(element, { flags, hydrate }),自动挂载<div data-lasm-app>),app.<hash>.wasm,brotli 和 gzip 副本,app.js,index.html(注入加载器的你的页面,或生成的页面)、你的public/文件和lasm-manifest.json。--suspend jspi让阻塞等待在浏览器支持 JSPI 的地方挂起。--bundler将 npm 导入留给打包器;在 Vite 中:import lasm from '@lasm/cli/vite',然后import app from './Main.lean?lasm'。来自 Lean 的 Web API:import Lasm.Web。指南:BROWSER.md,UI.md,部署。
WASI、wasi-http、Fastly(0.3.0) npx lasm build Main.lean --target wasi(或wasi-http,fastly) 无 JavaScript。wasi写入wasi/main.wasm(wasi_snapshot_preview1:wasmtime run --dir . wasi/main.wasm,wasmer,node:wasi);wasi-http写入wasi-http/main.wasm,一个 wasi:http/proxy@0.2 组件(wasmtime serve,Spin);fastly写入bin/main.wasm和pkg/<name>.tar.gz(fastly compute serve/deploy)。无套接字、进程或信号。WASI.md,Fastly。
纯 Lean 中的 HTTP(0.3.0) import Lasm.Fetch…def main := Lasm.Fetch.serve handle 一个Request → Async Response处理程序服务于 Node($HOST:$PORT)、边缘目标、Bun、Deno、Fastly、wasi-http 以及作为 CGI 的 WASI;Lasm.Fetch.fetch发送请求;Response.streaming流式传输。FETCH.md。
强制重新构建 npx lasm build Main.lean --rebuild 忽略缓存的应用程序构建。
详细诊断 npx lasm Main.lean --verbose 显示编译器和链接器详情。
帮助 npx lasm --help,npx lasm init --help 显示用法;-h是别名。
版本 npx lasm --version 打印lasm 0.3.5 (@lasm/cli; Lean 4.35.0; Node 26.12.1; linux-x64);-v是别名。
新建项目 npm create @lasm@latest my-app -- --template hono或npx @lasm/cli init my-app --template hono 在新目录或空目录中创建 Lake 项目(Main.lean,App.lean,lakefile,lean-toolchain,package.json,README.md,.gitignore,对于服务器还有Dockerfile和.dockerignore)。模板:参见从这里开始。--deploy(可重复)添加平台的文件和npm run build:<target>:lambda(Dockerfile.lambda,一个容器镜像),lambda-zip,lambda-edge,vercel,netlify,azure,gcf;workers,vercel-edge,netlify-edge,deno-deploy(模板hono,fetch,fullstack),supabase-edge(hono);fastly,wasi-http,spin(fetch,fullstack),wasi(fetch,plain)。fetch和fullstack模板及其目标是 0.3.0。仅写入文件;接下来运行npm install。-t是--template的别名;--template=hono也可以。
打包现有构建 npx lasm package --target lambda 为函数平台打包已构建的服务器(默认dist/)而无需重新构建:与lasm build --target相同的目标和输出,除了node。--output PATH选择输出。检查平台的大小限制。拒绝开发构建,除非--allow-dev。对于浏览器构建,npx lasm package dist --target browser根据lasm-manifest.json检查每个文件并写入_headers。
编辑器支持(0.3.0) npx lasm editor 让 Lean 编辑器(VS Code 的 Lean 4 扩展、任何 Lean 语言服务器客户端)解析import Lasm.*在这个 Lake 项目中:将 Lasm 的 Lean 4.35.0 及其库链接为 elan 工具链lasm-4.35.0-…并将其设置为该目录的 elan 覆盖(elan override unset撤销该设置)。lasm init(当 Lasm 的 Lean 已安装时),lasm dev以及lasm build执行相同操作,每个项目打印一行,但在 CI 上或使用LASM_EDITOR=0时除外。编辑器设置。
缓存修复 npx lasm cache repair 离线验证并移除无效工具和废弃的暂存内容。拒绝正在进行的构建。

--rebuild以及--verbose可与 run 和 build 一起使用。--output和--target仅用于构建;其后的参数--仅用于 run。应用程序的退出状态会被保留。npx lasm --version(-v)打印版本、Lean 发行版、JavaScript 运行时和平台(请将其包含在错误报告中)。没有 install、clean 或 uninstall 子命令。

构建配置。两者使用相同的库链接同一个程序,且具有确定性。release(lasm build,lasm Main.lean --release):完整的 Binaryen 大小优化;字节级可复现;用于部署的版本。dev(lasm Main.lean,lasm dev,lasm build --dev):省略这些优化步骤,并以-O1编译你的模块;行为相同,构建快几秒,其program.wasm大约大 15–20 %。dev 重新构建会从项目之前的构建开始,因此其字节可能依赖于该构建。build-info.json记录"profile"。lasm package和lasm build --dev --target <platform>会拒绝 dev 构建,除非你传入--allow-dev。

环境变量(均为可选):

变量 示例 作用
LASM_TOOLCHAIN_CACHE LASM_TOOLCHAIN_CACHE=/data/lasm-cache npx lasm Main.lean 移动受管理的工具缓存(默认位置)。
LASM_BUILD_JOBS LASM_BUILD_JOBS=2 npx lasm build Main.lean Binaryen 优化器的线程数(默认:CPU 数量,最多 8)。任何取值下输出都相同。
LASM_EDITOR LASM_EDITOR=0 npx lasm build Main.lean 0:lasm init,lasm dev和lasm build不触碰编辑器设置(编辑器设置)。
LASM_THREAD_POOL(已构建的应用;0.3.0) LASM_THREAD_POOL=0 node dist/main.mjs 在main之前启动的 Lean 线程 Worker(0–64,默认 1)。测量。
LASM_ARTIFACT_SOURCE LASM_ARTIFACT_SOURCE=npm npx lasm Main.lean auto(默认):存在时使用 npm 工具包,否则使用 HTTPS;@lasm/…:从不直接下载;npm:忽略 npm 包。https,
LASM_DOWNLOAD_ATTEMPTS,LASM_DOWNLOAD_CONNECT_MS,LASM_DOWNLOAD_IDLE_MS,LASM_DOWNLOAD_TOTAL_MS LASM_DOWNLOAD_TOTAL_MS=14400000 npx lasm Main.lean 下载重试与超时(默认值与范围)。
NODE_USE_ENV_PROXY,HTTPS_PROXY,NO_PROXY,NODE_EXTRA_CA_CERTS(Node 自带的) NODE_USE_ENV_PROXY=1 HTTPS_PROXY=http://proxy:8080 npx lasm Main.lean 代理与私有 CA(企业网络)。

其他LASM_*源码中的变量是维护者诊断用的,不是受支持的接口。

安装。 npm install @lasm/cli通过你自己的 registry、代理和缓存,将 Lean 和构建工具作为精确固定版本的@lasm/…npm 包引入你的平台。Lake/Lean-import 数据,且仅对含 C 代码的 Lake 项目,引入 C 层(@lasm/lean-c-<platform>)在首次使用时通过你的 npm 获取。终端会显示进度;后续构建会复用已验证的工具和未变更的输出。在新机器上,如果没有下载,首次 Hono 构建在 CI runner 上耗时 25.7 秒(Linux x64)、27.8 秒(Linux arm64)、44.4 秒(Windows)、58.7 秒(Apple Silicon)和 141.9 秒(Intel Mac)(构建时间,运行 40131930601)。缓存位置与恢复:NODE_SUPPORT.md、INSTALLATION_HARDENING.md。Git仅在带有 Git 或 Reservoir 依赖的 Lake 项目中需要;Lasm 使用你git上的PATH,并在缺失时说明如何安装。

现有 Lake 项目使用项目目录中的npx lasm build Main.lean进行构建。在leanprover/lean4:v4.35.0中固定lean-toolchain;其他版本会被拒绝并提示Unsupported Lean toolchain … Lasm supports Lean v4.35.0。一份按包划分的兼容性列表涵盖 Batteries、Cli、LSpec、Plausible、Aesop、Qq、leansqlite、UnicodeBasic、MD4Lean、lean-zip、lean4-parser、lean-redis 等;不在列表中的包未经测试。

支持的环境

使用 Lasm(编译器)构建的机器:

环境 架构 状态
Ubuntu 24.04 LTS x86-64、ARM64 在 CI 中进行已安装包和复制部署的验收;参考平台。
其他 Linux 发行版 x86-64、ARM64 作为构建机器未经验证;工具需要 glibc 2.34。Alpine/musl 不是构建机器(构建出的应用可在其上运行)。
macOS 15 x86-64、ARM64 在 CI 中进行已安装包和复制部署的验收。带 C 代码的 Lake 项目需要 Xcode Command Line Tools SDK。
Windows Server 2025 / Windows x64 x86-64 在 CI 中进行已安装包和复制部署的验收。
Windows ARM64 ARM64 不支持:Lean 和 Emscripten 均未发布 Windows ARM64 预构建包。
Bun 1.4.4 和 Deno 2.9.6 作为编译器的运行时(0.2.0) 以上全部 已在 CI 中于全部五个平台测试,也在没有 Node 或 npm 的情况下测试(PATH(BUN_DENO.md)。

Node 24 或更新版本(已测试:24.0.0、24.22.1、26.12.1)。无引擎标志。确切测试过的产物:NODE_ACCEPTANCE.md。

支持的平台

一个 Nodedist/需要Node 24 或更新版本(Node 22 及更早版本会停止并提示This application requires Node 24.0.0 or newer)以及至少 512 MB 内存。它可在 Linux x64 和 arm64(glibc 2.28+,或 musl/Alpine)上运行,来自任意受支持平台上的构建,也可在构建机器自身的平台上运行。复制所有dist/;那里不需要 Lean 源码、npm install 或构建工具。下面每个平台都已在 CI 中测试使用本地运行时、镜像或模拟器进行测试;没有任何一项使用真实的云账户。完整矩阵:DEPLOYMENT.md。

平台 在 CI 中测试所用环境
Linux x64 和 arm64(glibc 2.28+),Node 24+ Node 24.0.0、24.22.1 和 26.12.1,运行于ubuntu-24.04和ubuntu-24.04-arm
macOS(x64、arm64) Node 24.0.0 和 24.22.1,运行于macos-15-intel;Node 24.22.1 运行于macos-15;使用 Node 26.12.1 进行安装验收
Windows x64 Node 24.0.0 和 24.22.1,运行于windows-2025;使用 Node 26.12.1 进行安装验收
Docker / Kubernetes node:24-bookworm-slim,node:26-bookworm-slim,node:24-bullseye-slim,Ubuntu 22.04/24.04;只读,512 MB,x64 和 arm64(Kubernetes 清单不在 CI 中应用)
Google Cloud Run、Fly.io、Railway、Render、Heroku 相同的容器镜像和 Dockerfile;这些平台本身从未被实际部署
AWS Lambda(容器镜像) public.ecr.aws/lambda/nodejs:24+ AWS Lambda Web Adapter,通过 Runtime Interface Emulator 测试,x86_64 和 arm64;amazonlinux:2023
AWS Lambda(.zip,nodejs24.x) 每个服务器模板的--target lambdazip 文件,位于public.ecr.aws/lambda/nodejs:24通过 Runtime Interface Emulator 测试,x86_64 和 arm64,涵盖 API Gateway REST/HTTP、函数 URL 和 ALB 事件;sam local invoke和sam local start-api
Lambda@Edge(源请求,x86_64) 相同的镜像和模拟器,配合 CloudFront 源请求事件
Vercel Functions(Node.js 24) vercel build离线;该函数位于@vercel/node在public.ecr.aws/lambda/nodejs:24
Netlify Functions(v2) netlify build --offline和netlify dev --offline;部署 zip 位于public.ecr.aws/lambda/nodejs:24
Azure Functions(Node.js v4 模型,Linux) Azure Functions Core Toolsfunc start
Google Cloud Functions(gen2,nodejs24) Ubuntu 24.04 上的 Functions Framework;Google Cloud 的 buildpacks 镜像
Alpine/musl 容器 node:24-alpine,node:26-alpine,x64 和 arm64,只读,512 MB
DigitalOcean App Platform(gVisor) 容器镜像在 gVisor 的runsc,x64
Cloudflare Workers(0.2.0) wrangler dev4.152.0(workerd),并受 Free 计划的配额限制
Vercel Edge(0.2.0) vercel build离线以及 Vercel 的edge-runtime
Netlify Edge(0.2.0) netlify build --offline和netlify dev --offline
Deno Deploy(0.2.0) Deno 2.9.6 运行deno/main.mjs
Supabase Edge Functions(0.2.0) Supabase 的edge-runtimev1.77.8 镜像,在 Docker 中
Bun 和 Deno 程序(0.2.0) Bun 1.4.4 和 Deno 2.9.6,在所有五个平台上
WASI、wasi-http、Spin、Fastly(0.3.0) wasmtime 49.0.4(run,serve),wasmer 7.4.2,Node 的node:wasi,Spin 4.2.2,Viceroy 0.21.1(wasi.yml)
浏览器(0.3.0) Playwright 1.63.0:Chromium 153 和 Firefox 155,运行于ubuntu-24.04;WebKit 26.6 运行于ubuntu-24.04和macos-15(browser.yml)

一个dist/在 Windows 上构建并复制到 Linux,若非通过docker build需要chmod 755 dist/host/native/process/linux-*。Node 的--jitless无法工作(它会禁用 WebAssembly)。限制虚拟内存的主机(ulimit -v,vm.overcommit_memory=2)会拒绝 Node 构建,因为它预留了约 22 GB 的地址空间。Node 26 的官方二进制需要libatomic1在最小镜像上,它们会自行安装 tarball。

Lean 支持与限制

构建会强制执行提前执行(ahead-of-time execution)。支持普通函数、递归、闭包、归纳类型、模式匹配、类型类、依赖类型以及编译后的 IO。导入、宏、精化(elaboration)、策略(tactics)、派生(deriving)、证明以及#eval运行在编译期间在受管理的原生 Lean 中。初始化器算作运行时依赖:一个宽泛的import Lean可以保留编译器;当只有宏或策略需要它时使用meta import Lean,而对运行时数据库使用更窄的导入(import Lean使用Lean.Json,以及deriving ToJson, FromJson,构建并运行)。每次拒绝都会得到解释:Lasm 会打印从你的代码到编译器代码的链路,并且当宽泛导入是原因时,还会打印你的代码所使用的更窄模块。部署的程序会遵守LEAN_ABORT_ON_NONLINEAR=1,正如原生 Lean 所做的那样。各平台结果:语言覆盖范围。

部署的应用程序不能使用:

运行时不可用 示例与精确边界
加载 Lean 模块数据或定位编译器安装 Lean.importModules,Lean.withImportModules,模块数据读取器/写入器,Lean.findSysroot,Lean.initSearchPath;部署的.olean/IR 加载。
求值或编译新的 Lean 代码 Lean.Environment.evalConst,解释器求值、Lean REPL、运行时精化/编译、按名称加载的声明求值。调用普通的已编译函数是允许的。
使用 Lean 的编译器/内核运行时状态 运行时精化、内核证明检查、编译器环境、需要 Lean 的 C++ 编译器/内核的语言服务器机制。纯 Lean 数据操作如果其可达依赖通过检查,则是允许的。LeanExport.parseStream构建Lean.Expr通过内核生成值,并被拒绝。
动态加载可执行插件 Lean/Wasm 插件加载,dlopen/dlsym(调用dlopen的 C 代码会得到一个总是失败的实现),运行时 Lean 符号查找。

构建会检查可达的运行时依赖,包括导入的库和间接调用;可达的禁止调用会被拒绝,即使你的输入不会走那个分支,并且被链接器移除的死代码不计入。启动器还会在加载应用程序之前拒绝缺失、过期或不兼容的能力记录(这是一项一致性检查,不是安全沙箱)。没有大型兼容性回退。

Lake 包。仅为编译而导入的模块(例如策略、精化器,例如 Aesop、Qq 或import Lean对于宏)不会在部署中保留 Lean 的编译器。Lasm 仅在程序使用某个模块所定义或注册的内容时,或者当这些初始化器是程序自身执行 IO 或调用 C 的代码时,才运行该模块的初始化器(--verbose显示跳过了多少个)。包所捆绑的 C 源码(extern_lib,moreLinkObjs,例如 leansqlite 的 SQLite)使用 Lean 自带的 clang 编译,作为 C 层一次性获取(39–52 MB);不需要系统 C 编译器(macOS 需要 Xcode Command Line Tools SDK 来提供 C 库头文件)。预构建的原生库(共享库、-l选项:libcurl、OpenSSL、libpq、BLAS)无法链接;构建过程会指出该库和所属包。

并非发布保证。控制台输出、参数、退出码、本地 Lake 导入以及选定的语言/文件系统测试夹具都有原生与 Node 的对比测试,并且在 0.1.0 之前,Lean 具备运行时能力的上游测试套件和 19 个生态项目已在全部五个平台上运行,相对于上一个被接受的候选版本零回归(0.1.0 门槛)。完整的IO.FS、并发、子进程/信号/终端一致性、每一个第三方库以及完整的上游测试套件并不保证(IO 缺口)。大数(Nat/Int超过 63 位)使用 Lean 自带的任意精度代码而非 GNU MP,因此应用不包含 LGPL 代码;结果与原生 Lean 相同,但在 10,000 位乘法时约慢 5 倍,Nat.gcd在 Wasm 中比使用 GMP 约慢 60 倍数字)。Lake 依赖使用你的系统 Git(系统 Git)。

发布与来源

0.1.0 是首个 npm 发布(说明);0.2.0 增加了边缘目标和 Bun/Deno(说明);0.3.0 增加了浏览器、Lasm.UI、全栈应用、WASI/Fastly 以及编辑器支持(说明);0.3.1 将起始代码置于 MIT-0 之下,并增加了缺陷报告指引(说明);0.3.2 修复了Std.Internal.UV套接字、定时器和信号(说明);0.3.3 从未发布,其改动随 0.3.4 一起发布(说明);0.3.5 更新了 README 和 Conduit 示例(说明)。Lasm 的 npm 包(@lasm/cli、@lasm/create以及@lasm/…工具包)仅由release.yml工作流发布,通过带来源的 npm 可信发布:不存在 npm 令牌。一次发布就是一个提升package.json版本的拉取请求,并且只有在release-checksstatus(五平台候选检查;edge、Bun/Deno、浏览器、Lasm.UI、WASI/Fastly、全栈、单元和开发循环检查;以及对确切包的 npm 预演)已针对发布的提交通过。发现了一个 bug?npx lasm --version会给出该版本行,bug 报告表单所要求的。npm view @lasm/cli@<version>会显示来源,npm audit signatures在项目中对其进行验证。详情:RELEASING.md。

许可证

Lasm 自身的源代码采用MIT 许可证(版权归 Jordan Last)。起始代码——所有lasm init和npm create @lasm放入一个新templates/项目中的内容,examples/,docs/以及本 README 中的代码示例和——同样采用MIT 无署名@lasm/create(MIT-0),在每个@lasm/cli的license字段是一个 SPDX 表达式,涵盖 Lasm 的 MIT、MIT-0 以及它捆绑的每个组件,其文本位于licenses/中。许可证审计列出了每个分发的组件、其许可证以及每项义务是如何满足的。

  • 构建dist/。 THIRD_PARTY_NOTICES.txt以 Lasm 的 MIT 声明和 Lasm 修改过的 Lean 文件列表开头,然后是构建所包含内容的许可证:Lean 的运行时和标准库(Apache-2.0)、Emscripten(MIT OR NCSA)、musl、LLVM libc++、libc++abi、libunwind 和 compiler-rt、mimalloc、libuv、koffi 以及 Lasm 的主机(MIT)。应用不包含任何 copyleft 代码。licenses/<package>/保存了编译进program.wasm的每个 Lake 依赖的许可证文件;通过 npmnode_modules/互操作,保存了每个包及其各自的许可证。分发dist/时请保留这些文件。
  • Edge、浏览器、WASI、Fastly 和 wasi-http 输出会获得相同的声明,重写以说明其文件包含的内容,自动生成:每个输出目录中的一个THIRD_PARTY_NOTICES.txt、平台捆绑的 JavaScript(edge 胶水代码、浏览器加载器)上的简短/*! … */许可证lasm.notices自定义段,因此它会随每次部署一起传输)、Fastly 包中的文件,以及THIRD_PARTY_NOTICES.lasm.txt在 Vite 构建中。这对你的应用意味着:docs/LICENSING.md。
  • 工具包和发布归档。每个@lasm/…工具包都有一个 SPDXlicense字段和归档的许可证文件。Lean 归档包含的 (L)GPL 部分的准确源代码(GNU MP、GNU C 库、GCC 的运行时库、Linux UAPI 头文件、MinGW-w64)以及 Lean 自身的源代码被镜像为发布它们的版本的资产lean-4.35.0-tiers-v2)。Lasm 不附带任何 Git 和 Apple SDK 文件。
  • Lean 名称和标识是 Lean FRO 的商标。Lasm 与 Lean FRO 无关联,也未获其认可。