結合React創建Electron桌面應用
最近工作上需要開發一個桌面應用,主要用於展示一些圖表的內容,Electron+ReactJS是一個不錯的解決方案。
Github地址在:egliu/electron-react-material-template
創建一個簡單的Electron桌面應用
在GitHub上有個electron-quick-start的倉庫,需要本地計算機安裝好Git(比如SourceTree)和Node.js,使用步驟如下:
# 克隆倉庫
git clone https://github.com/electron/electron-quick-start
# 使用命令行進入倉庫所在文件夾cd electron-quick-start# 安裝依賴npm install# 運行應用npm start
可以看到一個桌面應用
Electron詳細文檔可以參看官方文檔
創建一個React項目(內容引用《深入淺出React和Redux》,侵刪)
React技術依賴於一個很龐大的技術棧,比如,轉譯JavaScript代碼需要用到Babel,模塊打包工具又要用到Webpack,定製build過程需要grunt或者gulp……這些技術棧都需要各自的配置文件,還沒有開始寫一行React相關代碼,開發人員就已經被各種技術名詞淹沒。
針對這種情況,React的創建者Facebook提供了一個快速開發React應用的工具,名叫create-react-app,這個工具的目的是將開發人員從配置工作中解脫出來,無需過早關注這些技術棧細節,通過創建一個已經完成基本配置的應用,讓開發者快速開始React應用的開發,並且提供了熱調試環境。create-react-app是一個通過npm發布的安裝包,在確認Node.js和npm安裝好之後,命令行中執行下面的命令安裝create-react-app:npm install --global create-react-app安裝過程結束之後,你的電腦中就會有create-react-app這樣一個可以執行的命令,這個命令會在當前目錄下創建指定參數名的應用目錄。我們在命令行中執行下面的命令:create-react-app test_app這個命令會在當前目錄下創建一個名為test_app的目錄,在這個目錄中會自動添加一個應用的框架,隨後我們只需要在這個框架的基礎上修改文件就可以開發React應用,避免了大量的手工配置工作:在create-react-app命令一大段文字輸出之後,根據提示,輸入下面的命令:cd test_appnpm start
這個命令會啟動一個開發模式的伺服器,同時也會讓你的瀏覽器自動打開了一個網頁,指向本機地址http://localhost:3000/ ,顯示界面如下圖所示。
整合Electron和React
Create React App創建的項目是一個純前端項目,整合React項目和Electron並且保留熱調試和本地包引用需要一下幾個簡單的操作:
1.需要安裝electron以及增加啟動命令
使用命令npm install -save electron安裝electron
在腳本里添加啟動命令"electron-start": "electron ."
2. 需要在React項目的根目錄(不是src目錄)創建Electron的啟動文件main.js(main.js文件可以直接拷貝electron-quick-start倉庫里的main.js)
3. 在React項目中的package.json文件中增加main欄位,值為"main.js"
4.修改main.js中的win.loadURL,改為
mainWindow.loadURL(url.format({pathname: path.join(__dirname, ./build/index.html), protocol: file:, slashes: true }))
到目前為止,在根目錄下運行npm run build + npm run electron-start 就可以啟動React創建的桌面應用了。
運行結果如下:
發現是一個內容為空的界面,我們還需要做如下修改:
在文件package.json中添加欄位 "homepage":"."
原因:默認情況下,homepage是http://localhost:3000,build後,所有資源文件路徑都是/static,而Electron調用的入口是file:協議,/static就會定位到根目錄去,所以找不到靜態文件。在package.json文件中添加homepage欄位並設置為"."後,靜態文件的路徑就變成了相對路徑,就能正確地找到了。
在根目錄下運行npm run build + npm run electron-start,運行結果如下:
這樣就結束了嗎?大家再仔細回顧下,我們修改完配置之後運行了兩條命令npm run build和npm run electron-start,每次都要npm run build後才能看到修改結果,而前面的內容提到過create-react-app提供了熱調試環境,我們怎麼在Electron中使用熱調試呢?簡單來說就是代碼的修改能及時反饋到UI上,不需要做任何額外的操作呢?
簡單。在main.js文件中將啟動頁修改為 http://localhost:3000/
win.loadURL(http://localhost:3000/)
開發時,需要啟動兩個終端,一個終端啟動npm start, 另一個終端啟動npm run electron-start,這樣在electron中就可以熱調試了。
不過編譯發布時需要改回從build/index.html,這樣很麻煩,可以在package.json中定義個DEV欄位,設置為true/false,然後修改main.js,代碼如下:
const pkg = require(./package.json) // 引用package.json //判斷是否是開發模式 if(pkg.DEV) { win.loadURL("http://localhost:3000/")} else { win.loadURL(url.format({ pathname:path.join(__dirname, ./build/index.html), protocol:file:, slashes:true }))}
以後運行npm run electron-start 之前,根據需要修改DEV為true/false就行了
GitHub上還有個使用Timeout的方法,實現的方式也可行,有興趣可以參考下:https://gist.github.com/matthewjberger/6f42452cb1a2253667942d333ff53404
推薦閱讀:
※基於 Webpack 的應用包體尺寸優化
※React Native和React有啥區別?
※還在用 Redux,要不要試試 GraphQL 和 Apollo?
※2017 年底如何比較 Angular 4, React 16, Vue 2 的開發和運行速度?
※前端每周清單第 10 期:Firefox53、React VR發布、JS測試技術概述、Microsoft Edge現代DOM樹構建及性能之道