Membut File Executable dari Node.js dengan pkg

4 min read

Membuat Executable File dari Node.js dengan pkg
Membuat Executable File dari Node.js dengan pkg (Pemilik logo masing-masing dan flaticon)

TeknoCerdas.com – Salam cerdas untuk kita semua. Normalnya ketika melakukan distribusi aplikasi berbasis Node.js maka komputer target harus memiliki Node.js runtime untuk menjalankan Javascript yang ada. Namun, tahukah jika anda bisa membuat file executable dari aplikasi Node.js sehingga pada komputer target tidak perlu memiliki Node.js runtime untuk menjalankan aplikasi tersebut? Perkenalkan Vercel pkg sebuah tool untuk memaket aplikasi Node.js menjadi sebuah file executable.

pkg adalah sebuah command line tool untuk memaket sebuah aplikasi berbasis Node.js menjadi sebuah file executable yang dapat dijalankan tanpa memerlukan Node.js runtime. Pada tulisan ini kita akan mencoba membuat sebuah file executable dari aplikasi berbasis Express.

Halaman resmi dari pkg dapat dilihat pada https://github.com/vercel/pkg/.

Baca Juga
Debugging Node.js dengan Chrome DevTools

Daftar Isi

0. Persiapan

Sebelum memulai pastikan pada komputer telah terinstal beberapa aplikasi yang diperlukan yaitu:

  • Node.js versi LTS 14 atau 16
  • Vercel pkg
  • Asumsi sistem operasi yang digunakan adalah Linux, macOS atau WSL pada Windows

Jika belum memiliki Node.js maka download terlebih dahulu di halaman website resminya https://www.nodejs.org/download/. Kemudian kembali ke sini untuk melanjutkan.

Kemudian instal Vercel pkg dengan perintah berikut.

$ npm install -g pkg

Verifikasi pkg telah terinstal dengan menjalankan perintah pkg pada terminal.

$ pkg -h
pkg [options] <input>

  Options:

    -h, --help           output usage information
    -v, --version        output pkg version
    -t, --targets        comma-separated list of targets (see examples)
    -c, --config         package.json or any json file with top-level config
    --options            bake v8 options into executable to run with them on
    -o, --output         output file name or template for several files
    --out-path           path to save output one or more executables
    -d, --debug          show more information during packaging process [off]
    -b, --build          don't download prebuilt base binaries, build them
    --public             speed up and disclose the sources of top-level project
    --public-packages    force specified packages to be considered public
    --no-bytecode        skip bytecode generation and include source files as plain js
    --no-native-build    skip native addons build
    --no-dict            comma-separated list of packages names to ignore dictionaries. Use --no-dict * to disable all dictionaries
    -C, --compress       [default=None] compression algorithm = Brotli or GZip

  Examples:

  – Makes executables for Linux, macOS and Windows
    $ pkg index.js
  – Takes package.json from cwd and follows 'bin' entry
    $ pkg .
  – Makes executable for particular target machine
    $ pkg -t node14-win-arm64 index.js
  – Makes executables for target machines of your choice
    $ pkg -t node12-linux,node14-linux,node14-win index.js
  – Bakes '--expose-gc' and '--max-heap-size=34' into executable
    $ pkg --options "expose-gc,max-heap-size=34" index.js
  – Consider packageA and packageB to be public
    $ pkg --public-packages "packageA,packageB" index.js
  – Consider all packages to be public
    $ pkg --public-packages "*" index.js
  – Bakes '--expose-gc' into executable
    $ pkg --options expose-gc index.js
  – reduce size of the data packed inside the executable with GZip
    $ pkg --compress GZip index.js

Jika berhasil maka instalasi pkg telah selesai dan siap digunakan.

1. Install Express

Buat sebuah direktori dengan nama pkg-demo untuk menampung percobaan yang akan dibuat.

$ mkdir pkg-demo
$ cd pkg-demo

Berikutnya adalah instalasi framework Express, gunakan perintah berikut.

$ npm install --save express

Sekarang pada file package.json terdapat ketergantungan terhadap Express.

$ cat package.json
{
  "dependencies": {
    "express": "^4.17.1"
  }
}

2. Membuat Web App Sederhana

Kita akan membuat sebuah web app sederhana yang menampilkan gambar Vercell pkg yang berjalan pada port 3000. Susunan direktori web app yang akan dibuat seperti di bawah.

- pkg-demo/
  - dist/
  - public/
    - assets/
      - pkg.png
  - src/
    index.js

Buat susunan direktori seperti di atas. Pastikan berada pada direktori pkg-demo terlebih dulu.

$ mkdir -p dist/ src/ public/assets/

