前言
本文主要介紹如何通過electron-packager及electron-builder兩種方式,將已有的electron應用打包成msi格式和exe可執行文件。打包是一個成熟的應用程序一個重要的環節,希望這篇文章可以給大家一些參考,最后會講到打包時遇到的一些坑,與大家分享。
本文適用於有一些electron實踐經驗的小伙伴,知道如何創建一個簡單的electron應用,並且知道electron主進程、渲染進程間如何通信。
electron-packager
使用命令 npm install electron-packager --save-dev
安裝好之后會在package.json
中的devDependencies
生成代碼:
"devDependencies": { "electron-packager": "^9.1.0" }
注意:1、打包時要分清
devDependencies
與dependencies
的區別,文章后會講。
2、package.json 的額外字段 —— productName、author 和 description,雖然這幾個字段並不是打包必備的,但它們會在 Windows 的 Squirrel 安裝包(用於自動更新)中使用到,所以請讀者根據實際情況添加。
安裝好模塊之后,就可以對應用進行打包。electron-packager的打包基本命令是:
electron-packager <sourcedir> <appname> <platform> <architecture> <electron version> <optional options>
參數說明:
- sourcedir:項目所在路徑
- appname:應用名稱
- platform:確定了你要構建哪個平台的應用(Windows、Mac 還是 Linux)
- architecture:決定了使用 x86 還是 x64 還是兩個架構都用
- electron version:electron 的版本
- optional options:可選選項
為了方便起見,在package.json
中添加代碼:
"scripts": { "package": "electron-packager ./ myapp --out ./OutApp --version 1.7.9 --overwrite --icon=./app/img/icon/icon.ico" }
然后在命令行中執行npm run package
打包成功后,會在OutApp目錄(此處的目錄是在參數中配置的)下生成.exe,運行該文件,並且沒有報錯,則說明本次打包成功。
特點:1、支持平台有:Windows (32/64 bit)、OS X (also known as macOS)、Linux (x86/x86_64);
2、進行應用更新時,使用electron內置的autoUpdate
進行更新
3、支持CLI和JS API兩種使用方式;
electron-builder
首先來看看什么是electron-builder,來自官方的解釋:
A complete solution to package and build a ready for distribution Electron, Proton Native or Muon app for macOS, Windows and Linux with “auto update” support out of the box.
簡單的說,electron-builder就是有比electron-packager有更豐富的的功能,支持更多的平台,同時也支持了自動更新。除了這幾點之外,由electron-builder打出的包更為輕量,並且可以打包出不暴露源碼的setup安裝程序。考慮到以上幾點,我果斷選擇了electron-builder       (微笑
首先,依舊是安裝依賴。
(這里官方強烈推薦使用yarn安裝依賴包,但我使用了npm安裝的依賴也可以正常打包,所以至於為什么官方強烈推薦用yarn,我還沒搞懂其原因,還請了解緣由的大佬們賜教)
yarn add electron-builder --save-dev
在package.json
中做如下配置
"build": { "appId": "com.xxx.app", "mac": { "target": ["dmg","zip"] }, "win": { "target": ["nsis","zip"] } }, "scripts": { "dist": "electron-builder --win --x64" },
在命令行中執行npm run dist
,執行結果如下:
打包后在dist目錄生成如下文件:
解壓zip包或執行setup安裝文件,應用啟動后且沒有報錯,則說明本次打包成功。
特點:1、electron-builder 可以打包成msi、exe、dmg文件,macOS系統,只能打包dmg文件,window系統才能打包exe,msi文件;
2、幾乎支持了所有平台的所有格式;
3、支持Auto Update;
4、支持CLI和JS API兩種使用方式;
坑
研究electron打包的過程中踩了不少坑,打包涉及到不少系統級別的問題,從最初的選型到最后的成功打包,看似是個簡單的過程,但其中仍有一些需要注意到的地方,我在這里分兩點說明:
devDependencies與dependencies的區別
dependencies
表示我們要在生產環境下使用該依賴,devDependencies
則表示我們僅在開發環境使用該依賴。在打包時,一定要分清哪些包屬於生產依賴,哪些屬於開發依賴,尤其是在項目較大,依賴包較多的情況下。若在生產環境下錯應或者少引依賴包,即便是成功打包,但在使用應用程序期間也會報錯,導致打包好的程序無法正常運行。
npm與cnpm的區別
說到npm
與cnpm
的區別,可能大家都知道,但大家容易忽視的一點,是cnpm
裝的各種node_module
,這種方式下所有的包都是扁平化的安裝。一下子node_modules
展開后有非常多的文件。導致了在打包的過程中非常慢。但是如果改用npm
來安裝node_modules
的話,所有的包都是樹狀結構的,層級變深。
由於這個不同,對一些項目比較大的應用,很容易出現打包過程慢且node內存溢出的問題(這也是在解決electron打包過程中困擾我比較久的問題,最后想到了npm與cnpm的這點不同,解決了node打包內存溢出的問題,從打包一次一小時優化到打包一次一分鍾,極大的提高了效率)。
所以建議大家在打包前,講使用cnpm
安裝的依賴包刪除,替換成npm
安裝的依賴包。