electron 运行 dist 文件

本文,我们来讲讲如何通过 electron 运行打包文件。

我们的 Demo 环境:

  • angular 打包的 dist 文件
  • MacBook Air (M1, 2020)
  • Visual Studio Code

获取 dist 文件

我们来简单生成 dist 文件,根据 Ant Design of Angular 的介绍新建项目并打包即可。

PS:当然了,你也可以简单其一个 index.html 文件做演示

得到的打包项目结构如下:

很平常的一个单页应用。我们将其放在新建 electron 项目根目录下,以备后用。

新建 electron 项目

我们根据 创建您的第一个 electron 应用程序 就可以很轻松的创建 electron 应用。

我们创建项目使用到关键包 "electron": "^26.1.0""electron-packager": "^17.1.2"。针对真实的生成环境,我们做了相关的一些调整:

1. 区分 window 和 mac 打包

我们的开发平台在 mac 上,通过执行 npm run make 可以默认是打包了 mac 平台的安装包。

针对 window 的平台,我们引入了 electron-package 来执行,比如我们编写打包命令行:

bash 复制代码
"make-win": "npx electron-packager ./ custom-package-name --platform=win32 --arch=x64 --out=jimmy-dist --overwrite --icon=./static/logo.ico --ignore='out|README.md|Jenkinsfile'"

下面我们来解析下:

  • npx electron-packager 运行本地安装的可执行文件 electron-packager
  • ./ 代表当前的目录,是要被打包的 electron 应用程序所在的位置
  • custom-package-name 自定义的最终打包的名称
  • --platform=win32 指定目标平台是 Window 32-bit
  • --arch=x64 指定目标架构是 x64(64-bit)
  • --out=jimmy-dist 指定输出的目录是 dist 文件夹
  • --overwrite 如果存在相同名称的目录,则覆盖之前的打包文件
  • --icon=./static/logo.ico 设定应用程序的图标文件路径
  • ignore='out|README.md|Jenkinsfile'" 忽略的打包文件

2. 更改图标

上面我们也提及了更改 window 的图表 --icon=./static/logo.ico,那么,我们可以通过设置 forge.config.js 来更改当前 mac 的图标:

javascript 复制代码
packagerConfig: {
  asar: true,
  icon: path.resolve(__dirname, 'static/logo.ico') // build app icon
}

3. 自定义菜单栏

我们需要定制自己需要的菜单栏,那么,我们可以通过在程序中设置 menu 即可,下面的设置菜单代码可以做参考:

javascript 复制代码
// create a custom menu
const createCustomMenu = () => {
  const template = [
    {
      label: '', // for project title tag placeholder
    },
    {
      label: '菜单',
      submenu: [
        {
          label: '刷新',
          click: () => {
            BrowserWindow.getFocusedWindow().reload();
          }
        },
        {
          label: '返回',
          click: () => {
            if (mainWindow && mainWindow.webContents.canGoBack()) {
              mainWindow.webContents.goBack();
            }
          }
        },
        {
          label: '关闭',
          click: () => {
            app.quit();
          }
        }
      ]
    },
    {
      label: '调试',
      submenu: [
        {
          label: '控制台',
          click: () => {
            BrowserWindow.getFocusedWindow().webContents.openDevTools();
          }
        }
      ]
    }
  ];
  
  const menu = Menu.buildFromTemplate(template);
  Menu.setApplicationMenu(menu);
}

上面我们设置了 菜单调试 的菜单。

electron 中整合打包的 dist 文件

我们运行 dist 文件,其实就是起一个本地服务就行了。这里,我们使用 http-server 来运行。

PS:当然,我们也可以使用 koaexpress

假设我们已经安装好了 http-server 依赖,那么,我们进入项目根目录,直接执行 http-server -p 8082 dist/ 就可以在浏览器 http://localhost:8082 打开该 dist 应用。

那么,我们怎么在 electron 中运行它呢?如下:

javascript 复制代码
// 开启服务
const triggerServer = (host, port, directory) => {
  const server = createServer({
    root: path.join(__dirname, directory) // 指定服务器根目录
  });

  server.listen(port, host, () => {
    console.log(`Server running at http://${host}:${port}/`)
  })
  return server;
}

上面我们封装了个开发服务的方法,方便多个服务开启。我们只要传入 hostportdirectory (打包文件的目录)即可。

electron 应用 ready 之后,我们开启服务:

javascript 复制代码
const { createServer } = require('http-server');

app.whenReady().then(() => {
  const server1 = triggerServer("localhost", "8081", "dist");
  
  mainWindow = new BrowserWindow({
    webPreferences: {
      nodeIntegration: true,
      webSecurity: false
    },
    width: 800,
    height: 600,
    title: 'ElectronDist',
    icon: path.join(__dirname, './static/logo.png') // for window platform
  });

  if(process.platform === 'darwin') { // mac platform
    app.dock.setIcon(path.join(__dirname, './static/logo.png'))
  }
  
  mainWindow.loadURL("http://localhost:8081")
  
  app.on('before-quit', () => { // 记得关闭
    server1.close();
  });
})

before-quite 钩子函数,即退出之前,即可关闭服务。

我们 npm run start 运行之后,项目的效果如下图:

参考

相关推荐
m0_74825502几秒前
前端常用算法集合
前端·算法
真的很上进14 分钟前
如何借助 Babel+TS+ESLint 构建现代 JS 工程环境?
java·前端·javascript·css·react.js·vue·html
web1309332039820 分钟前
vue elementUI form组件动态添加el-form-item并且动态添加rules必填项校验方法
前端·vue.js·elementui
NiNg_1_23441 分钟前
Echarts连接数据库,实时绘制图表详解
前端·数据库·echarts
如若1231 小时前
对文件内的文件名生成目录,方便查阅
java·前端·python
追逐时光者1 小时前
免费、简单、直观的数据库设计工具和 SQL 生成器
后端·mysql
初晴~2 小时前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱581362 小时前
InnoDB 的页分裂和页合并
数据库·后端
滚雪球~2 小时前
npm error code ETIMEDOUT
前端·npm·node.js