
scriptc 源码级编译新特性--provenance-sources 如何把 npm 依赖从运行升级为编译【免费下载链接】scriptcTypeScript-to-Native Compiler项目地址: https://gitcode.com/GitHub_Trending/sc/scriptcscriptc 是一个 TypeScript 到原生编译器的实验项目它的--provenance-sources实验特性更进一步借助 npm 来源证明provenance attestation锁定依赖包的原始提交把发布包里的 JavaScript 替换成真正的 TypeScript 源码参与静态编译——依赖不再是在嵌入式引擎里跑而是被编译进你的二进制。一、为什么需要它npm 依赖一直是静态编译的盲区在 scriptc 中你写的代码会被静态编译成原生机器码但 npm 依赖发布出来的 JavaScript 没有类型、常被压缩原本只能交给内嵌的动态引擎执行。--provenance-sources想解决的问题就是能不能拿到依赖包的发布时源码像编译自己代码一样编译它关键前提是 npm 的来源证明机制包作者发布时签发的 SLSA provenance 声明会记录这个 dist 是从哪个仓库、哪个 commit 构建的。有了这个可信锚点编译器就能精确地取回那个提交的源码树。二、工作原理五步流水线全程可回退整条流水线在 provenance-core.ts 中实现逻辑清晰且任何一步失败都不会导致构建失败——该包自动退回动态岛路径只在报告中留下说明步骤做什么结果1. 预扫描在程序加载前轻量解析入口文件的 import 闭包收集所有裸 npm 说明符得到待处理包列表2. 取证明向 npm registry 请求该包对应版本的 provenance attestation得到{repo, commit}3. 拉源码按 commit 拉取源码树内容寻址缓存在~/.cache/scriptc/provenance/commit同一 commit 只拉一次本地源码快照4. 定位包支持 monorepo按packages/name等约定布局 有限深度扫描定位包目录包源码目录5. 映射入口把exports的 dist 目标如dist/esm/index.js启发式重写到源码孪生文件src/index.ts编译器拿到真正的 .ts映射成功后这些源码会以 tsconfigpaths的形式注入前端见 provenance-registry.ts让类型检查器、预检解析器、模块图三处咽喉点看到同一份源码——从此它们就是普通的项目模块。几个值得注意的工程设计硬上限保护单次编译最多为 16 个包做源码映射MAX_PACKAGES超出者退回动态岛并写明原因离线钩子设置SCRIPTC_PROVENANCE_MANIFEST环境变量可预置包到源码目录的映射完全跳过网络测试夹具就走这条路见 provenance.test.ts 的头部注释诚实的版本提示若源码树的package.json版本与安装版本不一致发布时才升版的工具链报告里会明确标注用行为差异测试作为真实性校验。三、如何上手一条命令开启实验特性安装后需要 Node 24 或更新版本构建时加上标志即可$ scriptc build tool.ts --provenance-sources -o tool该标志在 CLI 中的定义为从来源证明锁定的源码、在证明的 commit 处以静态程序模块编译 npm 依赖没有可用证明的包保持引擎路径一条说明而非失败完整说明见 CLI 文档 与 npm Dependencies 文档。⚠️ 两点提醒它是实验特性成熟度与--npm-static同级静态覆盖率高但部分无法静态化的位置会被延迟defer报告会逐条点名原型阶段尚未验证 sigstore bundle 签名证明按服务端所给即信任处理也不做 dist 与源码的构建复现校验——行为差异比对是目前诚实的检验手段缺口清单见 provenance-core.ts 头部注释。四、它验证了什么字节级一致的双轨测试项目的测试 tests/harness/provenance.test.ts 定义了这条特性的核心契约非常有说服力源码静态二进制加--provenance-sources不加--dynamic与发布 dist 的动态岛二进制加--dynamic二者运行输出必须字节一致并且都要与 Node 直接运行该包的结果一致。注意第一个二进制能不加--dynamic构建成功本身就证明了依赖真的被静态编译进了程序而不是偷偷进岛。测试还覆盖了子路径导入映射greeter/echo→src/echo.ts、__PURE__死代码消除、以及无法映射的包只降级不报错的回退契约。五、它带来什么、还不能做什么能得到的依赖代码获得真实类型、真实语句进入静态前端的完整能力边界编译后二进制更小、启动更快不再为此依赖加载约 620KB 的动态引擎scriptc coverage报告给出逐包归属每个包究竟是源码静态、还是进了岛一目了然失败永远是说明而非报错构建体验平滑。目前的边界官方明确标注的原型缺口仅支持 GitHub 仓库的源码拉取经 codeload其他平台的仓库暂不可用传递依赖的版本从当前项目的安装树解析而非依赖包自己的 lockfile入口映射是启发式dist/lib/build→src重写特殊布局可能映射不到。六、写在最后--provenance-sources代表了 TypeScript 原生编译器的一个有想象力的方向供应链的可信元数据 编译器把依赖只能被解释执行的默认假设打破。它还在实验阶段但设计上的永远可回退、报告永远诚实已经体现了成熟工程的气质。如果你的项目依赖大量 TypeScript 编写的 npm 包且这些包发布了来源证明不妨现在就试试这条标志再用 coverage 报告看看你的依赖里有多少源码级可编译的比例。相关源码路径速查流水线实现packages/compiler/src/frontend/provenance-core.ts注册表与三个咽喉点packages/compiler/src/frontend/provenance-registry.tsCLI 入口接线packages/cli/src/bootstrap.ts功能文档docs/src/app/dependencies/page.mdx特性测试tests/harness/provenance.test.ts【免费下载链接】scriptcTypeScript-to-Native Compiler项目地址: https://gitcode.com/GitHub_Trending/sc/scriptc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考