React創(chuàng)建Electron桌面應(yīng)用

創(chuàng)建一個(gè)簡(jiǎn)單的Electron桌面應(yīng)用

在GitHub上有個(gè)

electron-quick-start

的倉(cāng)庫(kù)覆醇,需要本地計(jì)算機(jī)安裝好Git(比如SourceTree)和Node.js语盈,使用步驟如下:

# 克隆倉(cāng)庫(kù)

git clone https://github.com/electron/electron-quick-start

# 使用命令行進(jìn)入倉(cāng)庫(kù)所在文件夾

cd electron-quick-start

# 安裝依賴(lài)

npm install

# 運(yùn)行應(yīng)用

npm start

image

Electron詳細(xì)文檔可以參看官方文檔

創(chuàng)建一個(gè)React項(xiàng)目(內(nèi)容引用《深入淺出React和Redux》诊霹,侵刪)

React技術(shù)依賴(lài)于一個(gè)很龐大的技術(shù)棧祷杈,比如智袭,轉(zhuǎn)譯JavaScript代碼需要用到Babel献烦,模塊打包工具又要用到Webpack曙求,定制build過(guò)程需要grunt或者gulp……這些技術(shù)棧都需要各自的配置文件牌借,還沒(méi)有開(kāi)始寫(xiě)一行React相關(guān)代碼度气,開(kāi)發(fā)人員就已經(jīng)被各種技術(shù)名詞淹沒(méi)。

針對(duì)這種情況膨报,React的創(chuàng)建者Facebook提供了一個(gè)快速開(kāi)發(fā)React應(yīng)用的工具磷籍,名叫create-react-app,這個(gè)工具的目的是將開(kāi)發(fā)人員從配置工作中解脫出來(lái)现柠,無(wú)需過(guò)早關(guān)注這些技術(shù)棧細(xì)節(jié)院领,通過(guò)創(chuàng)建一個(gè)已經(jīng)完成基本配置的應(yīng)用,讓開(kāi)發(fā)者快速開(kāi)始React應(yīng)用的開(kāi)發(fā)够吩,并且提供了熱調(diào)試環(huán)境比然。

create-react-app是一個(gè)通過(guò)npm發(fā)布的安裝包,在確認(rèn)Node.js和npm安裝好之后周循,命令行中執(zhí)行下面的命令安裝create-react-app:
npm install --global create-react-app

安裝過(guò)程結(jié)束之后强法,你的電腦中就會(huì)有create-react-app這樣一個(gè)可以執(zhí)行的命令,這個(gè)命令會(huì)在當(dāng)前目錄下創(chuàng)建指定參數(shù)名的應(yīng)用目錄湾笛。
我們?cè)诿钚兄袌?zhí)行下面的命令:
create-react-app test_app
這個(gè)命令會(huì)在當(dāng)前目錄下創(chuàng)建一個(gè)名為test_app的目錄饮怯,在這個(gè)目錄中會(huì)自動(dòng)添加一個(gè)應(yīng)用的框架,隨后我們只需要在這個(gè)框架的基礎(chǔ)上修改文件就可以開(kāi)發(fā)React應(yīng)用迄本,避免了大量的手工配置工作:
在create-react-app命令一大段文字輸出之后硕淑,根據(jù)提示,輸入下面的命令:
cd test_app
npm start
這個(gè)命令會(huì)啟動(dòng)一個(gè)開(kāi)發(fā)模式的服務(wù)器,同時(shí)也會(huì)讓你的瀏覽器自動(dòng)打開(kāi)了一個(gè)網(wǎng)頁(yè)置媳,指向本機(jī)地址http://localhost:3000/ 于樟,顯示界面如下圖所示。

image

整合Electron和React

Create React App創(chuàng)建的項(xiàng)目是一個(gè)純前端項(xiàng)目拇囊,整合React項(xiàng)目和Electron并且保留熱調(diào)試和本地包引用需要一下幾個(gè)簡(jiǎn)單的操作:

1.需要安裝electron以及增加啟動(dòng)命令

使用命令npm install -save electron安裝electron

在腳本里添加啟動(dòng)命令"electron-start": "electron ."

image

2. 需要在React項(xiàng)目的根目錄(不是src目錄)創(chuàng)建Electron的啟動(dòng)文件main.js(main.js文件可以直接拷貝electron-quick-start倉(cāng)庫(kù)里的main.js)

const electron = require('electron')
// Module to control application life.
const app = electron.app
// Module to create native browser window.
const BrowserWindow = electron.BrowserWindow

const path = require('path')
const url = require('url')

// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let mainWindow

function createWindow () {
    // Create the browser window.
    mainWindow = new BrowserWindow({width: 800, height: 600})

    // and load the index.html of the app.
    // mainWindow.loadURL(url.format({
    //     pathname: path.join(__dirname, 'index.html'),
    //     protocol: 'file:',
    //     slashes: true
    // }))
    mainWindow.loadURL(url.format({
        pathname: path.join(__dirname, './build/index.html'),
        protocol: 'file:',
        slashes: true }));

    // Open the DevTools.
    // mainWindow.webContents.openDevTools()

    // Emitted when the window is closed.
    mainWindow.on('closed', function () {
        // Dereference the window object, usually you would store windows
        // in an array if your app supports multi windows, this is the time
        // when you should delete the corresponding element.
        mainWindow = null
    })
}

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', createWindow)

