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
- 1. Install Express
- 2. Membuat Web App Sederhana
- 3. Membuat File Executable
- 4. Menjalankan File Executable
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]
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(`
TeknoCerdas pkg Demo
`)
})
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.
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
.
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.