您现在的位置是:网站首页> NodeJS

pkg Nodejs Web应用打包成exe可执行文件并打开浏览器

  • NodeJS
  • 2022-07-19
  • 1496人已阅读
摘要

将Node.js打包为可执行文件的工具有pkg、nexe、node-packer、enclose等,从打包速度、使用便捷程度、功能完整性来说,pkg是最优秀的。

pkg Nodejs Web应用打包成exe可执行文件并打开浏览器

引言

我们都知道nodejs的项目本身是没办法编译成二进制可执行文件的,这给我们很多的业务场景造成了一些问题,比如要给客户演示程序的时候,可能还得安装node环境,然后在安装一堆的依赖包,这还必须是网络环境较好的情况下,而有时候,一般企业如果安全看的特别重,限制在局域网内访问互联网,那么连包都没办法安装,显然对于你和对于客户都是不友好的情景。


还有一种情况:如果我们演示项目时,把代码交给对方部署,我们自己也不放心啊:Nodejs代码是明文JS代码,代码泄露怎么办?当然,防代码泄露可以用JShaman平台对JS代码进行混淆加密。


pkg可以直接将nodejs项目打包成可执行文件,直接可以在没有node环境下的freebsd,linux,alpine,macos,win上运行。


pkg打包的原理

pkg实际上并不是直接将程序转换成可执行文件,而是将node环境一起打包到了程序中,这样就可以做到不用在没有node环境下的电脑上运行node项目了,是不是很方便。下面我就将带领大家一起来看下如何使用pkg打包。测试用例使用的是nodejs的express


使用场景

在没有来源的情况下制作商业版的应用程序

在没有来源的情况下制作应用的演示/评估/试用版

立即为其他平台制作可执行文件(交叉编译)

制作某种自解压存档或安装程序

无需安装Node.js和npm来运行打包的应用程序

无需下载无数个文件npm install来部署您的应用程序。将其部署为单个文件

将您的资产放在可执行文件中,使其更具可移植性

针对新的Node.js版本测试您的应用程序而不安装它



首先安装pkg

npm install -g pkg

然后在项目目录下执行

pkg entrance.js

即可打包linux,macos,win3个平台的可执行文件。entrance.js为你node项目的入口文件。

如果只想打包windows下的exe,则加上-t参数。win即为打包成windows平台下的exe文件,具体可选参数参见项目目录

pkg -t win entrance.js

稍等片刻后项目目录下就会生成打包好的entrance.exe文件。


pkg会自动从入口文件开始查找依赖的文件并全数打包进去,无须修改项目里的任何代码。


其他

pkg可以根据package.json下的配置进行打包,默认入口文件为bin指向的文件。


执行

pkg .

或是

pkg package.json

即可自动按照package.json的配置打包。

//package.json

{


 //其他配置项


 "bin": "service.js",//入口文件


 "pkg": {


 "scripts": [


  "build/**/*.js"//需要打包进来的其他js文件,可添加多个


 ],


 "assets": [


  "dist/**/*"//静态文件的目录,可添加多个


 ]


 }


}


注意:静态文件需要在项目中将文件的引用换成


path.join(__dirname, 'dist')

的形式,才可以正常打包,否则可能会读取不到。

示例

使用vue-cli建立项目,并使用npm run build将你的项目编译生成静态文件到dist目录下。这些都是vue-cli自带的内容,不再赘述。

在项目目录下新建一个service.js文件,并添加以下代码,在本地起一个express静态服务器,使你能够在本地访问你的网站(部署到线上也是类似)

1.png




//service.js


const express = require('express');


const app = express();


const path = require('path');  


app.use(express.static(path.join(__dirname, 'dist')));//注意这里使用path.join(__dirname, 'dist')而不是'dist',虽然在命令行中执行起来效果是一样的,不过pkg打包会无法识别到dist目录

  


var server = app.listen(8081, function () {


 var host = server.address().address


 var port = server.address().port


 console.log(`AIbuy agents server start successfully on http://${host}:${port}`)


})


此时你可以在控制台执行

node service.js

来启动你的服务器了,启动完成后,浏览器访问http://localhost:8081/即可查看你的网站。

接下来我们使用将service.js和dist目录打包成一个exe文件,方便他人使用


首先安装pkg


npm install -g pkg


然后修改package.json,添加bin(如果不是service.js的话)和pkg项

{


 //其他配置项


 "bin": "service.js",//指定入口文件


 "pkg": {


 "assets": [


  "dist/**/*"//指定要打包的静态文件目录


 ]


 }


}


然后在项目目录下执行

pkg -t win package.json

完成后即生成一个exe文件,双击启动即相当于执行node service.js,然后你浏览器里(http://localhost:8081/)就能访问打包好的项目了!也不需要提前安装node,给老板演示很方便有木有!

上面是我整理给大家的,希望今后会对大家有帮助。


$ pkg -t win server.js

> [email protected]

> Fetching base Node.js binaries to PKG_CACHE_PATH

  fetched-v16.14.2-win-x64            [                    ] 0%> Not found in remote cache:

  {"tag":"v3.3","name":"node-v16.14.2-win-x64"}

> Building base binary from source:

  built-v16.14.2-win-x64

> Fetching Node.js source archive from nodejs.org...

> Error! AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:

大意是缓存里缺少相应的二进制文件fetched-v16.14.2-win-x64,咱们只要下载到相应的文件,放到相应的缓存目录就好。


去官网下载相应版本文件,比如我的是node-v16.14.2-win-x64

官网地址:https://github.com/vercel/pkg-fetch/releases

1.png


将上一步下载的文件node-v16.14.2-win-x64重命名为fetched-v16.14.2-win-x64,放到当前用户的缓存目录中。


比如我的缓存目录是C:\Users\MangoDowner\.pkg-cache,拼接上fetch的tag就变成了最终的目录,参照报错中的信息,可以得到tag为v3.3


 {"tag":"v3.3","name":"node-v16.14.2-win-x64"}

当然,你的tag可能和我不一样,看你自己的报错信息把。


咱们可以得到最终的父目录为C:\Users\MangoDowner\.pkg-cache\v3.3,

所以最终的文件地址为C:\Users\MangoDowner\.pkg-cache\v3.3\fetched-v16.14.2-win-x64


再次编译,成功!


$ pkg -t win server.js

> [email protected]

pkg的缓存目录:C:\Users\Administrator\.pkg-cache

Top