1. 程式人生 > >React + Electron封裝並打包成桌面應用

React + Electron封裝並打包成桌面應用

Electron是什麼

Electron 是一個由 GitHub 開發的開源庫,通過將 Chromium) 和Node.js 組合並使用 HTML,CSS 和 JavaScript 進行構建 Mac,Windows,和 Linux 跨平臺桌面應用程式。

原理:

nodejs:

如果你不知道 node.js,那還等什麼快戳這裡,看一看世界上最溫柔可愛的語言。它藉助於 Google 的 V8 引擎,Node.js 是一個能夠在伺服器端執行 JavaScript 的開放原始碼、跨平臺 JavaScript 執行環境,更多解釋請戳維基百科

Chromium:

Chromium 或許你沒聽說過,但是你一定聽說過 chrome 吧!Chromium 是 Google 的開源瀏覽器,是 chrome 背後的那個不太穩定更新快的兄弟版,詳情

戳這裡

組合:

Electron 建立的應用使用網頁作為其 GUI ,因此你可以將其當成由 JavaScript 控制的迷你精簡版Chromium 瀏覽器。也可以將 Electron 當成 node.js 變體,只不過它更專注於桌面應用而非 Web 伺服器。在 Electron 中, 把 package.json 中設定的 main 指令碼的所在程序稱為 主程序。這個程序中執行的指令碼也可通過建立網頁這種方式來展現其 GUI。 因為 Electron 是通過 Chromium 來顯示頁面,所以 Chromium 自帶的多程序架構也一同被利用。這樣每個頁面都執行著一個獨立的程序,它們被統稱為 渲染程序

。通常來說,瀏覽器中的網頁會被限制在沙盒環境中執行並且不允許訪問系統原生資源。但是由於 Eelectron 使用者可在頁面中呼叫 Node.js API,所以可以和底層作業系統直接互動。

優缺點?

總之,優點肯定大於缺點。

優點:

方便快捷的開發桌面應用,跨平臺,對前端開發者友好,活躍的社群,豐富的api......

缺點:

效能肯定比不上原生的桌面應用,釋出的包貌似有一點點大。

OK,接下來開始.........................................................

一、快速建立react專案

首先安裝好GIT和nodejs,安裝好nodejs同時也安裝好了npm

這是使用Facebook開發的reate-react-app 來快速建立一個 react 專案(,命名為react-electron)。

# 安裝 create-react-app 命令,如果已將安裝請忽略
npm install -g create-react-app
# 建立 react專案
create-react-app react-electron
# 啟動專案( create-react-app 真的超級方便啊)
cd react-electron && npm start

npm start之後瀏覽器會自動開啟網址 http://localhost:3000/ ,出現react專案的頁面了

二、安裝Electron

#在react-electron專案目錄下
npm install -save electron

相關配置

react-electron 根目錄(不是 src 目錄)下面新建 main.js 檔案,這個檔案和 electron-quick-start 中的官方預設 main.js 幾乎一模一樣,只修改了載入應用這入口這一個地方:

// 引入electron並建立一個Browserwindow
const {app, BrowserWindow} = require('electron')
const path = require('path')
const url = require('url')

// 保持window物件的全域性引用,避免JavaScript物件被垃圾回收時,視窗被自動關閉.
let mainWindow

function createWindow () {
//建立瀏覽器視窗,寬高自定義具體大小你開心就好
mainWindow = new BrowserWindow({width: 800, height: 600})

  /* 
   * 載入應用-----  electron-quick-start中預設的載入入口
    mainWindow.loadURL(url.format({
      pathname: path.join(__dirname, './build/index.html'),
      protocol: 'file:',
      slashes: true
    }))
  */
  // 載入應用----適用於 react 專案
  mainWindow.loadURL('http://localhost:3000/');
  
  // 開啟開發者工具,預設不開啟
  // mainWindow.webContents.openDevTools()

  // 關閉window時觸發下列事件.
  mainWindow.on('closed', function () {
    mainWindow = null
  })
}

