将node代码打包成一个可执行文件
发布于 8 年前 作者 i5ting 18180 次浏览 来自 分享

转一个 @pmq20 在知乎上的回答

https://www.zhihu.com/question/52670355

  1. 打包后运行时的路径分为两种:一种是以 /enclose_io_memfs/ 开头的,关于这种路径的一切文件系统调用(stat、open、read 等)都会被转发到内存中,而不再发往操作系统;另一种是不以此开头的,这些文件系统调用则保持不变,还是发往操作系统

  2. .node 这种二进制模块的行为没有变化,依然从文件系统中加载,因此必须随主程序一起分发

  3. js 代码编译的行为也没有变化,还是在运行时由 v8 的设施进行 JIT 编译的,如 Crankshaft 和 Turbofan。该编译器只是将 js 内置到内存之中,随 node 主程序一起链接编译在一起,而没有真正编译 js 代码,参见其底层依赖的项目 http://github.com/pmq20/libsquash

更多详情请参考: https://speakerdeck.com/pmq20/node-dot-js-compiler-compiling-your-node-dot-js-application-into-a-single-executable

附与其他类似项目的对比:

  • Pkg(https://github.com/zeit/pkg): Pkg 在运行时动态替换了 Node.js 的 fs.* 系列标准库 API 的实现,而 Node.js Compiler 则尽量保持了原有 API 源代码不变,而在更底层的部分用 libsquash 完成工作。Pkg 使用一个大 JSON 来存储内存中的资源文件,而 Node.js Compiler 使用更成熟、更广泛使用的 SquashFS 作为其数据结构。
  • EncloseJS(http://enclosejs.com/): EncloseJS 只允许用户使用五个 fs.* API 访问包内文件,而 Node.js Compiler 允许所有的 fs.* API。EncloseJS 使用的是商业许可证,使用时需要付款;而 Node.js Compiler 是 MIT 许可证,使用者可免费试用,更可自由修改其源代码。
  • Nexe(https://github.com/nexe/nexe): Nexe 因为使用了 Browserify 的缘故,并不支持动态 require。而 Node.js Compiler 支持所有 require 调用,更支持 require.resolve 调用。
  • asar(https://github.com/electron/asar): Asar 使用 JSON 作为数据结构而 Node.js Compiler 使用 SquashFS。Asar 将代码和可执行文件分离,而 Node.js Compiler 将所有项目代码和 Node.js 本身链接在一起,最终生成一个独立的可执行文件。
  • AppImage(http://appimage.org/): AppImage 只支持 Linux,而且只支持内核开启了 SquashFS 的 Linux。 Node.js Compiler 支持 Windows、macOS、Linux 全部三个平台,且不对 Linux 的内核施加任何特别的功能要求。
1 回复

其实现在也是个“可执行”文件呀,嘿嘿

回到顶部