本文使用 powershell 脚本举例。
场景
作为一名 JSer,对于其他语言应该抱有敬畏的态度,但对于 JS 也应该有着虔诚的信仰。
我们坚信,JS 可以做到一切。
而,Windows 居然不能主动关闭显示器(不算厂商定制),真的是令人无语。难道 macOS 的触发角不香吗?弄个电源管理还时不时出现 bug,让人烦不胜烦。
对于我这种一天 24 小时开机,随时可能远程使用的人来说,没有关闭屏幕的功能(含 bug),简直无法容忍。
既然你无法稳定地提供自动熄屏的功能,那我就自己撸一套脚本运行不就好了?
但是想想 Node.js 的可执行方式对于普通 Windows 来说,实在是不好弄,那么就想办法把 Node.js 脚本转成熟悉的 exe 可执行文件就行。
首选方案,Pkg。
Pkg
Pkg 是一个轻松将 Node.js 脚本打包成 exe 可执行文件的 npm 包,注意是 Node.js,不是普通的 JS。
功能相当简单,如果只考虑使用命令行直出的方案,通过 pkg --help 如下的说明就足够用了。
pkg [options] <input> Options: -h, --help output usage information -v, --version output pkg version -t, --targets comma-separated list of targets (see examples) -c, --config or any json file with top-level config --options bake v8 options into executable to run with them on -o, --output output file name or template for several files --out-path path to save output one or more executables -d, --debug show more information during packaging process [off] -b, --build don't download prebuilt base binaries, build them --public speed up and disclose the sources of top-level project --public-packages force specified packages to be considered public --no-bytecode skip bytecode generation and include source files as plain js -C, --compress [default=None] compression algorithm = Brotli or GZip Examples: – Makes executables for Linux, macOS and Windows $ pkg index.js – Takes from cwd and follows 'bin' entry $ pkg . – Makes executable for particular target machine $ pkg -t node14-win-arm64 index.js – Makes executables for target machines of your choice $ pkg -t node12-linux,node14-linux,node14-win index.js – Bakes '--expose-gc' and '--max-heap-size=34' into executable $ pkg --options "expose-gc,max-heap-size=34" index.js – Consider packageA and packageB to be public $ pkg --public-packages "packageA,packageB" index.js – Consider all packages to be public $ pkg --public-packages "*" index.js – Bakes '--expose-gc' into executable $ pkg --options expose-gc index.js – reduce size of the data packed inside the executable with GZip $ pkg --compress GZip index.js
如果希望做更深度的控制,可以考虑使用 来配置,大体如下:
{ "pkg": { "scripts": "build/**/*.js", "assets": "views/**/*", "targets": [ "node14-linux-arm64" ], "outputPath": "dist" } }
入口脚本,资源文件,目标平台,输出目录,还是很简单的。
PowerShell配置
首先,Node.js 的 API,没有直接关闭电脑显示器功能的,所以我们要意识到,使用 Windows 自带的 PowerShell 来处理。
这段 PowerShell 脚本就是关闭显示器的,可以自己试试。
(Add-Type '[DllImport("u;)]public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,2)
如果你的命令行报错了,有两种可能性,第一种是含有 NASM 的,说找不到这东西,那么你需要前往 NASM 官网下载安装重新打开 PowerShell 即可。
官网:NASM
另一种错误大致上就是你的电脑没有开放直接使用野鸡脚本的权限,按照如下流程操作并重新打开 PowerShell 就行:
- “开始”右键,选择“Windows PowerShell(管理员)”
- 输入 `Set-ExecutionPolicy RemoteSigned`
- 输入 `Y` 或 `A`,建议 `Y`
自此,PowerShell 端的准备就好了。
Pkg安装
首先,你得有 Node.js,安装地址前往国内加速版网站即可:Node.js 中文网
下载后,一路安装到底。
使用管理员的 PowerShell:
npm i -g pkg
我们新建 index.js 并写入如下代码:
require('child_process').spawn(';, [`(Add-Type '[DllImport("u;)]public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,2)`])
没错,就是通过子进程调用 PowerShell 执行上面说的命令,就这点事情。
如果你的显示器成功黑屏了,那么准备工作就全部搞定了,下面就是打包时刻。
打包
pkg [options] <input> Options: -h, --help output usage information -v, --version output pkg version -t, --targets comma-separated list of targets (see examples) -c, --config or any json file with top-level config --options bake v8 options into executable to run with them on -o, --output output file name or template for several files --out-path path to save output one or more executables -d, --debug show more information during packaging process [off] -b, --build don't download prebuilt base binaries, build them --public speed up and disclose the sources of top-level project --public-packages force specified packages to be considered public --no-bytecode skip bytecode generation and include source files as plain js -C, --compress [default=None] compression algorithm = Brotli or GZip Examples: – Makes executables for Linux, macOS and Windows $ pkg index.js – Takes from cwd and follows 'bin' entry $ pkg . – Makes executable for particular target machine $ pkg -t node14-win-arm64 index.js – Makes executables for target machines of your choice $ pkg -t node12-linux,node14-linux,node14-win index.js – Bakes '--expose-gc' and '--max-heap-size=34' into executable $ pkg --options "expose-gc,max-heap-size=34" index.js – Consider packageA and packageB to be public $ pkg --public-packages "packageA,packageB" index.js – Consider all packages to be public $ pkg --public-packages "*" index.js – Bakes '--expose-gc' into executable $ pkg --options expose-gc index.js – reduce size of the data packed inside the executable with GZip $ pkg --compress GZip index.js
命令说明:
pkg,使用 pkg 工具。
-t win,-t 为 target 的意思,打包目标是 win 平台。至于这里的平台,请根据 pkg --help 的打印情况来使用。
index.js,自然就是入口文件。
第一次运行需要下载相关的库文件,等待即可。
命令结束不会有多余的提示,只要不报错并回到可输入状态,就说明打包完成了。
如果你没有指定 dist 输出目录,那么默认打出来的就是同名 exe 文件。比如这里是 index.js 那么打包的 exe 就是 index.exe。如果是 a 自然就是 a。
使用
使用很简单……双击即可。
至于快捷方式什么的,就按照正常的 exe 文件处理即可。右键 -> 发送到(或直接“创建快捷方式”) -> 桌面快捷方式。
总结
Pkg 打包算是非常简单与快速的了,要说缺点的话,倒是有,就是打包的 exe 文件里面有 Node.js 的运行时,导致包体积 30M 以上,就比较难受。
其他类似方案有很多,有兴趣的话可以自己研究:nexe,node-packer,enclose等。