技术细节
为了你更好的使用 OneScript,我们提供了一些技术细节的说明。
运行时
脚本由 iOS 系统自带的 WebView 执行,并提供面向 Node.js 的兼容层。Node.js API 的支持范围、限制与各模块说明见 Node.js 兼容性。
每次运行都会创建独立的 WebView 虚拟机。项目先由 esbuild 打包,再交给运行时执行:
| 组件 | 职责 |
|---|---|
| WebView | 执行用户脚本 |
| esbuild | 将项目打包为 JavaScript |
| pnpm | 依赖管理 |
编译
由嵌入的 esbuild 将项目打包为 ESM JavaScript(输出到 dist/index.js),再交给 WebView 执行。打包时会把 Node.js 内置模块映射到兼容层,并支持 TypeScript、JSX,以及图片、字体、Wasm 等静态资源。
运行期动态计算的 import() 无法打包,构建会失败。
pnpm
安装、添加或移除依赖时,内部通过嵌入的 pnpm 执行,并固定以下选项:
| 选项 | 说明 | 原因 |
|---|---|---|
--config.ignore-scripts=true | 不执行依赖包的 lifecycle scripts(如 preinstall / postinstall) | iOS 禁止创建子进程;pnpm 执行 lifecycle scripts 依赖 child_process,无法运行 |
--config.ignore-pnpmfile=true | 不执行 .pnpmfile.cjs | 同样可能执行任意脚本或拉起子进程 |
--config.node-linker=isolated | 使用 pnpm 隔离的 node_modules 布局 | 避免扁平化安装带来的幽灵依赖 |
--config.package-import-method=hardlink | 以硬链接方式导入包内容 | 适配 App 沙盒文件系统 |
此外:git 依赖不可用;原生模块(.node / binding.gyp)不可用;依赖 lifecycle scripts、原生可执行文件或包内 CLI(bin)的包,在 App 内无法运行。
How is this guide?
最后更新于