Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Node.js Compiler: compiling your Node.js application into a single executable

Node.js Compiler: compiling your Node.js application into a single executable

Node.js Compiler:将您的 Node.js 应用编译成单个可执行文件

https://github.com/pmq20/node-compiler

Minqi Pan

March 01, 2017
Tweet

More Decks by Minqi Pan

Other Decks in Programming

Transcript

  1. Node.js Compiler
    Minqi Pan

    View full-size slide

  2. I’m Minqi Pan
    one of Node.js Collaborators

    View full-size slide

  3. before Node.js Compiler

    View full-size slide

  4. Slow Installation
    • “npm install fengdie” took 2m12.560s
    • Great-Wall’ed in China
    • Remembered to use npm -g with sudo?

    View full-size slide

  5. Too much complexities
    • “Should I care about those WARN’s?”
    • “or should I not?”

    View full-size slide

  6. Node.js Runtime?
    • Making sure your user used the correct Node.js
    • Could multiple Node.js versions co-exist?
    • Wish to use ECMAScript 2017?

    View full-size slide

  7. after Node.js Compiler

    View full-size slide

  8. How to Compile

    View full-size slide

  9. How it Works

    View full-size slide

  10. Introducing
    /__enclose_io_memfs__
    a “mounted” disk in RAM for your project

    View full-size slide

  11. Basic Idea
    System calls on paths starting with

    /__enclose_io_memfs__

    are redirected to the RAM while others to the FS

    View full-size slide

  12. /__enclose_io_memfs__/… others
    Image Curtesy: Evan-Amos

    View full-size slide

  13. But there are so many API’s
    • require, require.resolve
    • fs.readFile, fs.readFileSync, fs.ReadStream
    • fs.readlink, fs.stat, fs.statSync, fs.readlinkSync
    • …

    View full-size slide

  14. Yet we did this in 8 files only

    View full-size slide

  15. That’s because…
    https://github.com/pmq20/libsquash
    libsquash
    https://github.com/pmq20/node-compiler
    Node.js Compiler

    View full-size slide

  16. Introducing SquashFS

    View full-size slide

  17. SquashFS
    • a compressed read-only file system
    • used by the Live CD versions of Arch
    Linux, Debian, Fedora, Gentoo, Mint,
    Salix, Ubuntu
    • used on OpenWrt and DD-WRT router
    firmware

    View full-size slide

  18. fengdie’s

    node_modules/
    148M
    fengdie.squashfs
    16M

    View full-size slide

  19. SquashFS
    • Introduced in 2009 with Linux 2.6.29
    • File format very stabilized
    • Unsquashfs and mksquashfs have win32 ports;
    7-Zip on win32 also supports SquashFS
    • Part of kernel; GPL Licensed

    View full-size slide

  20. Introducing libsquash

    View full-size slide

  21. https://github.com/pmq20/libsquash
    libsquash
    • MIT licensed
    • Super embeddable
    • 1 dependency only, which
    could be statically linked
    • Compiles on 3 platforms, even
    Windows XP with VC++ 2010
    • Introduces VFD - virtual file
    descriptor, intercepting
    system calls unobtrusively
    libsquash

    View full-size slide

  22. API of libsuqash
    mirroring system calls

    View full-size slide

  23. Virtual File Descriptor
    generated by a duplicating file descriptor 0

    View full-size slide

  24. Use libsquash unobtrusively
    Just include a header and it’s done!

    View full-size slide

  25. Use libsquash unobtrusively
    Win32 API works as well

    View full-size slide

  26. Hard-code an Entrance

    View full-size slide

  27. node ~/fengdie/bin/cli.js
    (argv[1] preset to /__enclose_io_memfs__/bin/cli.js)
    ./fengdie

    View full-size slide

  28. fengdie/*
    fengdie.squashfs
    mksquashfs

    View full-size slide

  29. fengdie/*
    fengdie.squashfs
    libsquash compile

    View full-size slide

  30. fengdie/*
    fengdie.squashfs
    libsquash
    Node.js Runtime compile

    View full-size slide

  31. fengdie/*
    fengdie.squashfs
    libsquash
    Node.js Runtime

    View full-size slide

  32. fengdie/*
    fengdie.squashfs
    libsquash
    Node.js Runtime

    View full-size slide

  33. fengdie/*
    fengdie.squashfs
    libsquash
    Node.js Runtime
    fengdie.exe
    Statically Link
    Statically Link

    View full-size slide

  34. fengdie/*
    fengdie.squashfs
    libsquash
    Node.js Runtime
    fengdie.exe
    Statically Link
    Statically Link

    View full-size slide

  35. fengdie.exe
    Distribute and Enjoy

    View full-size slide

  36. Download & Install

    View full-size slide

  37. nodec is also enclosed
    Operating
    System
    Architecture
    Download Link
    Windows x86
    https://sourceforge.net/projects/
    node-compiler/files/v0.9.4/
    nodec.exe/download
    macOS x86-64
    https://sourceforge.net/projects/
    node-compiler/files/v0.9.4/nodec-
    darwin-x64/download
    Linux x86-64
    https://sourceforge.net/projects/
    node-compiler/files/v0.9.4/nodec-
    linux-x64/download

    View full-size slide

  38. Install on Windows
    • SquashFS Tools 4.3
    • Python 2.6 or 2.7
    • Visual Studio 2015 Update 3, all editions including
    the Community edition (remember to select
    "Common Tools for Visual C++ 2015" feature
    during installation).
    • Then download the executable nodec.exe and run
    it from the VC++ or VS Command Prompt.

    View full-size slide

  39. Install on macOS
    • SquashFS Tools 4.3: brew install squashfs
    • Xcode + Command Line Tools
    • Python 2.6 or 2.7
    • GNU Make 3.81 or newer

    View full-size slide

  40. Install on macOS
    • curl -L https://sourceforge.net/projects/node-
    compiler/files/v0.9.4/nodec-darwin-x64/
    download > nodec
    • chmod +x nodec
    • ./nodec

    View full-size slide

  41. Install on Linux
    • SquashFS Tools 4.3
    • gcc and g++ 4.8 or newer, or
    • clang and clang++ 3.4 or newer
    • Python 2.6 or 2.7
    • GNU Make 3.81 or newer

    View full-size slide

  42. Install on Linux
    • curl -L https://sourceforge.net/projects/node-
    compiler/files/v0.9.4/nodec-linux-x64/download
    > nodec
    • chmod +x nodec
    • ./nodec

    View full-size slide

  43. Commercial-license-free

    View full-size slide

  44. Proprietary-license-free

    View full-size slide

  45. Super Redistributable
    libsquash MIT
    Node.js MIT
    libuv MIT
    v8 BSD

    View full-size slide

  46. Super Redistributable
    zlib zlib License
    openssl
    Apache

    4-clause BSD
    HTTP Parser MIT
    c-ares MIT

    View full-size slide

  47. Applications

    View full-size slide

  48. Quicker Install / Upgrade
    • Quicker upgrading embedded node.js
    applications / plugins
    • Quicker upgrading embedded node.js
    applications / plugins
    • E.g. fengdie inside the Tea IDE

    View full-size slide

  49. Enabling Node.js Developers
    • Build softwares instead of modules
    • Distribute to non-technical users
    • Merchandise by building personal / enterprise
    softwares

    View full-size slide

  50. Code Protection
    • Enable code signing for the entire application;
    guarantee not being altered or corrupted
    • Prevent hacking by users modifying exposed
    Javascript source code
    • Applicable to NW.js applications (DingTalk) and
    Electron applications (Tea)

    View full-size slide

  51. Use --tmpdir=/a/fixed/location

    View full-size slide

  52. Use CentOS release 5.8

    with gcc and g++ 4.8

    (possibly from devtoolset-2 of slc5-devtoolset)

    View full-size slide

  53. Use Windows

    with a big Virtual Memory

    View full-size slide

  54. Check dependencies using
    Dependency Walker, otool, ldd

    before releasing

    View full-size slide

  55. https://github.com/pmq20/node-compiler
    Thank You

    View full-size slide