pkg之打包node服务
如何将用Node搭建的服务,在没有外网的情况下简单部署?通过查找自己和实践,找到了适合的技术——pkg,能将服务打包成一个exe文件,方便部署,既能保证代码的安全性,又能让使用者一键操作。
一、通过查找资料,接触到的技术有:
1、pm2:一个进程管理,简单易学,但这个不满足我想要的结果
2、pkg:好家伙,这不就是我想要的吗!! pkg是一个编译成二进制可执行文件的工具,可以在npm中搜索学习:pkg - npm
3、其他:nexe,node-packer,enclose,这些只是简单的看了一下
二、pkg原理:
pkg实际上并不是直接将程序转换成可执行文件,而是将node环境一起打包到了程序中,这样就可以做到不用在没有node环境下的电脑上运行node项目。有需要了解更详细的可以看这篇案例node项目打包成可执行文件pkg(一): pkg介绍 - 掘金
三、优点:
1、输出一个exe文件:可以在freebsd,linux,alpine,macos,win上运行,具体看使用的情况打包。注意:打包的时候回检测你打包的环境,如win上,就只能打包win可执行的包
2、脱离node环境,不需要安装一堆依赖
3、脱离外网,不需要联网(断网)可用
4、防止代码泄露,给客户的只是一个exe文件,不需要把全部代码公布了
这就是我为什么选择pkg的原因了。好了,现在说说实现的步骤和我遇到的坑
四、使用步骤
1、全局安装pkg
npm install -g pkg
2、配置
在package.json下配置
(1)入口文件
pkg执行打包的原理就是从入口文件开始,根据相关依赖顺藤摸瓜地执行打包过程,显然这个入口文件与node应用程序的自身是一样的。在配置文件package.json里,需要加上bin属性,专门指定pkg的执行入口,入口可以有多种方式:
// package.json
{
...
"bin": "./bin/www",
"bin": "./service.js"
...
}
(2)打包命令
pkg执行是最关键的打包动作,比如我这里用到的这行配置是这样写的:
"scripts": {"dist": "pkg . --out-path=dist/ --targets=win --compress=GZip"},
pkg . :会寻找指定目录下的package.json文件,然后在找bin字段作为入口文件。
-t 或-targets :指定打包的目标平台和Node版本,如-t node6-win-x64,node6-linux-x64,node6-macos-x64可以同时打包3个平台的可执行程序
-o :指定输出可执行文件的名称
--out-path :指定输出的目录
--compress :打包后的压缩格式
(3)js和静态文件
这块较关键,前面提到pkg打包会从入口开始根据依赖去找相关资源,并把这些都打包进去,不过直接打包这种情况仅限于require引用方式,如果你的代码中有用到__dirname拼接变量的形式,就要在packge.json中进行配置了。
如:项目中通过__dirname来读取views和public的文件
app.set('views',path.join(__dirname, './views'))
app.use(express.static(path.join(__dirname, './public')));
那views与public文件夹中的文件都不会被pkg自动打包,需要进行配置:
{ "script": {}, "pkg": { "assets": ["public/**/*","views/**/*"], "scripts": "workers/**/*.js" },
}
assets:表示静态资源相关配置,像public/**/* 这种通配符写法,表示public下所有文件都被打包进去了;
scritps:表示需要配置才能打包的js脚本
3、打包
npm run dist
若是打包成功,会在项目中的dist文件下多出一个xxx.exe文件
五、遇到的坑
1、node和cache版本,可以参考这位大佬的文章
pkg打包node项目为exe_李疆~的博客-CSDN博客_pkg打包
2、缺少文件、静态文件读取失败
pkg只识别require,__dirname、__filename和process.cwd加载的文件,
__dirname和__filename写法,必须要在assets配置
process.cwd读取外部文件,比如项目有数据库文件,需要读取,把数据库文件和打包的exe文件放在一起,通过process.cwd来读取
除以上四种的其他写法,读取不到
__dirname和__filename的区别__dirname:D://work/service/data
__filename:D://work/service/data/index.js
3、数据库文件读取失败
process.cwd读取外部文件,比如项目有数据库文件,需要读取,把数据库文件和打包的exe文件放在一起,通过process.cwd来读取
六、总结
可能很多小伙伴和我一样,对Node知识接触的并不深,就会觉得难。不管哪种方式(学习or工作)需要接触到了,都要放点耐心。pkg打包不难,只要按照要求配置好,就能打包成功并运行。
pkg之打包node服务相关推荐
- pkg打包node服务为双击可执行二进制文件Windows x64系统
1.安装node.js 我这里安装的是14.16.0(建议版本14以上) 2.安装pkg包 3.编写一段后台程序 ·目录结构如下 ·package.json中内容 {"name": ...
- 使用 pkg 打包 node服务端 项目
前言 最近自己写了一个nodejs+mysql+express 的项目,想着如果项目部署的话还要再安装 node 环境什么的,肯定太麻烦,于是就想有没有像webpack 那样打包项目的插件,于是了解到 ...
- 打包node服务端_如何基于NodeJS从零构建线上自动化打包工作流?
前言 NodeJS在前端领域正扮演着越越重要的地位,它不仅可以让前端工作者使用javascript编写后端代码,还能方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动,非阻塞I/O ...
- Node服务一键离线部署
背景说明 项目测试通过,到了上线部署阶段.部署的机器安全限制比较严格,不允许访问外网.此外,没有对外网开放ssh服务,无法通过ssh远程操作. 针对上面提到的两条限制条件,通过下面方式解决: 无法访问 ...
- 使用 Docker 部署 Node 服务
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 前言 Docker 是一个开源的容器引擎.开发者可以将自己的应用以及依赖打包为一个可移植的容器,然后 ...
- 宝塔部署node项目_SFF一站式node服务管理平台实践
导语 本文阐述了基于Serverless搭建一站式node服务管理平台过程中,在开发框架.日志.监控.部署等方面遇到的问题及技术方案. 背景 Serverless是一种无服务器架构,它的弹性伸缩,按需 ...
- Jenkins流水线打包微服务构建docker镜像运行
前提: 1.已安装Harbor. 2.已安装Jenkins,已配置相关环境,如Maven.JDK等. 3.微服务项目已经推送到远程仓库(我这里是推送到了gitee). 操作流程如下 1.新建任务 2. ...
- node服务器接口不稳定,node服务部署到服务器后,数据接口404
最近的一个项目,数据接口一部分是调JAVA后台的,一部分是本地node服务,弄得服务的数据源是从一个个json文件里面取的. 项目接近尾声,需要将项目打包后放到服务器上去,这个时候就醉了,java后台 ...
- Node.js笔记 - 修改文件后自动重启node服务
每次修改代码后都要手动重启node服务,虽然不是复杂的事,但是每次都要这么搞一次颇为麻烦. 所以nodemon登场了! nodemon会监测你已运行程序中的文件和目录,一旦被修改,它会自动重启node ...
最新文章
- 从照片中可视化图像数据
- 开始新的BLOG了!!
- C++重载流插入运算符与流提取运算符
- python docx 字体大小_Python操作Word的入门教程
- Win10网络连接面板中突然出现空白一片的解决办法
- Xcode9安装插件,xcode9安装使用Alcatraz
- python高斯滤波和降噪_高斯滤波器和高斯滤波器中sigma与带宽的关系
- Go的编译原理系列二之编译过程
- Android 仿QQ、新浪相册的实现
- Win10系统键盘正常但不能输入
- 计算机视觉:视频分解图片和图片合成视频
- Redis命令:scan实现模糊查询
- Excel工作表保护公式那些事儿
- 360权重 360网站权重查询在哪里
- SSD和HDD的磁盘读写
- 让男人无法抗拒的三种傻女人【顶】【转】
- 生成所有的ALTERs,将所有MyISAM表转换为InnoDB
- 制作LOGO 12种专用字体
- APICloud携手洋葱开启APP开发“刷脸时代”
- 八种常用激光雷达和视觉SLAM算法的评估与比较