Deno編譯:打造自包含的可執行程序
(最初发布在deno.com/blog)
自Deno v1.6以来, [deno compile](https://docs.deno.com/runtime/reference/cli/compiler/)
命令使开发人员能够将JavaScript和TypeScript程序转换成在所有主要平台上运行的独立的可执行文件——无需额外依赖或安装。这具有重要的意义,这对开发人员来说是个好消息。
- 跨平台兼容性:分发一个不需要Deno运行时或依赖项的单个二进制文件。
- 内置资源:将应用程序所需的一切打包到二进制文件中,使其更易于携带。
- 简化部署:只需部署一个二进制文件到生产环境,降低复杂性。
- 更快的启动时间:与典型的服务器或运行时设置相比,启动速度更快。
自 Deno 2 起,我们为 deno compile
引入了更多的改进,比如 支持 npm 包的安装,支持 web workers,跨平台编译支持,更小的编译二进制文件,以及 使用自定义图标进行代码签名验证。现在,你不仅可以编译脚本,还可以直接将完整应用程序(如桌面游戏)编译成原生二进制文件。
在这篇帖子中,我们将探讨 deno compile
的独特之处,它是如何工作的,以及不同的用例,这些用例突显了它相对于生态系统中其他选项的优势。
你知道🚨️Deno 2 已经来了。🚨️
_对 Node/npm 的向后兼容性、内置的包管理、零配置的一站式工具链以及对 原生 TypeScript 和 Web API 的支持,编写 JavaScript 从未如此简单过。_
deno compile
是什么吗?
Deno 提供了 无需配置的工具链用于 JavaScript 和 TypeScript,因此在编写任何代码之前,你无需事先组装各种工具。其中一个子命令是 deno compile
,它允许你从你的 JavaScript 或 TypeScript 代码中构建一个单一的二进制文件。与 Node 的 8 步编译过程相比,deno compile
只需一个命令。
此子命令允许你在没有安装 Deno 的情况下,跳过安装要求并运行二进制文件,支持 Windows、macOS 和 Linux 等平台。Deno 的编译二进制文件也经过了尺寸优化。如果你是从 Node 转过来的,这种简洁性可以减少在不同环境之间移动代码时的不便,特别是在为不同操作系统进行交叉编译时。
如何使用deno compile
尽管称作“编译”,deno compile
实际上并不像传统意义上的编译 JavaScript。相反,它将你的 JavaScript 和 TypeScript 嵌入到一个特殊的 Deno 运行时二进制文件(名为 denort
)中,denort
实际上是“Deno 运行时”的简称。
当你执行 deno compile
时,以下是高层次的流程简介:
- 下载一个精简版的运行时
denort
。如果你为不同的操作系统进行交叉编译,将下载对应平台的denort
。 - 你的脚本以及所有依赖项将被打包成 eszip 格式,这是一种无损格式,用于序列化 ECMAScript 模块图。
- 利用 Sui 把打包后的文件注入到
denort
二进制文件中。
通过将组件嵌入到可执行文件的一部分中,输出的二进制文件仍然可以进行代码签名验证。
示例 基本自包含的二进制文件让我们先来看看从一个 TypeScript 脚本中生成一个单一的可执行文件有多简单。
// 主文件.ts
import open from "jsr:@rdsq/open";
await open("https://www.youtube.com/watch?v=dQw4w9WgXcQ");
编译它其实很简单,就像这样。
deno compile -A -o runme main.ts
这将生成一个名为runme
的可执行文件,其中包含了所有必要的依赖。现在你可以在任何平台上分享这个文件,而不需要用户去安装Deno。
Medium 不允许我们上传视频,因此你可以看看我们博客上的这篇文章。
注意,你可以在 deno compile
命令中加入像 --allow-net
这样的权限标志。这些标志会保留在编译后的程序中,从而为你提供额外的安全保障,控制程序的使用方式。
说你想与使用 Windows 的用户分享该应用。你可以使用 [--target]
标志来编译适用于 Windows 的版本:
deno compile --allow-all -o runme --target x86_64-pc-windows-msvc main.ts
使用 deno compile
命令编译所有允许的文件为目标 Windows x86_64 平台的可执行文件 runme.exe,并将输出重定向到 runme 文件。注:main.ts
是一个 TypeScript 文件。
现在你已经有了 runme.exe
,一个可以在 Windows 上运行的可执行文件。你甚至可以使用 --icon
参数来添加自定义图标,以获得更专业的外观:
deno compile --allow-all -o runme --target x86_64-pc-windows-msvc --icon icon.ico main.ts
代码签名
代码签名确保你的二进制文件经过验证且可信赖,这一点非常重要。这对于软件分发至关重要。Deno 简化了这一点,甚至在 macOS 上,你甚至可以像操作其他任何应用程序一样使用 codesign
。
咱们来确认我们的二进制文件是否完整
codesign --verify -vv ./runme:
./runme: 磁盘上的签名有效
./runme: 符合其指定要求
我们编译的二进制文件已经正确签名,准备好了,可以发布了。
构建 NPM包当然可以使用 deno compile
来利用 NPM 包中的功能。这种方法非常适合那些对性能要求高的 CI 环境,或者当你需要一个可移植的工具版本时。
比如说,我们可以在 npm 本身使用 deno compile
。
deno compile -A npm:npm
命令 deno compile -A npm:npm
用于将 npm 包编译为可执行文件。其中,deno
是一个运行和构建 JavaScript 和 TypeScript 应用程序的工具,compile
是编译命令,-A
表示生成的可执行文件将包含所有依赖项,npm:npm
表示要编译的 npm 包。
运行编译后的 npm
二进制文件十分简单,甚至还能看到性能提升。在测试中,Deno 编译的 npm 二进制文件比普通的 npm 快近 2 倍:
# hyperfine "./npm -v" "npm -v"
基准测试 1: ./npm -v
时间(均值 ± 标准差): 40.1 ms ± 2.0 ms [用户: 37.7 ms, 系统: 5.3 ms]
范围 (最小 … 最大): 38.9 ms … 51.8 ms 71 次运行
基准测试 2: npm -v
时间(均值 ± 标准差): 75.2 ms ± 7.6 ms [用户: 59.1 ms, 系统: 9.0 ms]
范围 (最小 … 最大): 69.2 ms … 105.0 ms 40 次运行
总结
./npm -v 运行速度
比 npm -v 快 1.87 ± 0.21 倍的速度
这种方法对其他流行的 npm 工具,例如 prettier
和 eslint
,也同样适用,让你得到更快、更方便的版本。
deno compile
也提供了将基于 web 的游戏和应用打包为原生桌面程序的可能。比如说,你可以将一个 HTML/CSS/JavaScript 游戏打包成一个易于分享和启动的二进制文件。
看使用 deno compile
捆绑 HTML 游戏的视频演示一下。
可以看看this Flappy Bird,它可以使用 Deno 编译成桌面应用程序。
使用 deno 编译命令来编译你的项目:deno compile --unstable-ffi --env -o flappybird -A main.js
打包资产
虽然目前 deno compile
还不支持直接打包资源(不过未来可能会支持!),但可以将 [.png](https://github.com/littledivy/flappybird/blob/main/Makefile#L9-L15)
或其他资源文件转换为 base64 编码的 [.js](https://github/littledivy/flappybird/blob/main/Makefile#L9-L15)
文件,并将它们导入到项目中,使它们成为最终二进制文件的一部分,让它们能够被包含在最终的可执行文件中。虽然这种方法是一种变通方法,从而使开发人员能够将游戏和其他资源打包到一个单独的可执行文件中。
我们根据您的反馈不断改进 deno compile
,即将推出更新来简化打包流程,支持更多框架,如 Svelte,减小二进制文件的大小,并通过缓存进一步加快启动速度。
🚨️ 想了解更多 Deno 的知识吗? 🚨️
查看我们_学习 Deno 教程系列_,您将学到:
更多简短的视频,简而言之。每周二和周四发布新教程,别错过。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章