node.js生成可执行文件

将node创建的服务打包成可执行的exe文件

故事背景

为什么我要将node.js创建的服务打包成exe文件呢?主要是我对接的后端经常性的、偷摸的修改接口和接口返回的数据解构。并且他还很拽,总觉得前端就是切图仔。对此我怀恨在心已久,所以我准备使用node.js自己连接数据库,并使用pkg打包成一个后端同名的服务。在下一次组内冒烟的时候教训一下这个家伙,但是在使用pkg打包node.js应用程序的时候遇到了一些问题,这篇文章将使用过程中的坑记录下来,方便有缘人。

写在最前面

本文所有命令都是在git自带的终端bash中执行的。

生成项目解构

bash 复制代码
mkdir test-pkg
cd test-pkg
yarn init -y
touch server.js
yarn add pkg

使用node.js创建接口服务器

javascript 复制代码
// server.js
const http = require('http');

const server = http.createServer((req, res) => {
    if (req.url === '/api') {
        res.setHeader('Content-Type', 'application/json');
        res.end(JSON.stringify({
            data: true
        }));
    } else {
        res.statusCode = 404;
        res.end();
    }
});

server.listen(3000, () => {
    console.log('Server is running on port 3000');
});

修改package.json中的内容

json 复制代码
{
  "name": "test-pkg",
  "version": "1.0.0",
  "main": "server.js",
  "license": "MIT",
  "scripts": {
    "start": "node server.js",
    "build": "pkg server.js --target win --output Faker.exe"
  },
  "dependencies": {
    "pkg": "5.8.1"
  }
}

其中,server.js就是打包入口,Faker.exe就是打包生成的可执行文件的名称。

尝试打包

bash 复制代码
yarn build

处理报错

果不其然报错了:

plainText 复制代码
$ yarn build
yarn run v1.22.19
$ pkg server.js --target win --output VxFaker.exe
> pkg@5.8.1
> Fetching base Node.js binaries to PKG_CACHE_PATH
  fetched-v16.16.0-win-x64            [                    ] 0%> Not found in remote cache:
  {"tag":"v3.4","name":"node-v16.16.0-win-x64"}
> Building base binary from source:
  built-v16.16.0-win-x64
> Fetching Node.js source archive from nodejs.org...

了解错误

  1. Fetching base Node.js binaries to PKG_CACHE_PATH 这句中有两处需要注意,一个是 Node.js binaries,另外一个是 PKG_CACHE_PATH
  2. fetched-v16.16.0-win-x64 [ ] 0%> Not found in remote cache: 这句中, fetched-v16.16.0-win-x64好像是要下载的一个文件, remote cache好像是下载的目的地。
  3. {"tag":"v3.4","name":"node-v16.16.0-win-x64"} 这句中的 "tag":"v3.4" "name":"node-v16.16.0-win-x64"好像是资源的信息。

分析错误

  1. Node.js binaries实际上是使用pkg打包的时候依赖的node.js的二进制文件,就是字面意思。由于公司开发机没有连接外网,所以这个依赖下载失败了,需要手动去github上下载;
  2. PKG_CACHE_PATH这个则是node缓存的地址,使用echo $PKG_CACHE_PATH查看此地址,如果返回为空,则使用bash命令手动设置一下,现在先假设其为A;
  3. fetched-v16.16.0-win-x64这个是依赖的名称,从github上手动下载依赖之后,需要将资源的名称修改成fetched-v16.16.0-win-x64;
  4. remote cache我们现在要手动下载了,不需要remote cache了。实际上,如果PKG_CACHE_PATH中能够找到fetched-v16.16.0-win-x64这个文件,就不需要再去remote cache下载了;
  5. "tag":"v3.4"这个实际上是告诉你fetched-v16.16.0-win-x64不是放在A 下面的,而是A的子目录,即A/v3.4中;
  6. "name":"node-v16.16.0-win-x64"这个实际上是在告诉你,要去github上找这个文件。然后改名为fetched-v16.16.0-win-x64

【解决疑问】为什么是v16.16.0,实际上,这个版本号对应的正是适用当前使用的node版本的二进制文件的版本号,在终端使用node -v即可查看当前node的版本号:

plainText 复制代码
$ node -v
v16.20.1

逐个击破

  1. github上的下载地址为:https://github/vercel/pkg-fetch
  2. 如果echo $PKG_CACHE_PATH的结果不为空,则找到此目录(A),在A下面创建名为v3.4 的子目录;如果为空,则先使用执行~/.pkg-cache,得到结果为:/c/Users/zhangsan/.pkg-cache;然后手动设置PKG_CACHE_PATH的值,export PKG_CACHE_PATH="C:\\Users\\zhangsan\\.pkg-cache",然后在C:\\Users\\zhangsan\\.pkg-cache下面创建子目录v3.4
  3. 通过{"tag":"v3.4","name":"node-v16.16.0-win-x64"}中的v3.4和node-v16.16.0-win-x64两个线索,在https://github/vercel/pkg-fetch找到对应的资源并下载下来,保存到A/v3.4目录中,然后改名为fetched-v16.16.0-win-x64

再次尝试

bash 复制代码
yarn build

结果会在当前项目的根目录下生成VxFaker.exe可执行文件,大功告成!

后续

期待这个夸张的后端看到自己的服务在冒烟机上正常,在自己机子上无法返回数据的表现吧,那么他是苟起来当作无事发生,还是一脸茫然呢?评论区留言,让大家都笑一笑他吧~

相关推荐
羊小猪~~12 分钟前
前端入门一之DOM、获取元素、DOM核心、事件高级、操作元素、事件基础、节点操作
前端·javascript·css·vscode·html·浏览器·edge浏览器
界面开发小八哥31 分钟前
DevExpress JS & ASP.NET Core v24.1亮点 - 支持DateOnly/TimeOnly类型
javascript·asp.net·界面控件·devexpress·ui开发·用户界面
getaxiosluo38 分钟前
vue3使用element-plus,树组件el-tree增加引导线
前端·javascript·vue.js·elementui·css3·element-plus
YUJIANYUE1 小时前
6KBhtm+js实现提交名单随机抽取功能适用活动或课堂随机点名
前端·javascript·css
笑虾1 小时前
nvm 切换 Node.js 版本
node.js
小码哥呀1 小时前
RabbitMQ队列详细属性(重要)
javascript·rabbitmq·ruby
寅时码1 小时前
【奇淫技巧】让你的路由跳转拥有TS类型提示,告别人工记路由path
前端·javascript·react.js
Bug从此不上门1 小时前
Nuxt3之使用lighthouse性能测试及性能优化实操
前端·javascript·性能优化·vue·fetch·nuxt3
拼图2092 小时前
Vue.js开发基础——数据绑定/响应式数据绑定
前端·javascript·vue.js
刘志辉2 小时前
vue反向代理配置及宝塔配置
前端·javascript·vue.js