pkg的学习之旅 ----使用pkg打包Node.js服务小demo
将Node.js打包为可执行文件的工具有pkg、nexe、node-packer、enclose等,面对项目需要,所以在学习pkg,看到相关文章,觉得这个很不错,自己记录下,以便下次使用便捷。
pkg的打包原理简单来说,就是将js代码以及相关的资源文件打包到可执行文件中,然后劫持fs里面的一些函数,使它能够读到可执行文件中的代码和资源文件。例如,原来的require(’./a.js’)会被劫持到一个虚拟目录require(’/snapshot/a.js’)。
安装
npm install pkg --save-dev
使用
pkg使用比较简单,执行下pkg -h
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 package.json 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
Examples:
– Makes executables for Linux, macOS and Windows
$ pkg index.js
– Takes package.json from cwd and follows 'bin' entry
$ pkg .
– Makes executable for particular target machine
$ pkg -t node6-alpine-x64 index.js
– Makes executables for target machines of your choice
$ pkg -t node4-linux,node6-linux,node6-win index.js
– Bakes '--expose-gc' into executable
$ pkg --options expose-gc index.js
-t,–目标逗号分隔的目标列表,指定打包的目标平台和Node版本,如-t node6-win-x64,node6-linux-x64,node6-macos-x64可以同时打包3个平台的可执行程序
-c,–config package.json 或任何具有顶级配置的json文件,指定一个JSON配置文件,用来指定需要额外打包脚本和资源文件,通常使用package.json配置。
–option 将V8选项烘焙到可执行文件中以在其上运行
-o,–指定输出可执行文件的名称,但如果用-t指定了多个目标,那么就要用–out-path指定输出的目录;
----out-path 输出一个或多个可执行文件的输出路径
-d,–debug 在打包过程中显示更多信息[off]
-build 不要下载预构建的基本二进制文件,构建它们。
–public 加速并披露顶级项目的来源
<input>可以通过三种方式指定:
1.一个脚本文件,例如pkg index.js;
2.package.json,例如pkg package.json,
这时会使用package.json中的bin字段作为入口文件;
3.一个目录,例如pkg .,这时会寻找指定目录下的package.json文件,
然后在找bin字段作为入口文件。
使用pkg的最佳实践是:在package.json中的pkg字段中指定打包参数,使用npm scripts来执行打包过程,
{
...
"bin": "./bin/www",
"scripts": {
"pkg": "pkg . --out-path=dist/"
},
"pkg": {
"scripts": "build/**/*.js",
"assets": "views/**/*",
"targets": [...]
},
...
}
scripts和assets用来配置未打包进可执行文件的脚本和资源文件,文件路径可以使用glob通配符*。
实例:
使用vue-cli建立项目,并使用npm run build将你的项目编译生成静态文件到dist目录下。
在项目目录下新建一个service.js文件,并添加以下代码,在本地起一个express静态服务器,使你能够在本地访问你的网站(部署到线上也是类似)
service.js代码示例:
//service.js
const express = require('express');
const app = express();
const path = require('path');
app.on('ready',function(){
console.log('进入页面了')
})
//注意这里使用path.join(__dirname, 'dist')而不是'dist'
// 虽然在命令行中执行起来效果是一样的,不过pkg打包会无法识别到dist目录
app.use(express.static(path.join(__dirname, '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}`)
console.log('打包出来了')
})
保存后,就可以输入命令行,来启动服务器了,启动完成后,浏览器访问http://localhost:8081/即可查看本地网站。
node service.js
接下来我们使用将service.js和dist目录打包成一个exe文件,方便他人使用
首先全局安装pkg
npm install pkg -g
然后修改package.json,添加bin(如果不是service.js的话)和pkg项
package.json:
然后在项目目录下执行
pkg -t win package.json
完成后即生成一个exe文件,双击启动即相当于执行node service.js,然后你浏览器里(http://localhost:8081/)就能访问打包好的项目了!
见下图:
双击打开这个exe文件,会出现如下界面:
然后就可以根据自己的项目需求进行编码了,这是pkg打包…