【原創】從零開始搭建Electron+Vue+Webpack項目框架,一套代碼,同時構建客戶端、web端(一)

導航:html

(一)Electron跑起來
(二)從零搭建Vue全家桶+webpack項目框架
(三)Electron+Vue+Webpack,聯合調試整個項目)(未完待續)
(四)Electron配置潤色(未完待續)
(五)預加載及自動更新(未完待續)
(六)構建、發佈整個項目(包括client和web)(未完待續)前端

摘要:隨着前端技術的飛速發展,愈來愈多的技術領域開始被前端工程師踏足。從NodeJs問世至今,各類前端工具腳手架、服務端框架層出不窮,「全棧工程師」對於前端開發者來講,不再只是說說而已。在NodeJs及其衍生技術高速發展的同時,Nw和Electron的問世,更是爲前端發展提速很多,依稀記得哪位前輩說過,「能用Js改寫的,終將用Js改寫」,這不,客戶端來了!使用Electron也有一段時間了,各類簡單複雜的問題,也都或多或少的碰見過,下決心整理出一套客戶端模板出來,一是加深一下本身的理解,二是供小夥伴們參考指正。本文選擇Electron6.x+Webpack4+vue全家桶爲技術棧,一套代碼能夠分別打包在客戶端和web端,結合webpack,支持熱更新,打包爲exe安裝包,過程當中會涉及vue全家桶、electron的常見問題、配置和優化,webpack的對應配置等。從零開始,把electron、vue、webpack通通歸入本身的知識體系!項目完整代碼:https://github.com/luohao8023/electron-vue-templatevue

說明:本着模擬從零開始的過程,最開始的架構或者代碼設計可能不是最優解,有可能只適用於當前狀況,後續會一步步完善,也可能會部分重構,關鍵是體會這個從零到一,再到完善的過程。node

下面開始~~~webpack

1、新建工程git

  一、說好的從零開始,就重新建文件夾開始吧,新建electron-vue-template文件夾。github

  二、cmd進入文件夾,執行npm init,初始化一個node項目。web

  三、完善工程目錄結構:npm

    

  項目根目錄的結構大體就是上面這個樣子,後續完善過程當中,會在對應目錄下增長相應的子目錄,後面會有講到。下面介紹一下各個目錄的做用:json

    app:webpack編譯後的整個項目的代碼,包括主進程和渲染進程,使用electron-builder打包exe安裝包時,會把這部分代碼打進去;

    builder:webpack打包腳本,包括打包主進程、渲染進程,打包各個環境的exe安裝包,啓動各個環境的devServer等;

    config:配置文件,包括環境配置、版本等;

    dist:構建出的靜態文件,exe,zip等;

    src:源碼目錄;

      main:主進程源碼;

      renderer:渲染進程源碼;

  四、執行npm i electron -D,下載electron,若是7.0.0版本安裝不成功的話,可嘗試cnpm i electron@6.1.2 -D安裝6.1.2版本,我是嘗試了好屢次都沒法下載7.0.0版本,因此這裏使用的是6.1.2。

2、窗口配置,啓動一個最簡單的electron應用

  一、進入src下的main文件夾,新建index.html和main.js文件;

  二、index.html文件,除了常規的結構以外,隨便寫點簡單的內容便可,本文只在body標籤內寫入一下代碼:

<h1>Welcome to electron-vue-template!</h1>

   三、Electron文檔中說,您應當在 main.js 中建立窗口,並處理程序中可能遇到的全部系統事件。不過,隨着咱們的應用逐漸複雜,可能不止存在一個窗口,在main.js寫入過多邏輯或者配置的話,會使咱們的項目愈來愈難維護,因此正確的作法是,對應的窗口有本身專門的Js文件,負責這個窗口的配置和事件監聽,而main.js文件只須要負責窗口的調度和系統級別的事件監聽。固然,咱們今天的目的是啓動一個最簡單的electron應用,因此直接寫在了main.js文件裏:

const url = require('url');
const path = require('path');
const { app, BrowserWindow } = require('electron');
function createWindow() {
    let win = new BrowserWindow({
        width: 800,
        height: 600
    });
    // 獲取index.html的file協議路徑
    const indexPath = url.pathToFileURL(path.join(__dirname, 'index.html')).href;
    // 若是路徑或者參數中含有中文,須要對路徑進行編碼處理
    win.loadURL(encodeURI(indexPath));
    // 打開開發者工具
    win.webContents.openDevTools();
    // 監聽窗口的關閉事件,釋放窗口對象
    win.on('closed', () => {
        win = null;
    });
}

// 建立窗口
app.on('ready', createWindow);
// 當所有窗口關閉時退出。
app.on('window-all-closed', () => {
    // 在 macOS 上,除非用戶用 Cmd + Q 肯定地退出,
    // 不然絕大部分應用及其菜單欄會保持激活。
    if (process.platform !== 'darwin') app.quit();
});
app.on('activate', () => {
    // 在macOS上,當單擊dock圖標而且沒有其餘窗口打開時,
    // 一般在應用程序中從新建立一個窗口。
    if (!win) createWindow();
});

   Electron apps 使用JavaScript開發,其工做原理和方法與Node.js 開發相同。Electron模塊包含了Electron提供的全部API和功能,引入方法和普通Node.js模塊同樣:Electron模塊所提供的功能都是經過命名空間暴露出來的。 好比說:Electron.app負責管理Electron 應用程序的生命週期,Electron.BrowserWindow類負責建立窗口。

  四、啓動應用

  廢了這麼多話,應用到底該怎麼啓動?那還不簡單,在package.json的script標籤裏新增一個start命令,命令內容爲node ./src/main/main.js,而後運行npm start,程序不就執行了嘛!因而立刻添加了start命令,啓動的時候命令行就報錯了。WTF??什麼鬼!看了報錯信息,定位到了是在app.on('ready')這一行,這也能報錯??

  試着打印了一下app,undefined!!因而又加了兩行代碼:  

const electron = require('electron');
console.log(electron)

  打印了一下electron,居然是個這玩意兒:E:\lh\demo\electron-vue-template\node_modules\_electron@6.1.2@electron\dist\electron.exe,不該該是個對象嗎?

  又翻了翻文檔,恍然大悟,Electron並不屬於node應用,經過node來執行入口文件固然是不行的,要用electron來執行,正確的命令爲:electron ./src/main/main.js,再次運行npm start,看着命令行輸出的內容以及剛剛啓動的窗口,舒服的長出了一口氣。

  

第一篇的內容就寫到這裏了,不多系統的去總結,總感受有些內容寫不出來,暫且作個引子吧,若是但願後續的文章對某部分詳細講解的話,歡迎留言,同時,若是有不恰當的地方,也歡迎批評指正!

相關文章
相關標籤/搜索