使用electron进行原生应用的打包

因为信奉一句话:JavaScript 终将一统天下,所以要想方设法开疆扩土.

今天介绍的这个electron就是一大神器,可以很方便的将网页应用打包为Mac, Win, Linux下的可执行文件,只需进行简单的配置,虽比不上原生的速度和瘦小,但是性价比着实不错.

一 在package.json中指明对应版本,(electron和electron-builder需放在devDependencies中),使用yarn添加模块

{
  "name": "electron_example",
  "private": true,
  "scripts": {
  },
  "devDependencies": {
    "electron": "~2.0.2",
    "electron-builder": "~20.7.1"
  }
}

二 添加配置文件,这是最重要的一步,这是我的推荐配置.(名字只能为electron-builder.yml)

appId: app.electron.example # 应用ID
artifactName: "${productName}-${version}.${ext}" # 应用最终的名称
productName: ‘Electron Example App‘ # 打包完成后的应用名称
npmRebuild: false # 是否在开始编译前重构原生依赖,可先尝试true, 如果出现问题再修改为false,

files:
  - index.js # 打包文件入口,后文将给出

directories:
  output: electron_packed/ # 输出路径
extraResources:
  - from: "../dist/" #包含的待打包文件
    to: ""
mac: # 打包成mac环境参数
  target:
    - dmg # 打包为dmg格式(可选pkg,zip等)
  icon: build/icon.icns # 图标所在路径
 
dmg: # 安装界面
  contents:
    - x: 410
      y: 170
      type: link
      path: /Applications
    - x: 130
      y: 170
      type: file

win: # 打包为win环境
  icon: build/icon.ico # 图标所在路径
  target:
    - nsis # 打包为nsis格式
  verifyUpdateCodeSignature: false # 是否需要验证签名
  # requestedExecutionLevel: requireAdministrator # 执行等级(是否需要管理员权限,通常情况不需要)
nsis:
  oneClick: false # 是否一键安装(静默安装)
  createDesktopShortcut: always # 创建桌面快捷方式
  createStartMenuShortcut: true # 创建开始菜单快捷方式
  # include: build/installer.nsh # 是否有额外的自定义安装需求,
  runAfterFinish: true # 安装完成后是否勾选立即执行
  

三 编写入口文件 index.js

const electron = require(‘electron‘)const app = electron.appconst BrowserWindow = electron.BrowserWindow
const ipcMain = electron.ipcMain //EventEmitter class 事件触发类
const url = require(‘url‘)
const path = require(‘path‘)

let mainWindow = null // 创建全局对象,不然当js对象被垃圾回收的时候窗口会自动关闭
// 创建浏览窗口,定义高宽
function createWindow () {
  mainWindow = new BrowserWindow({
    width: 1000,
    height: 650,
  })

  // 加载本地文件
  mainWindow.loadURL(url.format({
    pathname: path.join(process.resourcesPath, ‘index.html‘),
    protocol: ‘file:‘,
    slashes: true
  }))
 // 调试阶段也可加载调试地址
  // mainWindow.loadURL(‘http://localhost:8000/#/‘)

  // 打开调试工具
  // mainWindow.webContents.openDevTools()

  // 窗口关闭时触发
  mainWindow.on(‘closed‘, function () {
    mainWindow = null
  })
}

// 实现单例,防止程序多开
const iShouldQuit = app.makeSingleInstance((commandLine, workingDirectory) => {
  // 如果为已有窗口,调用focus,如果最小化,还会恢复窗口
  if (mainWindow) {
    if (mainWindow.isMinimized()) mainWindow.restore();
    mainWindow.focus();
  }
});// 多开退出程序
if (iShouldQuit) {
  return app.quit();
}    

// 加载完成之后调用事件
app.on(‘ready‘, createWindow)

// 只对windows有效,当所有窗口关闭后退出(OS X会强制一个窗口显示)
app.on(‘window-all-closed‘, function () {
  if (process.platform !== ‘darwin‘) {
    app.quit()
  }
})

app.on(‘activate‘, function () {
  // 针对在OS X上的dock icon 点击时创建窗口
  if (mainWindow === null) {
    createWindow()
  }
})
// 开始响应渲染
ipcMain.on(‘response-render‘, (event, arg) => {
  event.sender.sender()
})

以上配置可以基本满足需求.

注意事项:

1 打包过程应该独立,所以不应该对项目造成污染,强烈建议创建一个新的文件夹(比如本文的electron_pack文件夹),放打包配置文件相关信息,包括打包好的文件,尽量避免对项目结构造成破坏

2 打包命令可写入package.json的脚本(script)中,注意, --project electron_pack是指定待打包文件夹,--win --ia32表示windows下32位,默认不配参数的话会按照当前平台的参数进行配置.并且需要再指定的打包文件夹中添加package.json(整个项目的package.json只需添加electron和electron_example的模块依赖),打包所需的配置写在这里.

electron_pack文件目录

.
├── build
│   ├── icon.icns
│   ├── icon.ico
│   └── icons.png
├── electron-builder.yml
├── index.js
└── package.json

项目的package.json

"build:mac": "rm -rf electron_pack/electron_packed && cross-env electron-builder --project electron_pack",
"build:win": "rm -rf electron_pack/electron_packed && cross-env electron-builder --win --ia32 --project electron_pack"

编译执行命令:

yarn build:mac
yarn build:win

打包所需的package.json (json格式不允许注释,此处只是便于解释和理解)