// Quit when all windows are closed.
app.on('window-all-closed', function () {
    // On OS X it is common for applications and their menu bar
    // to stay active until the user quits explicitly with Cmd + Q
    if (process.platform !== 'darwin') {
        app.quit()
    }
})

app.on('activate', function () {
    // On OS X it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (mainWindow === null) {
        createWindow()
    }
})

// In this file you can include the rest of your app's specific main process
// code. You can also put them in separate files and require them here.
image

3. 在React項(xiàng)目中的package.json文件中增加main字段迂曲,值為"main.js"

image

4.修改main.js中的win.loadURL,改為

mainWindow.loadURL(url.format({
pathname: path.join(__dirname, './build/index.html'), protocol: 'file:', slashes: true }))

image

到目前為止寥袭,在根目錄下運(yùn)行npm run build + npm run electron-start 就可以啟動(dòng)React創(chuàng)建的桌面應(yīng)用了路捧。

image

運(yùn)行結(jié)果如下:

image

發(fā)現(xiàn)是一個(gè)內(nèi)容為空的界面,我們還需要做如下修改:

在文件package.json中添加字段 "homepage":"."

原因:默認(rèn)情況下传黄,homepage是http://localhost:3000杰扫,build后,所有資源文件路徑都是/static膘掰,而Electron調(diào)用的入口是file:協(xié)議章姓,/static就會(huì)定位到根目錄去,所以找不到靜態(tài)文件识埋。在package.json文件中添加homepage字段并設(shè)置為"."后凡伊,靜態(tài)文件的路徑就變成了相對(duì)路徑,就能正確地找到了窒舟。

image

在根目錄下運(yùn)行npm run build + npm run electron-start系忙,運(yùn)行結(jié)果如下:

image

這樣就結(jié)束了嗎?大家再仔細(xì)回顧下惠豺,我們修改完配置之后運(yùn)行了兩條命令npm run build和npm run electron-start银还,每次都要npm run build后才能看到修改結(jié)果,而前面的內(nèi)容提到過(guò)create-react-app提供了熱調(diào)試環(huán)境耕腾,我們?cè)趺丛贓lectron中使用熱調(diào)試呢见剩?簡(jiǎn)單來(lái)說(shuō)就是代碼的修改能及時(shí)反饋到UI上,不需要做任何額外的操作呢扫俺?

簡(jiǎn)單苍苞。在main.js文件中將啟動(dòng)頁(yè)修改為

http://localhost:3000/

win.loadURL('http://localhost:3000/')

開(kāi)發(fā)時(shí),需要啟動(dòng)兩個(gè)終端狼纬,一個(gè)終端啟動(dòng)npm start羹呵, 另一個(gè)終端啟動(dòng)npm run electron-start,這樣在electron中就可以熱調(diào)試了疗琉。

不過(guò)編譯發(fā)布時(shí)需要改回從build/index.html冈欢,這樣很麻煩,可以在package.json中定義個(gè)DEV字段盈简,設(shè)置為true/false凑耻,然后修改main.js太示,代碼如下:

const pkg = require('./package.json') // 引用package.json 
//判斷是否是開(kāi)發(fā)模式 
if(pkg.DEV) { 
  win.loadURL("http://localhost:3000/")
} else { 
  win.loadURL(url.format({
    pathname:path.join(__dirname, './build/index.html'), 
    protocol:'file:', 
    slashes:true 
  }))
}

以后運(yùn)行npm run electron-start 之前,根據(jù)需要修改DEV為true/false就行了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末香浩,一起剝皮案震驚了整個(gè)濱河市类缤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邻吭,老刑警劉巖餐弱,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異囱晴,居然都是意外死亡膏蚓,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)畸写,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)驮瞧,“玉大人,你說(shuō)我怎么就攤上這事枯芬【缍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵破停,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我尉剩,道長(zhǎng)真慢,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任理茎,我火速辦了婚禮黑界,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘皂林。我一直安慰自己朗鸠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布础倍。 她就那樣靜靜地躺著烛占,像睡著了一般。 火紅的嫁衣襯著肌膚如雪沟启。 梳的紋絲不亂的頭發(fā)上忆家,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音德迹,去河邊找鬼芽卿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胳搞,可吹牛的內(nèi)容都是我干的卸例。 我是一名探鬼主播称杨,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼筷转!你這毒婦竟也來(lái)了姑原?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤旦装,失蹤者是張志新(化名)和其女友劉穎页衙,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體阴绢,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡店乐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呻袭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眨八。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖左电,靈堂內(nèi)的尸體忽然破棺而出廉侧,到底是詐尸還是另有隱情,我是刑警寧澤篓足,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布段誊,位于F島的核電站,受9級(jí)特大地震影響栈拖,放射性物質(zhì)發(fā)生泄漏连舍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一涩哟、第九天 我趴在偏房一處隱蔽的房頂上張望索赏。 院中可真熱鬧,春花似錦贴彼、人聲如沸潜腻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)融涣。三九已至,卻和暖如春青灼,著一層夾襖步出監(jiān)牢的瞬間暴心,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工杂拨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留专普,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓弹沽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子懊悯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容