Facebook Instagram GitHub LinkedIn
Programming

Memperkecil Ukuran Bundle Aplikasi Desktop Dari Electron Vite

Pemrograman JavaScript

Beberapa hari yang lalu ketika saya menyelesaikan project IPTV Desktop yang saya buat. Saya kembali menyadari satu hal yang membuat electron kurang saya sukai, ukuran dari bundle aplikasinya. Installer aplikasi electron biasanya berukuran lebih dari 100 MB dan ketika sudah diinstall akan menggunakan lebih dari 200 MB penyimpanan. Bahkan untuk sekedar "Hello World" saja mungkin juga akan menghasilkan ukuran sedemikian besarnya.

Penyebab Besarnya Ukuran Aplikasi Electron

Aplikasi electron memiliki ukuran yang sangat besar tidak lain dan tidak bukan karena Electron memasukkan Chromium dan NodeJS ke dalam bundle aplikasi yang kita buat. Hal ini agar aplikasi dapat menjalankan kode javascript di bagian core atau backend dan menampilkan kode HTML, CSS dan JavaScript di bagian depan atau frontend nya.

Mengeidentifikasi Penyebab Ukuran Bundle Besar

 Jika kita membuat aplikasi menggunakan electron vite, maka otomatis akan menggunakan electron builder untuk memanage build aplikasi ke production dan melakukan generate installernya.

Saat kita menjalankan perintah untuk membuild aplikasi kita, maka electron builder akan menghasilkan beberapa file dan folder di folder dist. Disini kita akan mendapatkan folder dengan suffix -unpacked. Misalnya jika saya menggunakan linux akan mendapatkan folder dengan nama linux-unpacked. Disini lah berkas-berkas yang dimasukan ke dalam installer dan akan dimasukan ke komputer user.  Bundle dari kode HTML, CSS dan JavaScript yang kita buat akan dimasukkan kedalam file app.asar di folder resources. 

File .asar adalah hasil kompresi dari beberapa file, untuk melihat isinya kita akan menggunakan bantuan package asar dari electron:

GitHub - electron/asar: Simple extensive tar-like archive format with indexing
Simple extensive tar-like archive format with indexing - electron/asar
github.com
Preview link to GitHub - electron/asar: Simple extensive tar-like archive format with indexing

Jalankan package tersebut didalam folder yang berisikan app.asar dengan npx atau pnpm dlx:

pnpm dlx @electron/asar extract app.asar ~/direktori-ekstrak

Perintah tersebut akan mengekstrak app.asar ke folder ~/direktori-ekstrak (~ berarti home directory user saat ini pada linux dan MacOS).

Coba buka folder hasil ekstrak tersebut, kita akan mengetahui file atau folder mana yang menyebabkan ukuran bundle aplikasi kita besar.

Package Yang Masih Dibundle di node_modules

Ketika kita melakukan bundle aplikasi kita ke mode production, package-package frontend kita seperti react, lit, vue dan library lain yang kita gunakan di frontend seperti lucide icon, hls.js, redux, dll seharusnya sudah tidak kita gunakan ketika menjalankan aplikasi di production. Hal ini karena bundler kita (rollup atau webpack) sudah menggabungkan package tersebut menjadi satu dengan aplikasi kita (akan berada di folder out/renderer secara default di project electron vite).

Namun, ketika saya membuild aplikasi IPTV Desktop saya ternyata package-package frontend yang saya gunakan masih terbundle ke folder node_modules di dalam app.asar. Lalu bagaimana cara mengatasinya? Saya memindahkan dependensi library-library frontend saya dari "dependencies" ke "devDependencies" di file package.json. Setelah itu saya lakukan pnpm install dan coba lakukan build lagi dan hasilnya library yang saya gunakan di frontend sudah tidak terbundle lagi oleh rollup. Namun, jangan pindahkan library yang anda gunakan di proses main / core aplikasi anda ke dev dependency! Kecuali anda mengatur rollup untuk membundlenya juga ke hasil build proses main anda (yang secara default tidak dilakukan oleh boilerplate electron vite).

Menggunakan Minifying

Ketika anda membuka file js hasil build vite di folder out/renderer secara default tidak akan melalui proses minifying. Dalam arti, spasi, tab, enter dan komentar akan tetap seperti demikian, tidak akan dihapus atau dipersingkat kodenya. Disinilah proses minifying berguna. Dengan melakukan minify kode yang dihasilkan ukurannya akan lebih kecil. Anda dapat membaca dokumentasi dari vite untuk pengaturan selengkapnya:

Build Options | Vite
Next Generation Frontend Tooling
vitejs.dev
Preview link to Build Options | Vite

Disini saya menggunakan terser untuk minifying, jadi saya menginstall package tersebut ke dev dependency:

pnpm add -D terser

Lalu ubah file pengaturan vite (electron.vite.config.ts) di bagian renderer atur minify menjadi terser di mode production:

export default defineConfig(({ mode }) => ({
  // Other Config
  renderer: {
    build: {
      minify: mode === 'production' ? 'terser' : false
    }
  }
}));

Anda juga dapat mengatur css minifying menggunakan lightningcss, silahkan baca di link build options vite yang sudah saya berikan diatas.

Di project ini saya menggunakan LitElement, jadi saya juga menambahkan beberapa plugin untuk minify sesuai dokumentasi dari lit. Sesuaikan ini dengan framework front-end yang anda gunakan.

Menghapus Resource Lokalisasi Chromium

Menghapus resource lokalisasi chromium berguna jika anda tidak memerlukan fungsi lokalisasi dari javascript (fungsi untuk format tanggal, waktu, currency, dsb) atau hanya menggunakan satu lokal saja. Anda dapat mengatur opsi "electronLanguages" di konfigurasi electron builder (electron-builder.yml) menjadi lokal yang akan kita gunakan saja. Contohnya saya hanya akan menggunakan lokal English-US:

electronLanguages: ['en-US']

Lalu anda juga harus memastikan chromium akan menggunakan lokal tersebut dengan menambahkan CLI Flag ke entrypoint aplikasi kita dibagian paling atas (file main/index.ts):

app.commandLine.appendSwitch('lang', 'en-US');

Lalu coba build ulang aplikasi electron kita ke production dan coba lihat di folder dist/***-unpacked/locales, pastikan hanya ada lokal yang akan kita gunakan saja.

Kesimpulan

Dengan menggunakan metode-metode diatas saya berhasil mengurangi ukuran installer aplikasi yang saya buat dari awalnya lebih dari 100 MB menjadi hanya sekitar 70 MB. Anda juga dapat melakukan optimalisasi lain sesuai dengan library yang anda gunakan. Tetapi ukurannya akan tetap tidak akan dapat sekecil aplikasi yang dibuat secara native. Hal ini karena di electron akan tetap membundle chromium yang ukurannya cukup besar. Anda dapat melihat contoh aplikasi yang saya buat dengan electron vite sebagai referensi:

GitHub - iptv-app/iptv-desktop: IPTV-ORG Desktop Electron App
IPTV-ORG Desktop Electron App. Contribute to iptv-app/iptv-desktop development by creating an account on GitHub.
github.com
Preview link to GitHub - iptv-app/iptv-desktop: IPTV-ORG Desktop Electron App