node pkg 打包 的笔记

文章介绍了如何使用pkg@5.8.1和pkg@4.5.1版本打包Node应用,以及遇到的支持x86平台的问题。在更换应用图标和修改部分应用信息时,作者提到了resource_hacker的限制,并提供了使用resedit模块的解决方案。对于隐藏Windows中的终端窗口,文章探讨了几种方法,包括修改Subsystem和使用create-node-w-exe。此外,作者还尝试了pkgx进行打包,发现它能减小文件大小但无法修改图标,并对pkgx的可靠性提出疑问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

打包应用

我是用的版本是 pkg@5.8.1。打包部分没啥好记录的,网上分享的帖子都很详尽了。只记录些没怎么看到别人写的:

  1. 如果要支持 x86,要使用 pkg@4.5.1 。而pkg-fetch的二进制文件版本为 2.6
  2. 如果使用pkg@4.5.1 配合 pkg-fetch@2.6,会有些问题。
    1. node 最高支持到14.4,需要注意调用函数是否可用。比如 child_process 的 spawn 事件就是在后续版本才更新的
    2. 由于-C 压缩参数在后续版本才引入,这个版本打包(node14)的执行文件在75MB左右,比5.8.1的60M大许多。

更换图标和部分应用信息

之前通过resource_hacker可以很愉快的修改图标,但是这次,在我这行不通吗,修改完后直接运行报错。

pkg: Error reading from file

这似乎是一个很早就在讨论且一直没解决的问题,经过一番尝试后,我用的时一下方法。

  1. 生成图标
    可以在网站https://icoconvert.com/上生成需要的 icon。尺寸需要选中 16x16, 32x32, 48x48, 64x64 and 128x12 .
  2. 替换图标和部分应用信息
    1. 安装resedit
      npm install -D resedit@1.7
      
    2. 代码
'use strict';
// copy https://github.com/vercel/pkg/issues/91#issuecomment-1287038976

const fs = require("fs");
const path = require("path");
const ResEdit = require('resedit');

function windowsPostBuild(output) {
    const exe = ResEdit.NtExecutable.from(fs.readFileSync(output));
    const res = ResEdit.NtExecutableResource.from(exe);
    const iconFile = ResEdit.Data.IconFile.from(path.join(__dirname, 'icon.ico'));

    ResEdit.Resource.IconGroupEntry.replaceIconsForResource(
        res.entries,
        1,
        1033,
        iconFile.icons.map(item => item.data)
    );

    const vi = ResEdit.Resource.VersionInfo.fromEntries(res.entries)[0];

    vi.setStringValues(
        {lang: 1033, codepage: 1200},
        {
            ProductName: 'You app name',
            FileDescription: 'You app description',
            CompanyName: 'My company',
            LegalCopyright: `Copyright Me. MIT license.`
        }
    );
    vi.removeStringValue({lang: 1033, codepage: 1200}, 'OriginalFilename');
    vi.removeStringValue({lang: 1033, codepage: 1200}, 'InternalName');
    vi.setFileVersion(1, 0, 0, 1033);
    vi.setProductVersion(1, 0, 0, 1033);
    vi.outputToResourceEntries(res.entries);
    res.outputResource(exe);
    fs.writeFileSync(output, Buffer.from(exe.generate()));
}

参考

https://github.com/vercel/pkg/issues/91

隐藏终端窗口

在win中,正常打包后运行,会出现终端窗口。

解决思路大概分为几种:

  1. 引入vbs、powershell 作为启动脚本
    这个方法有些缺点,比如
    • 用户可能没有权限运行脚本
    • 运行脚本也会闪终端窗口
    • 多一个启动脚本
  2. 修改 exe 中的Subsystem,从 2改为3
    方法有:
    • 有通过python 或者 editbin 修改的
    • 有通过重新编译 pkg-fetch, ,在打包

我用的方法:create-nodew-exe,大概看了下源码,方法二的node实现

参考

Surprised by terminal window in macos & windows

补充

似乎直接使用pkg-exe-build也可以直接解决问题,不过没试过。

尝试 pkgx

后面尝试使用(node-pkgx)[https://github.com/irelance/node-pkgx]进行打包,简单记录下。

  1. 打包win的代码后的文件极小,75Mb=>16MB。这应该归功于pkgx项目中自己编译的 pkgx-win-x86.exe
  2. 和说明的一致,无虚拟文件系统,这意味着如果不能打包到代码里面的资产文件,只能复制到执行文件的同目录下。
  3. 修改程序icon失败,配置中的 -ri 不生效,resource_hacker同样无法修改。应该是pkgx-win-x86.exe本身就缺少icon。
  4. 前文中隐藏终端窗口(create-nodew-exe)依然可用。
  5. pkgx 并没有开源 pkgx-win-x86.exe 的代码,不确定是否可靠。

原文地址

https://bjun.tech/blog/xphp/225

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值