
scriptc WebAssembly支持WASI Preview 1构建与运行TypeScript程序实战教程【免费下载链接】scriptcTypeScript-to-Native Compiler项目地址: https://gitcode.com/GitHub_Trending/sc/scriptcscriptc是一款 TypeScript 转原生编译器它能把 TypeScript / JavaScript 直接编译为可移植的WASI Preview 1WebAssembly 模块。无需 Node 运行时、无需浏览器编译出的.wasm文件就是一个独立的 WASI 可执行程序。本文将带你快速完成安装依赖 → 构建第一个 WebAssembly 模块 → 一行命令运行并讲清 WASI 支持的能力边界。一、为什么用 scriptc 构建 WebAssemblyscriptc 的编译链路是TypeScript/JS → 类型化 IR → 可读的 C → LLVM IR → 原生可执行文件 / .wasm 模块与把 JS 打包塞进 wasm-bindgen 沙箱不同scriptc 的 WASI 目标是生产级 LLVM 目标与原生目标共享同一套语言分层——你写普通 TypeScript 就行不需要学习 WebAssembly 语法。核心优势零运行时依赖生成的.wasm自带小型原生运行时不内嵌 JS 引擎能力完整async/await、Promise、生成器、定时器、文件 API、stdin 事件全部可用跨宿主编译产物可在任何 WASI Preview 1 宿主中运行不绑定 Node二、安装前置依赖Node.js 与 Zig 一键就绪 ⚙️WASI 交叉构建依赖 Zig使用其内置的 WASI libc 和 clang 后端而编译器本身只依赖 Node.js1. 安装 scriptc要求 Node.js 24$ npm install -g scriptc2. 安装 Zig把zig可执行文件加入PATH即可。仓库提供了官方安装脚本scripts/install-zig.sh 关于SCRIPTC_CCzigcc这是 scriptc 选择调用 Zig 的cc子命令的开关zigcc本身不是一个独立程序。Zig 在此只充当编译/链接驱动不需要你本地安装 LLVM。两个关键环境变量构建 WASI 时成对使用环境变量作用SCRIPTC_CCzigcc使用 Zig 的 clang 作为 C 编译器SCRIPTC_TARGETwasm32-wasi指定目标平台为 WebAssembly / WASI Preview 1三、三步构建你的第一个 WASI WebAssembly 模块 第 1 步创建hello.tsconst who process.argv.length 2 ? process.argv[2] : world; console.log(hello, ${who});第 2 步执行构建命令$ SCRIPTC_CCzigcc SCRIPTC_TARGETwasm32-wasi scriptc build hello.ts --no-keep-c -o hello.wasm /dev/null $ file hello.wasm hello.wasm: WebAssembly (wasm) binary module version 0x1 (MVP)第 3 步验证产物用-o hello.wasm指定输出路径省略时默认写到.scriptc/hello.wasm--no-keep-c表示构建完成后不保留中间 C 文件保持目录整洁file命令确认这就是一个标准的 WebAssembly 二进制模块四、用 scriptc run 一行命令运行 WASI 程序 ▶️构建完不必手动找宿主直接$ SCRIPTC_CCzigcc SCRIPTC_TARGETwasm32-wasi scriptc run hello.ts hello, worldscriptc run会在独立子进程中把模块交给 Node 内置的 WASI Preview 1 实现来运行。这套宿主逻辑在 packages/cli/src/wasi-runner.ts 中实现做了两件贴心事继承 stdio 与环境变量你的终端输入输出、ENV变量原样透传给模块按能力模型挂载文件系统把当前工作目录预打开为 guest 的/宿主平台的真实临时目录映射为 guest 的/tmp路径映射规则见 packages/cli/src/paths.ts把 WASI 实例放在 CLI 进程之外还有一个好处程序里的process.exit()或异常 trap 不会把编译器进程带崩退出码被干净隔离。五、WASI 上支持哪些 TypeScript 能力✨wasm32-wasi是与原生目标同等语言分层的生产级 LLVM 目标32 位 LLVM ABI 完整支持集合、闭包、异常、类、受检查的动态值async/await、Promise、同步与异步生成器定时器、process.exit监听器、stdin/readline 事件回调与 Promise 双形态的文件系统 API--dynamic模式把 npm 包的 JavaScript 嵌入执行QuickJS 代码岛运行时不读node_modules预编译好的 WASI 运行时包位于 packages/runtime-wasm32-wasi/见其 package.json随 scriptc 一起分发构建时无需从零编译运行时 C 代码。六、WASI Preview 1 能力边界这些 API 会报 SC3002 ⚠️WASI Preview 1 是能力安全模型部分宿主能力在规范中尚不存在。以下 API 会在链接前就被拒绝报诊断码SC3002不可用能力涉及 API网络socket、fetch子进程child_process系统信号process.on(SIGxxx)等网络接口os.networkInterfaces()文件监听fs.watch其他--sanitize、原生 FFI、--lib库模式归档这是 WASI 规范的能力上限不是 scriptc 的缺陷——官方文档 docs/src/app/platforms/page.mdx 对边界有完整描述。文件系统的可访问范围同样受宿主 preopen 能力约束。 小提示WASI 目标强制走 LLVM 后端调试用的 C 后端仅在显式--backend c且程序不含协程时可用含协程会报SC3001且永远不会静默回退到 C。七、把 .wasm 交给任意 WASI 宿主 scriptc build产出的是独立.wasm模块。它不依赖 scriptc 的任何运行时环境可以在任意 WASI Preview 1 宿主中加载——例如其他语言的 WASI 运行时、Wasmtime 一类的引擎前提是宿主提供相同的 preopen 目录与环境。典型工作流因此非常灵活# 构建 $ SCRIPTC_CCzigcc SCRIPTC_TARGETwasm32-wasi scriptc build hello.ts -o hello.wasm # 本地验证 $ SCRIPTC_CCzigcc SCRIPTC_TARGETwasm32-wasi scriptc run hello.ts # 分发 hello.wasm 给任何 WASI Preview 1 宿主常见问题 ❓Q构建 WASI 模块需要装 clang 或 LLVM 吗不需要。SCRIPTC_CCzigcc路线下由 Zig 自带的 clang 与 WASI libc 完成编译链接--emitir|c|llvm等纯源码产物甚至只需要 Node。Q--dynamic在 WASI 上能用吗可以。QuickJS 代码岛是 WASI 目标支持的语言分层之一npm 依赖会被直接嵌入模块。Q为什么我的网络请求构建失败WASI Preview 1 没有可移植的 socket/fetch 能力涉及网络、子进程、信号、fs.watch的代码会在链接前报SC3002详见第六节的能力边界表。小结用 scriptc 做 WebAssembly 开发只需记住一条主线装好 Node Zig →SCRIPTC_CCzigcc SCRIPTC_TARGETwasm32-wasi scriptc build→ 产物即标准 WASI Preview 1 模块本地用scriptc run验证远端交给任何 WASI 宿主。TypeScript 的完整异步模型与文件 API 都能带进 32 位沙箱这正是编译而非运行时路线的价值所在。【免费下载链接】scriptcTypeScript-to-Native Compiler项目地址: https://gitcode.com/GitHub_Trending/sc/scriptc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考