利用Nativefier键入网站URL生成Windows应用程序

使用Nativefier可将指定的URL(网站)打包成一个Windows窗口应用程序。生成的应用程序相当于一个浏览器,只是打开便自动访问相应的URL,且无地址栏。
用Nativefier生成的可执行程序,其优点是启动速度快,缺点是它无托盘图标。可以生成安装包的形式,也可以生成绿色版软件(zip)。

系统环境

npm install nativefier -g

注:键入以上命令后,系统会根据自动根据本操作环境,加装Chocolatey、python等依赖程序,以及一些Windows更新包。整个过程可能需要十分钟以上。

步骤

①打开稍后即将生成的程序的文件夹(如C:\抖音)

②在该文件夹地址栏中键入CMD,并回车

③在命令提示符中,键入以下的命令(切换为阿里NPM源,以解决code: 'ECONNRESET'<网络连接被远程服务器强制中断>),并回车

setx ELECTRON_MIRROR "https://npmmirror.com/mirrors/electron/"

④在命令提示符中,键入类似以下的命令(开始生成)(任选其一),并回车

不指定图标:

nativefier --name "抖音" "https://www.douyin.com/"

或指定图标:

nativefier --name "抖音" --icon "C:\Users\administrator\Documents\favicon.ico" "https://www.douyin.com/"

或指定图标+指定最大化窗口:

nativefier --name "抖音" --icon "C:\Users\administrator\Documents\favicon.ico" --maximize "https://www.douyin.com"

增加托盘图标:

nativefier --name "抖音" --icon "C:\Users\administrator\Documents\favicon.ico" "https://www.douyin.com/" --tray

包含输出路径的:

nativefier --name "抖音" --icon "C:\Users\a\Documents\soft.ico" "https://www.douyin.com" --tray --out "C:\Users\a\Documents\抖音"

单独实例:

--single-instance

更改托盘中「退出」字样:

搜索「 label: 'Quit',」,大约在10610行,将quit更改为「退出」。

增加托盘菜单超链接:

点击右上角的关闭按钮「×」自动停止播放:

  1. 打开生成好的根目录中的:\resources\app\lib\main.js
  2. 搜索「mainWindow = await (0, mainWindow_1.createMainWindow)(appArgs, setDockBadge);」大约位于283行
  3. 在此行下增加以下代码:
	mainWindow.on('close', () => {
    mainWindow.webContents.executeJavaScript(`
        document.querySelectorAll('video').forEach(v => v.pause());
    `).catch(err => console.error(err));
	});

使用透明图标:

  • 使用icofx把图标文件另存为png文件,直接:–icon “C:\Users\administrator\Documents\favicon.png

多图层图标:

  • trial可生成包含多个分辨率图层的图标(正规用法)。

图标缓存问题:

  • 有时候看到的图标是缓存中的旧图标。更换路径可更新缓存。

注释:

  1. 「抖音」指要生成的程序的名称
  2. 「https://www.douyin.com/」指要打包的URL
  3. “C:\Users\administrator\Documents\favicon.ico”指要制定的ico图标,用于exe文件图标及打开后左上角显示的图标
  4. –maximize指最大化(提示:即便不指定最大化,那么用户手动最大化后关闭窗口,下次启动后仍为上次状态,即最大化状态

其他问题

点击关闭按钮后,会自动最小化到托盘。但重新打开时,会闪一下,并不会出现窗口。

修改方案

经测试,同时采用方案1及2即可实现。
方案1(强烈推荐)

electron_1.app.requestSingleInstanceLock() 之前,先定义 mainWindow = null,确保全局引用一直存在。你大部分地方其实已经做了,只是保险起见明确加上。

let mainWindow = null;
方案2(核心修改)

在你的 second-instance 事件里,给它做一个更稳妥的处理:

找到:

electron_1.app.on('second-instance', () => {

改成:

electron_1.app.on('second-instance', () => {
log.debug('app.second-instance');
if (!mainWindow) {
// 万一没有初始化好,则重新初始化
onReady().catch((err) => log.error('onReady ERROR', err));
return;
}
if (mainWindow.isMinimized()) {
mainWindow.restore();
}
if (!mainWindow.isVisible()) {
mainWindow.show();
}
mainWindow.focus();
});
方案3(如果想极致保险)

你甚至可以判断 mainWindow.isDestroyed(),因为 Electron 窗口有时候已经被销毁:

javascript复制编辑if (mainWindow.isDestroyed()) {
    onReady().catch((err) => log.error('onReady ERROR', err));
}

截图

安装Nativefier

打包https://www.douyin.com/

已经打包好了的抖音Windows程序

运行后的界面


Nativefier 应用的核心内核如下:

内核类型所用内核说明
排版/渲染引擎Blink来自 Chromium,负责页面布局与渲染
JavaScript 引擎V8同样来自 Chromium,用于执行网页中的 JS
壳程序框架Electron用来把网页包成桌面程序(Windows/macOS/Linux)
运行时Node.js + ChromiumElectron 内部就是 Node.js + Chromium 的组合

安装包

本工具仅可生成包含文件夹、主程序、相关文件的免安装绿色版软件。如需打包成安装包,需要再使用另外一款软件。