用Electron将web项目封装成exe程序
查资料的时候看到了关于web项目打包的关键词,于是乎我又忍不住职业病去搜索了一些东西……目前看来,Electron、nw.js(原node-webkit)、Hex这几个能给网页打包成exe桌面应用程序,nwjs和Electron基本差不多,Electron是推荐最多的,Hex看起来很古老了,居然是有道发起的,挺厉害。思考了下,还是选择了Electron,这个我也是从来没体验过,正好趁此机会来试试!走起!
以前也搜过如何把html/css/js打包成单个exe,当时技术有限也没能做到,主要是为了把自己做的资料库打包然后分享给小伙伴……因为直接能点击打开,多方便!搜了一圈大多数用C++什么的,苦于自己不会编程就放弃了……现在既然看到了,就来试试吧!
Electron是什么?
Electron是一个使用JavaScript、HTML和CSS构建桌面应用程序的框架。嵌入Chromium和Node.js到环境中,可以创建Windows、macOS和Linux的exe应用程序。
准备工作
- Node.js 最新版
- 完整的web项目
- 做好的ICO图标文件
Nodejs设置啥的早弄过就不写了,直接走下一步~
安装
安装Electron
npm install electron --save-dev |
安装打包工具
npm install electron-packager -g |
下载官方范例
可以下载官方的案例来练习:
// 克隆示例项目的仓库 |
修改下 main.js
和 package.json
里面的设置
在项目 index.html
的 <body></body>
之间添加
<script src="./renderer.js"></script> |
输入npm start看看效果,确保能运行
命令行
electron-packager <sourcedir> <appname> --platform=<platform> --arch=<arch> [optional flags...] |
参数:
命令 | 说明 |
---|---|
sourcedir | 应用程序源的基本目录 |
appname | 应用程序的名称 |
version | 打印Electron Packager和Node的版本,以及目标平台和arch,用于错误报告,并立即退出 |
所有平台
命令 | 说明 |
---|---|
all | 等效于–platform=all –arch=all |
app-copyright | 应用程序版权发行 |
app-version | 应用设置的应用版本发布版本 |
arch | 架构选择,可选值: ia32, x64, armv7l, arm64, mips64el, universal(通用,可用逗号分隔) Windows(用于x86、x86_64和arm64体系结构)win32 macOS/Mac App Store(用于x86_64,arm64和通用架构)darwinmas Linux(适用于x86、x86_64、armv7l、arm64和mips64el架构) |
asar | 将应用程序中的源代码打包到程序中。pass——asar使用默认配置,配置属性–asar.unpackDir=sub_dir 支持的属性包括: - ordering: 用于文件打包的排序文件的路径 - unpack: 将文件解包到应用程序 - unpackDir: 将目录解包到应用程序 |
build-version | 应用程序生成版本 |
download | 传递给@electron/get的子选项列表。它们通过点符号指定, 例:–download.cacheRoot=/tmp/cache 支持属性: - cacheRoot: 缓存的Electron下载目录 - mirrorOptions: 下载备选URL选项 - rejectUnauthorized: 下载时是否要求SSL证书有效,默认为true, 使用–no-download 拒绝检查 |
electron-version | 正在打包的电子版本 |
electron-zip-dir | 包含Electron ZIP文件的目录的本地路径 |
executable-name | 可执行文件的名称,无文件扩展名。默认为appname |
extra-resource | 要复制到应用程序资源目录的文件 |
icon | 应用程序图标文件的本地路径 |
ignore | 不要打包某个文件夹。如:–ignore=node_modules 可设置–no-prune |
no-deref-symlinks | 确保应用程序源中没有取消对符号链接的引用 |
no-junk | 不要忽略打包应用程序中的系统垃圾文件 |
no-prune | 不要删除打包应用程序中的devDependencies |
out | 应用程序输出目录,默认为当前目录 |
overwrite | 如果平台的输出目录已经存在,则替换它,而不是跳过它 |
platform | 要构建哪个平台的应用(Windows/Mac/Linux)可选值: darwin, linux, mas, win32 (如果有多个,则以逗号分隔) |
prebuilt-asar | 预构建asar文件的路径(asar, ignore, no-prune, 或no-deref-symlinks) |
quiet | 不要打印信息或警告消息 |
tmpdir | 临时目录。默认为系统临时目录,使用–no tmpdir禁用使用临时目录。 |
仅限win/mas平台
命令 | 说明 |
---|---|
app-bundle-id | 要在应用程序plist中使用的绑定标识符 |
app-category-type | 应用程序类别类型 例如 app-category-type=public.app-category.developer-tools 将应用程序类别设置为“开发者工具”。 |
darwin-dark-mode-support | 在打包的应用程序中强制支持Mojave/10.14暗模式 |
extend-info | a plist file to merge into the app plist |
helper-bundle-id | 要合并到应用程序plist的plist文件 |
osx-sign | (仅限macOS平台)是否签署macOS应用程序包。 可使用–osx-sign自行签名以使用默认配置, 或使用其他配置 例:–osx-sign.identity=”My Name” 支持的属性包括: - identity: 应包含运行“codesign”时要使用的标识` - entitlements: 签名时使用的授权路径 - entitlements-inherit: “子女”权利的路径 |
osx-notarize | (仅限macOS平台,需要–osx签名)是否对macOS应用进行公证包装。 例:–osx-notarize.appleId=”foo@example.com“ 支持属性包括: - appleId: 包含你的apple ID用户名/电子邮件 - appleIdPassword: 包含提供的apple ID的密码 - appleApiKey: 包含应用商店连接API密钥 - appleApiIssuer: 包含API密钥的颁发者 |
protocol | URL协议方案,将应用程序注册如下: 例: --protocol=myapp 将注册要打开的应用程序URLs: myapp://path 此参数需要 --protocol-name |
protocol-name | 通过–protocol指定的URL协议方案的描述性名称` |
usage-description | 关于应用程序如何使用某些macOS功能的可读描述。 支持列表: - Camera - Microphone |
仅限win32目标平台
命令 | 说明 |
---|---|
win32metadata | 用于设置嵌入到中的应用程序元数据 例:–win32metadata.CompanyName=”Company Inc.” 或 –win32metadata.ProductName=”Product” 支持属性: - CompanyName (默认值: package.json中的名字) - FileDescription (默认值: appname) - OriginalFilename (默认值: renamed exe) - ProductName (默认值: appname) - InternalName (默认值: appname) - requested-execution-level (user, asInvoker, or requireAdministrator) - application-manifest |
范例:
electron-packager mysite --platform=win32 --arch=x64 --out outsite --icon=icon.ico --app-version=0.0.1 --overwrite --ignore=node_modules |
这里遇到个坑:
出现错误提示:connect ECONNREFUSED 127.0.0.1:443
百度了下,要设置个环境变量:
变量名:ELECTRON_MIRROR: |
或者重置registry缓存,有可能也是端口被占用,关闭正在占用的程序,或者重启电脑。
最终打包
ico图标最大尺寸是256x256,可以用Greenfish Icon Editor来绘制图标,也可以百度搜索在线转换ico的网站,直接用制作好的图片转换即可。
刚才通过electron-packager输出打包后,会在目录看到已经生成.exe文件,但是还有很多文件,我们需要再次打包整合成单个exe,这时候可以用到Inno Setup或Enigma Virtual Box来进行最终打包。
我使用的是Enigma Virtual Box,直接封包完毕。原项目大小103MB,最后封装大小440MB……呃……感觉体积也太大了吧!没办法,electron打包出来就这么大……
这图啥呢…就是为了方便大家下载后双击就能点开看!!以前我看一个资料本直接点开就能看,好酷的!占用还很小,大概估计是用C++写的吧…还不如直接打包网页版让用户点html看好了,反正每个人都有浏览器哈哈哈!纯是为了折磨自己而已啊!占这么大的空间没必要啊!愤怒删了!!哼!
后记
electron最后封包会遇到错误提示,感觉npm源也不稳定啊,下次可以考虑用nw.js试试。然后我搜到有一个新项目tauri说是可以创建体积更小的桌面程序,替代electron的产物,这看来很有前景啊,如果发展不错未来或许真的可以替代electron,那就太好了!不过语言是Rust,还是有点门槛的,以后再说吧~
然后又恰巧搜到了一个项目:Nativefier——快速将网站打包成桌面程序 这个看起来不错的样子,不过感觉是将在线网站封包了下,断网了就不能访问了,这个算是另一种快捷方式……
网站打包exe之路任重道远啊,等以后大佬写个工具革新!现阶段还是洗洗睡吧~
如果遇到评论加载不出来,请不要担心,稍等一会儿,等待服务器后台修复即可,或者过一段时间来看看~