这一小节的  坑比较多,代码我会上传到 Github打包应用 - 图1

修改打包脚本

修改 package.json , 通过后置钩子,复制小图标。没有小图标打包后的应用会打不开,很难以发现这个问题,具体如何调试,后面再说。

  1. "compile": "NODE_ENV=production electron-webpack",
  2. "postcompile": "cp ./src/main/tray_w24h24.png ./dist/main",

添加打包配置

修改 package.json ,添加一下配置,它来自于 electron-build打包应用 - 图2 其实基本上没有多少需要配置的,只需要配置个打包的图标即可。 music.icns 是使用 svg 文件(为了保证高精度)转换来的,使用的是 image2icon 。

  1. "name": "reader",
  2. "version": "0.0.1",
  3. "build": {
  4. "appId": "me.yugo",
  5. "mac": {
  6. "category": "me.yugo",
  7. "icon": "./music.icns"
  8. }
  9. },

npm run dist 最终生成在 dist 的 yml 配置文件会像这样

  1. directories:
  2. output: dist
  3. buildResources: build
  4. extraMetadata:
  5. main: main.js
  6. files:
  7. - from: .
  8. filter:
  9. - package.json
  10. - from: dist/main
  11. - from: dist/renderer
  12. - from: dist/renderer-dll
  13. extraResources:
  14. - from: static
  15. to: static
  16. appId: me.yugo
  17. mac:
  18. category: me.yugo
  19. icon: ./music.icns
  20. extends: electron-webpack/electron-builder.yml
  21. electronVersion: 2.0.4

将 dock 的图标隐藏

ready 里面调用

  1. app.dock.hide()

判断生产环境

在 createMainWindow 中,这里我  换了一种范式。

  1. import { format as formatUrl } from 'url'
  2. if (process.env.NODE_ENV != 'production') {
  3. win.webContents.openDevTools()
  4. win.loadURL(`http://localhost:${process.env.ELECTRON_WEBPACK_WDS_PORT}`)
  5. } else {
  6. win.loadURL(
  7. formatUrl({
  8. pathname: join(__dirname, 'index.html'),
  9. protocol: 'file',
  10. slashes: true
  11. })
  12. )
  13. }

修复 Music.svelte 图标

图标显示会有异常我们修复一下。

  1. function getStaticPath() {
  2. const isDevelopment = process.env.NODE_ENV === 'development'
  3. const staticPath = isDevelopment
  4. ? ''
  5. : 'file://' + __dirname.replace(/app\.asar$/, 'static')
  6. return staticPath
  7. }

添加到 data 里面去。

  1. data() {
  2. return {
  3. files: [],
  4. title: '',
  5. staticPath: getStaticPath() + '/'
  6. };
  7. },

拼接 url

  1. <div class="flex">
  2. <button on:click="file()"><img src="{staticPath + "plus-circle.png"}" width="25" height="25" alt="add"></button>
  3. <button on:click="play()"><img src="{staticPath + "play-circle.png"}" width="25" height="25" alt="play"></button>
  4. <button on:click="pause()"><img src="{staticPath + "time-out.png"}" width="25" height="25" alt="stop"></button>
  5. <button on:click="prev()"><img src="{staticPath + "left-circle.png"}" width="25" height="25" alt="prev"></button>
  6. <button on:click="next()"><img src="{staticPath + "right-circle.png"}" width="25" height="25" alt="next"></button>
  7. </div>

关于路径

最终打包好的路径会像下图所示,并非如 compile 之后的 dist 目录所示,这是额外要注意的。

打包应用 - 图3

打包应用 - 图4

打包调试

如何解压 asar 文件

  1. npm install -g asar
  2. asar e app.asar app

如何调试

进入到解压后的 app

  1. npx electron ./main.js

这样当有错误的时候,会在终端报出。

开始打包

  1. npm run dist:dir

关于更新的说明

 对于打包,其实我有录制过非常详细的课程在我的个人网站可以寻到,之所以不讲的很细是因为  大多数人更希望知道如何快速吃到螃蟹,而不是烹饪螃蟹 🦀 。

更新在 mac os 需要苹果开发者认证证书签名,所以你需要付费,在 windows 下面可以不用签名。更新会用到一个 latest-xxx.yml 的文件,它在 dist 目录下,更新会拉取这个文件判断版本并进行更新,更新相关 API,Electron 内置。更新通常需要一个更新服务器,部署在云端。

发布到 Github

点击 release 按钮,上传即可。

打包应用 - 图5