// 當 Electron 完成初始化並準備建立瀏覽器視窗時呼叫此方法
app.on('ready', createWindow)

// 所有視窗關閉時退出應用.
app.on('window-all-closed', function () {
  // macOS中除非使用者按下 `Cmd + Q` 顯式退出,否則應用與選單欄始終處於活動狀態.
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

app.on('activate', function () {
   // macOS中點選Dock圖示時沒有已開啟的其餘應用視窗時,則通常在應用中重建一個視窗
  if (mainWindow === null) {
    createWindow()
  }
})

// 你可以在這個指令碼中續寫或者使用require引入獨立的js檔案.   

配置 package.json

{
  "name": "knownsec-fed",
  "version": "0.1.0",
  "private": true,
  "main": "main.js", // 這裡 配置啟動檔案
  "homepage":".", // 這裡
  "dependencies": {
    "electron": "^1.7.10",
    "react": "^16.2.0",
    "react-dom": "^16.2.0",
    "react-scripts": "1.1.0"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject",
    "electron-start": "electron ." // 這裡 配置electron的start,區別於web端的start
  }
}   

啟動Electron

#都在reatc-electron根目錄下執行
# 由於我們在main.js檔案裡使用了url訪問到react專案,所以在這裡需要先啟動react專案
npm start
# 啟動electron
npm run electron-start

支援熱除錯,當你修改程式碼後,桌面應用也將會重新更新。

三、打包react專案

首先修改main.js, 因為現在你要將 react 專案打包在 build 資料夾下面,所以載入應用處改成如下!當然也可在某個配置檔案裡面配置是否屬於開發,此處用if判斷一下從未進行選擇執行哪段載入應用程式碼。但是這裡為了簡便,暫且使用直接修改的方式:

// 載入應用----react 打包
mainWindow.loadURL(url.format({
  pathname: path.join(__dirname, './build/index.html'),
  protocol: 'file:',
  slashes: true
}))
// 載入應用----適用於 react 開發時專案
// mainWindow.loadURL('http://localhost:3000/');

預設情況下,homepage 是 http://localhost:3000,build 後,所有資原始檔路徑都是 /static,而 Electron 呼叫的入口是 file :協議,/static 就會定位到根目錄去,所以找不到靜態檔案。在 package.json 檔案中新增 homepage 欄位並設定為"."後,靜態檔案的路徑就變成了相對路徑,就能正確地找到了新增如下配置:

"homepage":"."

然後就開始打包 react:

npm run-script build

四、打包electron

常用打包外掛

安裝electron-packager

# knownsec-fed目錄下安裝electron-packager包
npm install electron-packager --save-dev
# 安裝electron-packager命令
npm install electron-packager -g

electron-packager命令介紹

electron-packager <location of project> <name of project> <platform> <architecture> <electron version> <optional options>
  • location of project: 專案的本地地址,此處我這邊是 ~/knownsec-fed
  • location of project: 專案名稱,此處是 knownsec-fed
  • platform: 打包成的平臺
  • architecture: 使用 x86 還是 x64 還是兩個架構都用
  • electron version: electron 的版本

於是,根據我這邊的情況在 package.json 檔案的在 scripts 中加上如下程式碼:

"package": "electron-packager /home/react-electron react-electron --all --out ~/ --electron-version 2.0.6" 
複製程式碼

打包完成後會在~/目錄下生成對應平臺的包,在上述命令的--out後面可見

開始打包

npm run-script package
複製程式碼

提醒

由於打包的時候會把瀏覽器核心完整打包進去,所以就算你的專案開發就幾百k的資源,但最終的打包檔案估計也會比較大。

五、專案原始檔加密

可以看到,在每個包下的resources資料夾裡的app資料夾 就是我們寫的程式,這樣我們的程式碼就是暴露在使用者電腦上的,這非常的不安全,還好electron 自帶了加密功能

首先安裝asar

#安裝asar實用程式
npm install -g asar

接下來在生成的應用的resources資料夾下執行下面命令:

asar pack ./app app.asar

執行完畢後在resources資料夾下可以看見生成的app.asar檔案,此時可以把resources目錄下的app資料夾刪除。

至此完成原始碼檔案的加密。

六、結束語

   因為工作的原因需要用到electron。通過一週時間的研究和學習,可以得出electron確實是一個跨平臺開發應用的利器,通過web開發就能實現wirte once, run every where的理念。很棒。

      最後提一下自己遇到的坑以及一些總結:

  1. 在electron裡面可以呼叫nodejs幾乎所有的功能,當然前提是需要require nodejs的包;
  2. 在react的js頁面或者公司專案用到的Ant Design的一些js頁面需要用到electron時候,通過官方的
    const electron = require('electron')
    語句並不能成功引入,此時需要通過
    const electron = window.require('electron')

    引入;

  3. 還有,最最最重要的一點!!!!開發時候一般都是在main中通過react專案的URL去熱除錯應用,BUT!!此時請在electron生成的視窗中進行除錯!!如果只在瀏覽器的頁面檢視效果,會提示electron的模組無法匯入,無論你用啥方法!

  4. 最後,再提一點自己的感觸。使用nodejs的fs包和electron的dialog、app類能夠首先呼叫不同平臺的檔案選擇器和一些特殊資料夾的的功能,比如說桌面、使用者預設資料資料夾的修改。這裡不多作描述了。~~

本文部分引入此篇部落格的觀點,謝謝作者的慷慨總結!!

相關推薦

React + Electron封裝打包桌面應用

Electron是什麼 ​Electron 是一個由 GitHub 開發的開源庫,通過將 Chromium) 和Node.js 組合並使用 HTML,CSS 和 JavaScript 進行構建 Mac,Windows,和 Linux 跨平臺桌面應用程式。 原理: n

Electron把網頁打包桌面應用進行源碼加密

let 文件名 安全性 called 加密 name tool support 需求 前言   最近想把自己用html+css+js做的網頁界面打包成桌面應用,網上一搜,發現Electron是一個不錯的選擇,試了試,發現效果真的不錯。這裏記錄一下打包過程以作記錄,便於自己以

Electron 將網頁打包桌面應用(web頁面生成exe)

在 HTML5的崛起、JavaScript要一統天下之際,有一個名為【跨平臺】的技術越來越火。為什麼會這麼火?因為軟體開發者只需一次編寫程式,即可在 Windows、Linux、Mac、iOS、Android 等平臺執行,大大降低了程式設計師的工作量,也使公司的產

Electron 將網頁打包桌面應用

1.初始化node專案,生成package.json檔案  1 npm init  2.安裝electron,並儲存為開發依賴項  1 npm install electron -D  3.根目錄下新建index.js檔案 const {app, Bro

vue 使用 Electron打包桌面應用

1. cd目錄到 npm run build 生成的dist資料夾 2.dist目錄下新建package.json、electron.js檔案,內容如下: { "name": "FloorGuidance", "version": "1.0.0", "description"

002-【最簡單】Electron 怎麼將網頁打包桌面應用(web前端頁面怎麼生成exe可執行檔案)

在 HTML5的崛起、JavaScript要一統天下之際,有一個名為【跨平臺】的技術越來越火。為什麼會這麼火?因為軟體開發者

【最簡單】Electron 怎麼將網頁打包桌面應用(web前端頁面怎麼生成exe可執行檔案)

在 HTML5的崛起、JavaScript要一統天下之際,有一個名為【跨平臺】的技術越來越火。為什麼會這麼火?因為軟體開發者只需一次編寫程式,即可在 Windows、Linux、Mac、IOS、

利用Electron將專案前端網頁打包桌面應用

一、環境搭建    1.全域性安裝node.js    2.全域性安裝electron        npm install electron -g    3.準備好要打包的html/js/css等網頁檔案二、進行打包    首先,我們要明白electron打包的檔案架構:你

web項目打包桌面應用

web項目打包成桌面應用下載: git clone https://github.com/dollarphper/desktop.git 把項目文件放到src目錄: 打包成立即執行文件: npm run package 打包成安裝文件: npm run dist web項目打包成桌面應用

2、node-webkit運行web應用,node-webkit把web應用打包桌面應用

file 打包成 type 後綴 什麽 ctype 打包 分享圖片 路徑 下面我通過一個簡單的demo來介紹怎麽樣把一個web應用打包成一個可執行文件(這裏只介紹windows環境) 首先新建一個index.html文件,作為我們這個demo的入口頁面,我們暫且就把這個頁

如何在Maven中構建SWT應用打包可執行的jar包

    前面在Maven中構建SWT應用的時候發現SWT相關jar包在Maven中央倉庫上找不到,後面在stackoverflow上有人提供了一個倉庫地址:https://github.com/maven-eclipse/maven-eclipse.github.io。 &n

web應用打包桌面可執行程式

本教程旨在幫助開發人員把web應用程式打包成一個可執行的桌面應用程式,並生成一個安裝包setup.exe,直接安裝到本地電腦,方便使用者使用。 1、背景 開發web專案時,大多數選擇主流的chrome等瀏覽器作為開發除錯工具,但終端使用者可能要求相容IE等不常用的瀏覽器,此

使用electron構建跨平臺Node.js桌面應用經驗分享

這樣的 目標 技術分享 兼容 targe 文檔 doc 控件 開發 by zhangxinxu from http://www.zhangxinxu.com/wordpress/?p=6154 本文可全文轉載,但需得到原作者書面許可,同時保留原作者和出處,摘要引流則隨意。

VS2017打包C#桌面應用

新建 sof visual http fonts setup 新建項目 log 安裝 原文地址:https://blog.csdn.net/houheshuai/article/details/78518097 在要打包項目的解決方案 右鍵→添加→ 新建項目 後出現

使用VScode編寫python程序打包.exe文件

技術 window 需求 welcom 兩張 系統環境 圖片 == alt   據說Visual Studio Code(VS Code)的諸多好處,了解了一下果然很喜歡,我喜歡它的原因主要有3個,一是VS Code開源且跨平臺,二是因為其界面非常酷,三是可以滿足我的大所屬

NW.js打包一個桌面應用

1.安裝nw(可以到官網:https://nwjs.io下載) npm install nw -g 2.建立一個最最簡單的nw應用 在nwjs資料夾中 新建資料夾app,app資料夾中至少有index.html和package.json(app裡面就是放你專案打包完成的檔案的) index.htm

安裝ionic cordova專案打包apk中遇到的問題(安裝的是https://github.com/SilvaEmerson/face_recognition_app)

安裝依賴npm install 解決:安裝了python2.7(版本python3+不行) 再次npm install 解決:以管理員身份在cmd執行 npm install -global -production windows-build-tools 參考:htt

CXF生成客戶端程式碼打包jar檔案

最近其他部門提供了WebService介面,本地開發使用的是Java,現在選擇使用根據WSDL文件打成Jar包的方式來處理,在此記錄一下命令 CXF工具請百度自行安裝 CXF生成客戶端程式碼並打包成jar檔案: wsdl2java -frontend jaxws21 -encoding ut

讓網頁裝進Android手機(將html+css+js打包Android應用)(簡單的)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

cas服務端自定義登陸頁面用maven-overlays打包 war包部署

碼雲:  https://gitee.com/NBwuhaotian/cas_server.git 碼雲有可能很慢因為專案500M 打完包270多m  百度雲有zip包: 連結:https://pan.baidu.com/s/1OWtKPd54sdRjITrTiw