Electron初体验

  |   0 评论   |   0 浏览

背景

Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。在制作的二进制安装包中,会嵌入了Chromium 和 Node.js 。

即使没有本地开发经验,只有JavaScript开发经验,也可以构建出一个跨平台的应用,可以在windows、macOS和Linux上使用。

初体验

环境准备

安装 node 和 npm

node -v
npm -v

windows下的安装包为

https://nodejs.org/dist/v16.13.0/node-v16.13.0-x64.msi

如果要打包的话,安装时需要选中安装必备工具。这些工具在开发的时候不需要,但是在打包的时候需要。此时会安装包管理器 Chocolatey,允许使用一行命令来安装软件。同时会安装很多别的包。

> node -v
v16.13.0
> npm -v
8.1.0

设置为淘宝镜像源

npm set registry https://registry.npmmirror.com

创建应用

mkdir -p my-electron-app
cd my-electron-app
npm init

生成一个示例 package.json如下:

{
  "name": "my-electron-app",
  "version": "1.0.0",
  "description": "Hello World!",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "flowaters",
  "license": "MIT"
}

安装electron

npm install --save-dev electron --registry=https://registry.npmmirror.com

结果

added 86 packages in 26s

修改入口

{
  "scripts": {
    "start": "electron ."
  }
}

运行

npm start

此时是会失败的,因为我们还没有编写APP。

编写代码

创建main.js

创建一个空白的main.js,再运行npm start会发现,已经不报错了,但是什么也没有。

创建index.html

内容如下:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <!-- https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP -->
    <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'">
    <meta http-equiv="X-Content-Security-Policy" content="default-src 'self'; script-src 'self'">
    <title>Hello World!</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    We are using Node.js <span id="node-version"></span>,
    Chromium <span id="chrome-version"></span>,
    and Electron <span id="electron-version"></span>.
  </body>
</html>

创建main.js

// 控制应用生命周期和创建原生浏览器窗口的模组
const { app, BrowserWindow } = require('electron')
const path = require('path')

function createWindow () {
  // 创建浏览器窗口
  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js')
    }
  })

  // 加载 index.html
  mainWindow.loadFile('index.html')

  // 打开开发工具
  // mainWindow.webContents.openDevTools()
}

// 这段程序将会在 Electron 结束初始化
// 和创建浏览器窗口的时候调用
// 部分 API 在 ready 事件触发后才能使用。
app.whenReady().then(() => {
  createWindow()

  app.on('activate', function () {
    // 通常在 macOS 上,当点击 dock 中的应用程序图标时,如果没有其他
    // 打开的窗口,那么程序会重新创建一个窗口。
    if (BrowserWindow.getAllWindows().length === 0) createWindow()
  })
})

// 除了 macOS 外,当所有窗口都被关闭的时候退出程序。 因此,通常对程序和它们在
// 任务栏上的图标来说,应当保持活跃状态,直到用户使用 Cmd + Q 退出。
app.on('window-all-closed', function () {
  if (process.platform !== 'darwin') app.quit()
})

// 在这个文件中,你可以包含应用程序剩余的所有部分的代码,
// 也可以拆分成几个文件,然后用 require 导入。

创建 preload.js

// 所有Node.js API都可以在预加载过程中使用。
// 它拥有与Chrome扩展一样的沙盒。
window.addEventListener('DOMContentLoaded', () => {
    const replaceText = (selector, text) => {
      const element = document.getElementById(selector)
      if (element) element.innerText = text
    }
  
    for (const dependency of ['chrome', 'node', 'electron']) {
      replaceText(`${dependency}-version`, process.versions[dependency])
    }
  })

试运行

npm run

打包应用

最快捷的打包方式是使用 Electron Forge。

环境准备

安装python3,这个在安装nodejs的时候,会自动附加上。

安装Electron Forge

npm install --save-dev @electron-forge/cli

结果

added 471 packages in 37s

3 packages are looking for funding
  run `npm fund` for details

通过import设置Forge的脚手架。

npx electron-forge import

结果

√ Checking your system
√ Initializing Git Repository
√ Writing modified package.json file
√ Installing dependencies
√ Writing modified package.json file
√ Fixing .gitignore


We have ATTEMPTED to convert your app to be in a format that electron-forge understands.

Thanks for using "electron-forge"!!!

打包

使用 Forge 的 make 命令来创建可分发的应用程序:

>npm run make

> [email protected] make
> electron-forge make

√ Checking your system
√ Resolving Forge Config
We need to package your application before we can make it
√ Preparing to Package Application for arch: x64
√ Preparing native dependencies
√ Packaging Application
Making for the following targets: squirrel
× Making for target: squirrel - On platform: win32 - For arch: x64

还是失败了。

问题

安装electron包时卡住

使用taobao镜像源

镜像源管理:

sudo npm install -g nrm --registry=https://registry.npmmirror.com

结果

npm ---------- https://registry.npmjs.org/
  yarn --------- https://registry.yarnpkg.com/
  tencent ------ https://mirrors.cloud.tencent.com/npm/
  cnpm --------- https://r.cnpmjs.org/
  taobao ------- https://registry.npmmirror.com/
  npmMirror ---- https://skimdb.npmjs.com/registry/

切换源

nrm use taobao

指定electron源

编辑文件 ~/.npmrc,增加如下行:

electron_mirror="https://npm.taobao.org/mirrors/electron/"

参考