@lukeed05: 为庆祝 @rolldown_rs 1.0 发布,隆重推出 `comptime`——一个受 Zig 启发的构建时评估原语,作为 Vite 和 Rolldown 插件提供……
摘要
Luke Edwards 发布了 `comptime`,这是一个受 Zig 启发的构建时评估原语,适用于 Vite 和 Rolldown,允许在构建过程中执行代码,将调用位置替换为评估后的值。
查看缓存全文
缓存时间: 2026/05/09 16:16
为庆祝 @rolldown_rs 1.0 🎉 隆重推出 comptime —— 一个受 Zig 启发的构建时求值原语,作为 Vite 和 Rolldown 的插件提供。这允许您在构建时运行代码,并用求值后的输出值替换调用位置。 https://t.co/myKeJMvDBP https://t.co/VhvUTegO6P — # lukeed/comptime 来源:https://github.com/lukeed/comptime # comptime > 一个受 Zig 启发的构建时求值原语,作为 Vite 和 Rolldown 的插件提供。 ts import { comptime } from "comptime"; import { fibonacci } from "./math"; export const value = comptime(() => fibonacci(10)); 启用该插件后,调用将在构建期间被求值,并替换为序列化的表达式: ts export const value = 55; 如果未启用插件,运行时辅助函数会抛出错误,以便未能转换的情况能够显式报错。 > 查看 更复杂的示例 ## 安装 sh # 通过 rolldown bun add --dev comptime rolldown # 通过 vite bun add --dev comptime vite ## Vite ts import { defineConfig } from "vite"; import { comptime } from "comptime/vite"; export default defineConfig({ plugins: [comptime()], }); ## Rolldown ts import { defineConfig } from "rolldown"; import { comptime } from "comptime/rolldown"; export default defineConfig({ input: "src/app.ts", plugins: [comptime()], }); ## API ts import { comptime } from "comptime"; let value = comptime(() => expensivePureWork()); comptime(fn: () => T | Promise): T 被类型化为一个身份辅助函数。该插件要求提供一个无参的单箭头函数或函数表达式。支持的行为包括:- 从 "comptime" 导入的 comptime 绑定,包括别名。- 被遮蔽的局部绑定将被忽略。- 引用的值导入会被捕获到具有绝对导入路径的虚拟模块中。- 来自原始模块的引用顶级声明会被复制到虚拟模块中。- 返回 Promise 的函数体会被等待。- 值通过 devalue 进行序列化。- 构建错误包含原始调用位置的定位信息。- Vite 开发模式使用 server.ssrLoadModule;Vite 构建和 Rolldown 构建使用内部 Rolldown 求值器。 ## 配置选项 ts type ComptimeOptions = { include?: string | string[]; exclude?: string | string[]; timeout?: number; env?: string[] | "all" | "declared"; serializers?: Array<{ test: (value: unknown) => boolean; serialize: (value: unknown) => string; }>; }; 默认值:- timeout:10_000 - env:"all" 当 env 是字符串列表时,静态 process.env.KEY 读取必须在此列表中列出。除非 env 设置为 "all",否则动态环境读取将被拒绝。 ## 常见错误 以下情况在转换过程中会失败: ts comptime(1); // comptime() requires a single arrow function with no parameters ts comptime((value) => value); // comptime() requires a single arrow function with no parameters ts comptime(() => () => 1); // comptime returned a value that cannot be serialized ts comptime(() => { throw new Error("something happened"); }); // build fails ## 限制 本包不添加浏览器端求值、磁盘缓存、Webpack 支持或 esbuild 独立支持。 ## 许可证 MIT © Luke Edwards (https://lukeed.com)
相似文章
在Zig中使用Comptime条件禁用代码
Mitchell Hashimoto解释了如何利用Zig的comptime特性在编译时条件禁用代码,并与C和Go中的实现方式进行了比较。
@voidzerodev: Rolldown 现在以 Rust crate 形式提供,并将持续在那里和 npm 上发布。
Rolldown 是一个构建工具打包器,现在以 Rust crate 形式提供,并将持续在那里和 npm 上发布。
Zig 构建速度正在提升
Zig 0.15 相比 0.14 在编译时性能有显著提升,构建脚本编译时间从约 7 秒降至约 1.7 秒,完整构建时间从 41 秒降至 32 秒,且仍使用 LLVM。本文重点介绍了自托管后端和增量编译方面的进展。
在Zig中利用Comptime实现标签联合子集
Mitchell Hashimoto 展示了如何利用 Zig 的 comptime 创建标签联合的子集类型,无需穷举处理即可实现编译时安全。
@webfansplz:在最新的集成 Rolldown v1 的 Vite DevTools 中,我们修复了大型项目的性能问题。以下是它的运行截图…
最新的集成 Rolldown v1 的 Vite DevTools 修复了大型项目的性能问题,在拥有 30,000 多个模块的 LobeHub 上得到了演示。