前阵子, 碰到个问题
用Nodejs做了个小项目需要交付客户使用
之前Nodejs做的都是自用, 所以也没碰到需要打包保护源码之类的问题
上网搜了半天, 找到的大多是针对Vue的前端项目打包/混淆, 例如用Webpack
费了N多时间才找到个针对后端项目的打包方法, 记录如下, 方便自己也方便有同样需求的同行
应用对象: Nodejs后端代码
使用场景: 保护源码/方便部署
适用平台: Linux/Windows/Mac
基础要求: 已有一个最基本的Nodejs后端项目
第一步: 安装pkg模块
pkg能把你的项目直接打包成可执行的文件(支持FreeBSD、linux、macos、arm系统), 甚至不需要你安装Nodejs.
按标准方式安装它
npm install -g pkg配置package.json, 在原内容基础根位置上添加以下内容
{
"name": "demo" //原始内容
....
"bin": "./app.js", //你项目的总入口文件
"pkg": {
"targets": [ "node14-linux-x64" ], //打包平台, 本例是打包在Linux中运行
"scripts": [ //需要打包进来的其他js文件,可添加多个
"./include/**/*.js",
"./routes/**/*.js",
"./module/*.js",
"./app.js",
],
"assets": [ //静态文件的目录,可添加多个
"./node_modules/**/*",
"./public/**/*",
"./views/**/*"
]
},
...
}按照上面的注释,依次补充配置信息
注意, 这里配置一定不要错, 如果后面打包后各种运行不了的报错的时候, 回来这里检查一下吧
pkg会根据你配置的入口文件开始查找依赖文件并全部进行打包
开始打包
在命令行(我这里用的是PowerShell)进入项目所在的目录, 用指令打包
注意: 静态文件需要在项目中将文件的引用换成
path.join(__dirname, 'public')比如
//一般常用写法:
app.use(express.static(__dirname+'/public'));
//打包的话改成这种
app.use(express.static(path.join(__dirname, 'public'))); //注意这里使用path.join(__dirname, 'public')而不是'public',虽然在命令行中执行起来效果是一样的,不过pkg打包会无法识别到public目录来打包试试
pkg .\package.json如果你发生像上面这样的警告, 恭喜你, 碰到和我一样的问题
不用紧张, 按提示可以看到微软官方的说明
授权给命令行窗口以执行脚本
Set-ExecutionPolicy -ExecutionPolicy Unrestricted再次打包
pkg .\package.json需要消耗一定的时间
技巧:当然你也可直接用-t指定需要打成哪个平台的包:
pkg -t "node14-win-x64,node14-linux-x64" .\package.json-t 详细可用参数说明
https://github.com/vercel/pkg#targets
比较重要的是生成什么平台的t参数, 作者描述如下
Targets
pkg can generate executables for several target machines at a time. You can specify a comma-separated list of targets via --targets option. A canonical target consists of 3 elements, separated by dashes, for example node12-macos-x64 or node14-linux-arm64:
nodeRange (node8), node10, node12, node14, node16 or latest
platform alpine, linux, linuxstatic, win, macos, (freebsd)
arch x64, arm64, (armv6, armv7)打包完成, 试运行
打包完成, 你大概会看到这样的大文件
试运行一下
小结
打包基本上就是下图这么个过程
整个过程自己实操一遍
总的来说还是比较简单的
这期就酱, 下期再见[奋斗]
复杂的问题简单化
每次只关注一个知识点, 我是代码大叔
对技术有兴趣的小伙伴可以关注我, 我经常分享各种奇奇怪怪的技术知识
一起学习, 一起进步
