<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          從零開始的 electron 開發(fā)-項(xiàng)目搭建

          共 11625字,需瀏覽 24分鐘

           ·

          2021-03-05 13:23

          作者:陌路凡歌
          來源:SegmentFault 思否社區(qū)




          本文搭建基于vue cli提供的vue-cli-plugin-electron-builder進(jìn)行腳手架搭建。


          electron的優(yōu)點(diǎn)和缺點(diǎn)已經(jīng)有各種分析了,這里不再多述,如果你是一個(gè)前端開發(fā),想把現(xiàn)有頁面轉(zhuǎn)化成桌面軟件,并且能有win,mac,linux的版本,那么electron不失為一個(gè)好的選擇,當(dāng)然一個(gè)多端的框架優(yōu)缺點(diǎn)都是很明顯的,既然想快速開發(fā)那么就得舍棄點(diǎn)東西,比如體積大小,性能等等。




          開發(fā)前的準(zhǔn)備


          說到底electron本質(zhì)上就是一個(gè)基于Chromium的應(yīng)用,通俗點(diǎn)說,這個(gè)桌面軟件就是一個(gè)瀏覽器,我們寫的東西在瀏覽器中展示,是不是一下子就回到熟悉領(lǐng)域了,那么在開發(fā)前你得知道前端三駕馬車 HTML, CSS 和 JavaScript,涉及到一些文件等的處理的話那么會(huì)有些許node的知識(shí)。




          安裝


          `npm install -g @vue/cli
          vue create electron-vue
          # 自行選擇vue版本,由于electron使用的是Chromium,那么我們可以不必考慮兼容性的問題,我這里直接選擇vue3(看個(gè)人喜好)
          cd electron-vue
          vue add electron-builder
          # 選擇electron版本號(hào),這里我選擇的是`11.0.0`
          # 安裝完成之后會(huì)有`src/background.js`文件,`package.json`中會(huì)多出幾條electron的build及serve命令
          npm run electron:serve
          # 稍等一會(huì)兒(Vue Devtools首次安裝問題)會(huì)有一個(gè)桌面窗口出現(xiàn),ok安裝就完成啦,接下來我們對(duì)其進(jìn)行改造。`




          說明


          改造前說明一下:electron開發(fā)和我們普通的開發(fā)有所不同,它是有兩種進(jìn)程的:主進(jìn)程和渲染進(jìn)程


          • 主進(jìn)程src/background.js:管理所有渲染進(jìn)程(怎么配置桌面軟件,怎么打開桌面軟件,怎么相互通信等等)。
          • 渲染進(jìn)程:說得直白點(diǎn)就是網(wǎng)頁(就是打開我們單頁的網(wǎng)頁)

          npm run electron:serve做了什么,其實(shí)就是類似先運(yùn)行npm run serve啟動(dòng)一個(gè)網(wǎng)頁的端口并生成一個(gè)實(shí)時(shí)打包的js,然后通過electron的命令指定啟動(dòng)的js,用主進(jìn)程載入網(wǎng)頁的端口。

          通俗點(diǎn)來說,你可以理解為我們開發(fā)的桌面軟件是一個(gè)瀏覽器,主進(jìn)程就是設(shè)置這個(gè)瀏覽器的樣式(圖標(biāo),大小等等),渲染進(jìn)程就是瀏覽器打開的網(wǎng)頁。



          改造


          src目錄改造


          首先我們?cè)趕rc目錄下新建兩個(gè)文件夾src/main、src/renderer,這兩個(gè)分別放主進(jìn)程及渲染進(jìn)程的文件,然后把src/background.js放入src/main中,然后重命名為index.js,src下其他文件放入src/renderer中。

          現(xiàn)在的結(jié)構(gòu)如下:

          ├─src                          # 源碼目錄
          │  ├─main                      # 主進(jìn)程目錄
          │  │  └─index.js               # 主進(jìn)程入口
          │  └─renderer                  # 渲染進(jìn)程文件夾
          │      ├─assets
          │      ├─components
          │      ├─App.vue
          │      └─main.js                # 渲染進(jìn)程入口

          添加 vue.config.js


          由于我們修改了默認(rèn)的入口文件位置,我們應(yīng)該配置對(duì)應(yīng)的參數(shù),
          在根目錄新建vue.config.js,添加

          module.exports = {
            pluginOptions: {
              electronBuilder: {
                mainProcessFile: 'src/main/index.js', // 主進(jìn)程入口文件
                rendererProcessFile: 'src/renderer/main.js', // 渲染進(jìn)程入口文件
                mainProcessWatch: ['src/main'], // 檢測(cè)主進(jìn)程文件在更改時(shí)將重新編譯主進(jìn)程并重新啟動(dòng)
              }
            }
          }

          然后重新npm run electron:serve,看能否重新啟動(dòng)。

          補(bǔ)充:如果是只打包單頁electron的話這樣配置沒問題,但是這樣的話想對(duì)web頁面打包(npm run build)會(huì)有問題,因?yàn)槲覀儼讶肟谖募恢眯薷牧恕?/span>

          這里我們可以通過設(shè)置pages來修改其入口文件,并且這樣還可以打包多頁

          module.exports = {
             pages: {
              index: {
                entry: 'src/renderer/main.js',
                template: 'public/index.html',
                filename: 'index.html',
                title: 'vue-cli-electron',
                chunks: ['chunk-vendors''chunk-common''index']
              },
              // loader: 'src/loader/main.js' // 多頁loader頁
            },
            pluginOptions: {
              electronBuilder: {
                mainProcessFile: 'src/main/index.js', // 主進(jìn)程入口文件
                mainProcessWatch: ['src/main'], // 檢測(cè)主進(jìn)程文件在更改時(shí)將重新編譯主進(jìn)程并重新啟動(dòng)
              }
            }
          }

          注:如果添加了pages,請(qǐng)把electronBuilder里的rendererProcessFile刪除,兩個(gè)都是web頁面的入口,是互斥的。

          嘗試分別運(yùn)行web的serve、build及electron的serve、build,看是否能成功運(yùn)行(打包可能會(huì)因?yàn)榫W(wǎng)絡(luò)原因,下載electron包失敗,如果未添加.npmrc請(qǐng)參考結(jié)尾補(bǔ)充)。

          環(huán)境變量配置


          vue cli可以通過--mode xx來讀取.env.xx設(shè)置環(huán)境變量參考,在根目錄新建

          .env  # 本地開發(fā)
          .env.dev  # 打包dev
          .env.test  # 打包test
          .env.prod  # 打包prod

          .env:
          NODE_ENV=development
          VUE_APP_ENV=development
          VUE_APP_APPID=com.electron.electronVueDEV
          VUE_APP_PRODUCTNAME=electron開發(fā)
          VUE_APP_VERSION=0.0.1
          BASE_URL=/

          注:.env 的NODE_ENV設(shè)置development,其余打包的請(qǐng)?jiān)O(shè)置production
          NODE_ENV: webpack運(yùn)行的模式
          VUE_APP_ENV:我們自己使用的環(huán)境變量(通過這個(gè)判斷我們是什么環(huán)境),比如.env.test為VUE_APP_ENV=test,.env.prod為VUE_APP_ENV=production
          VUE_APP_APPID:electron的appId配置,com.electron.electronVueDEV,com.electron.electronVueTEST,com.electron.electronVue
          VUE_APP_PRODUCTNAME:electron的productName配置,electron開發(fā),electron測(cè)試,···
          VUE_APP_VERSION:electron的version配置

          修改package.json的scripts,刪除原來的打包命令,新增:

          web的打包:
          "build:dev""vue-cli-service build --mode dev",
          "build:test""vue-cli-service build --mode test",
          "build:prod""vue-cli-service build --mode prod",

          electron的打包:
          "build:dev:win32""vue-cli-service electron:build --mode dev --win --ia32",
          "build:dev:win64""vue-cli-service electron:build --mode dev --win --x64",
          "build:test:win32""vue-cli-service electron:build --mode test --win --ia32",
          "build:test:win64""vue-cli-service electron:build --mode test --win --x64",
          "build:prod:win32""vue-cli-service electron:build --mode prod --win --ia32",
          "build:prod:win64""vue-cli-service electron:build --mode prod --win --x64",
          "build:dev:mac""vue-cli-service electron:build --mode dev --mac",
          "build:test:mac""vue-cli-service electron:build --mode test --mac",
          "build:prod:mac""vue-cli-service electron:build --mode prod --mac",

          electron打包這里只配置了win32,win64,mac的打包,如果對(duì)其他模式的包有需求的請(qǐng)參考鏈接自行配置。

          環(huán)境變量檢測(cè)及打包配置


          添加config配置


          新增renderer/config/index.js,

          const env = process.env

          const config = {
            host: '',
            baseUrl: ''
          }

          Object.assign(config, env)

          // if (env.NODE_ENV === 'development') {
          //   config.VUE_APP_ENV = 'test'
          // }

          if (config.VUE_APP_ENV === 'development') {
            config.host = 'http://192.168.148.174:8080'
          else if (config.VUE_APP_ENV === 'test') {
            config.host = 'http://192.168.148.175:8080'
          else if (config.VUE_APP_ENV === 'production') {
            config.host = 'http://192.168.148.176:8080'
          }

          export default config

          本地開發(fā)切換環(huán)境,可以使用上面注釋的方法修改,也可以直接修改.env文件的VUE_APP_ENV。

          打包配置


          src/renderer/App.vue添加import cfg from '@/config',打印cfg

          vue.config.js添加

          const path = require('path')

          function resolve(dir) {
            return path.join(__dirname, dir)
          }

          module.exports = {
            chainWebpack: (config) => { // 由于我們修改了渲染進(jìn)程目錄,修改'@'alias
              config.resolve.alias.set('@', resolve('src/renderer'))
            },
            builderOptions: {
              appId: process.env.VUE_APP_APPID,
              productName: process.env.VUE_APP_PRODUCTNAME,
              extraMetadata: {
                name: process.env.VUE_APP_APPID.split('.').pop(),
                version: process.env.VUE_APP_VERSION
              },
              asar: true,
              directories: {
                output: "dist_electron",
                buildResources: "build",
                app: "dist_electron/bundled"
              },
              files: [
                {
                  filter: [
                    "**"
                  ]
                }
              ],
              extends: null,
              electronVersion: "11.3.0",
              extraResources: [],
              electronDownload: {
                mirror: "https://npm.taobao.org/mirrors/electron/"
              },
              dmg: {
                contents: [
                  {
                    type"link",
                    path: "/Applications",
                    x: 410,
                    y: 150
                  },
                  {
                    type"file",
                    x: 130,
                    y: 150
                  }
                ]
              },
              mac: {
                icon: "public/icons/icon.icns"
              },
              nsis: {
                oneClick: false,
                perMachine: true,
                allowToChangeInstallationDirectory: true,
                warningsAsErrors: false,
                allowElevation: false,
                createDesktopShortcut: true,
                createStartMenuShortcut: true
              },
              win: {
                target: "nsis",
                icon: "public/icons/icon.ico",
                requestedExecutionLevel: "highestAvailable"
              },
              linux: {
                "icon""public/icons"
              },
              publish: {
                provider: "generic",
                url: "http://127.0.0.1"
              }
            }
            ............
          }

          builderOptions是electron的打包配置,參考鏈接,之前打包的話由于網(wǎng)絡(luò)原因,下載electron包可能會(huì)下載失敗或特慢,這里配置electronDownload為淘寶源,本來electron的name及version是讀取package.json里面的值的,這里使用extraMetadata把這兩個(gè)值注入進(jìn)package.json,其他配置可自行修改。

          icons


          打包是需要icons的,windows呢需要.ico,mac需要icns,你可以使用icofx進(jìn)行生成(后續(xù)有時(shí)間的話會(huì)補(bǔ)充),這里呢我使用的是一個(gè)插件直接生成的

          yarn add -D electron-icon-builder
          package.json添加
          "icons""electron-icon-builder --input=./public/icons/icon.png --output=public --flatten",

          在public下新建icons文件夾,再把你的icon.png(512*512)放在里面,運(yùn)行npm run icons就會(huì)在icons里面生成對(duì)應(yīng)的圖片了。

          最后:運(yùn)行打包命令,分別打dev,test,prod包安裝,打開軟件查看打印的cfg是否正確。



          補(bǔ)充


          如果使用npm install或yarn install出現(xiàn)錯(cuò)誤時(shí),一般來說是網(wǎng)絡(luò)問題,先刪除node_modules,然后在根目錄新建.npmrc文件,添加electron_mirror=https://npm.taobao.org/mirrors/electron/,注意不要使用cnpm安裝,可能會(huì)出現(xiàn)各種問題。



          點(diǎn)擊左下角閱讀原文,到 SegmentFault 思否社區(qū) 和文章作者展開更多互動(dòng)和交流,掃描下方”二維碼“或在“公眾號(hào)后臺(tái)回復(fù)“ 入群 ”即可加入我們的技術(shù)交流群,收獲更多的技術(shù)文章~

          - END -


          瀏覽 47
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  丁香欧美 | 爱搞| 首屈一指视频在线观看 | 国产精品五月天婷婷视频 | 国模吧一二三区 |