Electron是一個優秀的跨平台桌面端應用的框架,官網給出的簡紹很簡單:使用 JavaScript, HTML 和 CSS 構建跨平台的桌面應用
。好多朋友也想試試使用前端技術來做一個桌面應用,但是往往在安裝的時候就直接報錯了,大多數的錯誤是:
1 |
Error: read ECONNRESET |
解決辦法
解決辦法也是簡單的,如果你是安裝失敗了,那么先把node_modules
中的electron
刪掉,然后重新開始下面的步驟。
-
設置淘寶鏡像源(推薦使用nrm,這一步是為了保證其他依賴不報錯)
1
2npm install -g nrm
nrm use taobao -
設置環境變量並安裝
1
2
3
4
5然后稍等片刻就可以了。
深入研究
通過上面的設置基本上就解決了Electron安裝的問題,現在我們可以深入一下,看看它是怎么解決的。首先我們進入它的源代碼,這個里面有一個npm的文件夾,這個路徑下存放的就是npm上的Electron依賴。打開看看你會發現只有幾個文件,沒錯Electron的依賴包就這么點東西。
那么這么點東西怎么做跨平台的應用的呢?首先看一下package.json
文件,為了方便查看,我拷貝過來一份,如下:
1 |
{ |
內容很少,但有2個部分很重要。一個是script
,可以看到里面有一個postinstall
的鈎子命令,這條命令會在下載完依賴以后執行一下,也就說當依賴安裝完后會執行node install.js
。另外一個重要的部分就是bin
,它指定了運行全局依賴時的入口文件,也就是cli.js
文件,我們稍后再說這個。
先簡單的看一下install.js
,里面最主要的部分是調用了方法downloadArtifact
,用來下載跟平台相關的Electron可執行文件。下載完后調用extractFile
方法,把文件解壓了,最后在path.txt
中把執行文件的路徑寫進去,這個路徑下是不同平台下的可執行文件的路徑。
最后我們看一下他是從哪里下載的。首先downloadArtifact
方法是在@electron/get依賴里面。我們進入到src/index
中。
此時我們可以看到url是通過getArtifactRemoteURL
方法獲取的,然后我們看一下getArtifactRemoteURL
方法,源碼在這里。
在getArtifactRemoteURL
方法中,可以看到,基礎路徑base
是通過mirrorVar
函數返回的,默認情況是沒有nightly的,所以默認情況下是下面這個樣子的:
1 |
process.env[`NPM_CONFIG_ELECTRON_MIRROR`] || |
而我們很少傳入env的,options也沒有mirror,所以通常是defaultValue
,具體值如下:
綜上,我們可以看到默認情況下安裝的時候會在github的release處下載一個平台相關的可執行文件。但是往往在國內github會很慢,所以這就導致了下載失敗的問題,如果我們的env中傳入ELECTRON_MIRROR
,那就會走該值所對應的地址,通常我們使用淘寶的鏡像http://npm.taobao.org/mirrors/electron
。
同樣的,在構建Windows系統的時候可能會用到依賴windows-build-tools
,該依賴會安裝一個Python,這時可以使用淘寶的鏡像文件會更快一些:
1 |
|
淘寶更多的開源軟件的鏡像可以參考這里。
啟動過程
下載過程基本上我們已經明白了,現在說一下啟動過程。一般啟動Electron的時候調用的命令是electron .
,而electron命令其實是調用依賴包中的cli.js文件,該文件內容如下:
1 |
|
其中var electron = require('./')
的時候是引入當前文件夾下的index.js
文件,內容如下:
1 |
var fs = require('fs') |
index.js
文件內容很少,主要是返回了一個字符串的地址,也就是當前路徑下的dist文件夾下的可執行文件的路徑。還記得下載完后往path.txt
里面寫了一個可執行文件的路徑嗎?
我們再回到cli.js
文件中,從代碼中可以看出,里面啟動了一個子進程,用子進程啟動Electron的可執行文件,並且把參數傳進去了。最后如果主進程中斷或者出現錯誤,那么就把子進程殺掉。當然你也可以直接雙擊dist下的可執行文件,它會啟動一個默認的頁面。