Sekarang kita akan membuat kode untuk Express yang akan berjalan secara default pada port 3000. Simpan kode berikut pada file src/index.js.

const express = require('express')
const path = require('path')
const app = express()
const port = process.env.APP_PORT || 3000
const staticRoot = path.join(__dirname, '../public')

app.use(express.static(staticRoot))
app.get('/', (req, res) => {
  res.send(`<!DOCTYPE html>
<html>
<body style="font-family: sans-serif">
<h1 style="text-align:center">TeknoCerdas pkg Demo</h1>
<img style="width: 100%" src="assets/pkg.png">
</body>
</html>
`)
})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

Kemudian download asset gambar pkg.png dengan cURL seperti berikut.

$ curl -o public/assets/pkg.png https://res.cloudinary.com/zeit-inc/image/upload/v1509936789/repositories/pkg/pkg-repo-banner-new.png

Setelah itu coba jalankan aplikasi Express yang telah dibuat.

$ node src/index.js
Example app listening at http://localhost:3000

Setelah itu buka web browser dan pastikan bahwa web app berjalan sesuai dengan ekspektasi, lihat gambar di bawah.

Contoh web app Node.js untuk pkg
Web app sederhana dengan Node.js dan Express

3. Membuat File Executable

Langkah berikutnya adalah membuat file executable dari aplikasi Express yang telah ada. Kita akan memanfaatkan tool pkg untuk proses init. Buka file package.json dan ubah isinya seperti berikut.

{
  "dependencies": {
    "express": "^4.17.1"
  },
  "name": "tekno-app",
  "bin": "./src/index.js",
  "pkg": {
    "assets": "public/**/*",
    "target": ["node16-linux-x64", "node16-mac-x64", "node16-win-x64"],
    "outputPath": "dist"
  }
}

Kita menambahkan beberapa atribut yang diperlukan oleh pkg seperti name, bin, dan pkg. Nilai dari bin mengacu pada script utama dari file Express yang akan dijalankan.

Atribut pkg akan dibaca oleh pkg untuk menentukan proses pembuatan file executable. Atribut assets berfungsi untuk memberi tahu pkg lokasi dari file-file assets dari web app yang diperlukan misal CSS, Javascript dan gambar.

Atribut target berguna untuk menentukan target versi Node.js, sistem operasi dan arsitektur CPU yang digunakan. Dalam contoh saya mentarget Node.js v16 dan tiga sistem operasi yaitu Linux, macOS dan Windows.

Kemudian jalankan perintah pkg berikut untuk mulai membuat file executable.

$ pkg --compress GZip package.json
> pkg@5.4.1
compression:  GZip
> Targets not specified. Assuming:
  node16-linux-x64, node16-macos-x64, node16-win-x64
> Fetching base Node.js binaries to PKG_CACHE_PATH
  fetched-v16.12.0-linux-x64          [====================] 100%

  fetched-v16.12.0-macos-x64          [====================] 100%

  fetched-v16.12.0-win-x64            [====================] 100%

Setelah perintah dijalankan maka harusnya terdapat tiga file pada direktori dist/.

$ ls -l dist/
total 168M
-rwxr-xr-x 1 gitpod gitpod 57M Nov  8 02:59 tekno-app-linux
-rwxr-xr-x 1 gitpod gitpod 62M Nov  8 02:59 tekno-app-macos
-rw-r--r-- 1 gitpod gitpod 50M Nov  8 02:59 tekno-app-win.exe

Dapat terlihat bahwa sekarang terdapat tiga file yang masing-masing berakhiran dengan id dari sistem operasi yang berkesesuaian.

4. Menjalankan File Executable

Untuk menjalankan pastikan file sesuai dengan target sistem operasi yang berjalan. Jika sistem operasinya Linux maka file yang harus didistribukasikan adalah tekno-app-linux. Pastikan file tersebut memiliki permission execute sebelum dijalankan.

Untuk menjalankan cukup panggil file tersebut. Berikut adalah contoh dimana saya menjalankan dari Linux.

$ ./dist/tekno-app-linux
Example app listening at http://localhost:3000

Buka browser dan arahkan pada alamat localhost:3000 atau sesuai dengan domain yang digunakan. Web app harusnya berjalan sama dengan ketika menggunakan perintah node ./src/index.js.

Menjalankan Node.js dengan pkg
Menjalankan Node.js dengan pkg

Dapat terlihat bahwa semua script dependencies dari aplikasi tidak terlihat dan semua dipaket pada sebuah file executable. Sehingga distribusi aplikasi menjadi lebih mudah dan juga cocok digunakan pada container.