{
  "name": "electron_example", # 项目名(注意与打包名的区别)
  "version": "1.0.0", # 打包版本
  "description": "This is the first version to pack app", # 项目描述
  "main": "index.js", # 主入口(打包入口文件地址)
  "devDependencies": { # 必须在此处指定的依赖
    "electron": "~2.0.2",
    "electron-builder": "~20.7.1"
  },
  "author": "Lorry",
  "license": "ISC"
}

3 指定图片(icon)都需要放在build文件夹中(尝试自定义路径,失败,如果有知道的朋友可以留言,十分感谢).

4 版本的区别真的很大,如果根据相同姿势进行操作还是出了问题,请注意版本,我的版本为electron: ~2.0.2 electron-builder:~20.7.1

5 请一定使用yarn方式进行安装,可以避免一些很微妙的错误.

更多详细功能及自定义请参见electron英文文档 中文文档

原文地址:https://www.cnblogs.com/BigJ/p/electron.html

时间: 2024-10-13 11:22:48

使用electron进行原生应用的打包的相关文章

使用electron进行原生应用的打包(2)---主进程与渲染进程之间的通信

上一篇讲了使用electron进行打包的配置相关文件,这篇主要讲electron中很重要的通信方式. 首先解释一个概念: electron打包的应用包含两个部分 electron的环境(node),也就是主进程. web渲染环境,副进程. 这两个环境之间是相互隔离的,无法直接进行数据通信,所以有了这篇文章. 三个角色: ipcRender ipcMain webContents ipcRenderer用于渲染进程 ipcRenderer.on(channel, listener) --> cha

Electron – 基础学习(2): 项目打包成exe桌面应用

项目创建完成,启动正常,接下来就是项目打包了.将测试Demo打包成exe桌面应用,点击exe文件,运行项目. 书接上文,创建项目有三种方式 Git拷贝.直接创建.通过electron社群提供的命令行工具(CLI)  electron-forge 创建项目,看起来对应的项目打包方式也应该有三种才对,但其实细看第一种方式和第三种项目创建方式是一样的,所以它们的项目打包方式也是一样的. 打包 electron 项目webpack工具有 electron-packager 和 electron-buil

Electron – 项目报错整理(打包~2): electron-packager踩坑

原文地址:https://www.cnblogs.com/donghuang/p/12271556.html

electron builder 打包多个第三方依赖的软件

背景 在实际的开发过程中,我们最后打包生成的exe.会依赖一些第三方的软件,或者说是一些系统的环境,比如 .net framework vc++ 等,这些环境不能依赖客户的环境,所以最好的做法是在打包的时候,一起打包. electron如何做到打包多个依赖 electron里面最常用的打包方式就是electron-builder了,其中electron-builder可以对nsis进行整合配置,具体可以参照官网 https://www.electron.build/configuration/n

使用electron-builder打包时下载electron失败解决方案

electron-builder 在打包时会检测cache中是否有electron 包,如果没有的话会从github上拉去,在国内网络环境中拉取的过程大概率会失败,所以你可以自己去下载一个包放到cache目录里 各个平台的目录地址 Linux: $XDG_CACHE_HOME or ~/.cache/electron/ MacOS: ~/Library/Caches/electron/ Windows: %LOCALAPPDATA%/electron/Cache or ~/AppData/Loc

用全栈神器electron 打全平台桌面级 app--Music Player

什么是Electron? Electron 技术方案进行桌面端的开发,跨平台兼容 macOS.Windows.Linux 等操作系统.可以让你写使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序. 快速入门 Electron 可以让你使用纯 JavaScript 调用丰富的原生 APIs 来创造桌面应用.你可以把它看作一个专注于桌面应用的 Node.js 的变体,而不是 Web 服务器. 这不意味着 Electron 是绑定了 GUI 库的 JavaScript.相反,E

helloworld of vue + electron 开发过程日志

helloworld 开发过程日志 helloworld of vue + electron 1. 相关技术栈 2. 安装开发环境 2.1. 安装Node.js 2.2. 使用NPM(节点包管理器)镜像 2.3. 安装vue-cli 3. hello world 3.1. 创建项目 3.2. 运行VUE项目 3.3. 安装electron 3.4. 通过electron运行VUE项目 3.5. 使用electron-builder 打包发布 4. 完善配置 5. 总结 1. 相关技术栈 Chro

JSer全栈化技术栈推荐(一)——原生移动端是天堂还是泥潭

随着以服务器端的NodeJS.桌面端的Electron和原生移动端React Native为代表的全栈JS迅猛发展,真正生产环境中的"JS/前端技术全栈化"已经逐渐变为可能.尽管在前端以外的领域里,JavaScript还不能取代各领域原本主流语言的地位,但对于大量初创型公司或技术人手不足的团队来说,更低的学习成本本身就是一种极大的优势. 对于技术学习而言,学得好和学得巧同样重要,选对技术栈进行学习,可能会节省大量的时间和精力,更有可能带来更多的机会.因此结合最新的NingJS会议上的趋

如何在Android Gradle中添加原生so文件依赖

@author ASCE1885的 Github 简书 微博 CSDN 原文链接 背景 几个月前,基于Google的LevelDB,我为Android平台写了一个名为SnappyDB的键值数据库(NoSQL). 由于它使用到了原生C++代码,因此最终生成的文件除了Jars包还有so文件. 通过Maven仓库发布我们的函数库没有什么问题(只要你通过繁琐的发布流程),maven-android-plugin可以帮助我们包含共享库.Maven依赖规则使得我们可以指定想要获取的ABI(不同的CPU架构)