如何将用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服务相关推荐

  1. pkg打包node服务为双击可执行二进制文件Windows x64系统

    1.安装node.js 我这里安装的是14.16.0(建议版本14以上) 2.安装pkg包 3.编写一段后台程序 ·目录结构如下 ·package.json中内容 {"name": ...

  2. 使用 pkg 打包 node服务端 项目

    前言 最近自己写了一个nodejs+mysql+express 的项目,想着如果项目部署的话还要再安装 node 环境什么的,肯定太麻烦,于是就想有没有像webpack 那样打包项目的插件,于是了解到 ...

  3. 打包node服务端_如何基于NodeJS从零构建线上自动化打包工作流?

    前言 NodeJS在前端领域正扮演着越越重要的地位,它不仅可以让前端工作者使用javascript编写后端代码,还能方便地搭建响应速度快.易于扩展的网络应用.Node.js 使用事件驱动,非阻塞I/O ...

  4. Node服务一键离线部署

    背景说明 项目测试通过,到了上线部署阶段.部署的机器安全限制比较严格,不允许访问外网.此外,没有对外网开放ssh服务,无法通过ssh远程操作. 针对上面提到的两条限制条件,通过下面方式解决: 无法访问 ...

  5. 使用 Docker 部署 Node 服务

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 前言 Docker 是一个开源的容器引擎.开发者可以将自己的应用以及依赖打包为一个可移植的容器,然后 ...

  6. 宝塔部署node项目_SFF一站式node服务管理平台实践

    导语 本文阐述了基于Serverless搭建一站式node服务管理平台过程中,在开发框架.日志.监控.部署等方面遇到的问题及技术方案. 背景 Serverless是一种无服务器架构,它的弹性伸缩,按需 ...

  7. Jenkins流水线打包微服务构建docker镜像运行

    前提: 1.已安装Harbor. 2.已安装Jenkins,已配置相关环境,如Maven.JDK等. 3.微服务项目已经推送到远程仓库(我这里是推送到了gitee). 操作流程如下 1.新建任务 2. ...

  8. node服务器接口不稳定,node服务部署到服务器后,数据接口404

    最近的一个项目,数据接口一部分是调JAVA后台的,一部分是本地node服务,弄得服务的数据源是从一个个json文件里面取的. 项目接近尾声,需要将项目打包后放到服务器上去,这个时候就醉了,java后台 ...

  9. Node.js笔记 - 修改文件后自动重启node服务

    每次修改代码后都要手动重启node服务,虽然不是复杂的事,但是每次都要这么搞一次颇为麻烦. 所以nodemon登场了! nodemon会监测你已运行程序中的文件和目录,一旦被修改,它会自动重启node ...

最新文章

  1. 从照片中可视化图像数据
  2. 开始新的BLOG了!!
  3. C++重载流插入运算符与流提取运算符
  4. python docx 字体大小_Python操作Word的入门教程
  5. Win10网络连接面板中突然出现空白一片的解决办法
  6. Xcode9安装插件,xcode9安装使用Alcatraz
  7. python高斯滤波和降噪_高斯滤波器和高斯滤波器中sigma与带宽的关系
  8. Go的编译原理系列二之编译过程
  9. Android 仿QQ、新浪相册的实现
  10. Win10系统键盘正常但不能输入
  11. 计算机视觉:视频分解图片和图片合成视频
  12. Redis命令:scan实现模糊查询
  13. Excel工作表保护公式那些事儿
  14. 360权重 360网站权重查询在哪里
  15. SSD和HDD的磁盘读写
  16. 让男人无法抗拒的三种傻女人【顶】【转】
  17. 生成所有的ALTERs,将所有MyISAM表转换为InnoDB
  18. 制作LOGO 12种专用字体
  19. APICloud携手洋葱开启APP开发“刷脸时代”
  20. 八种常用激光雷达和视觉SLAM算法的评估与比较

热门文章

  1. Windows JAR包的启动脚本
  2. 计算机二级考试word试题及其讲解,计算机二级Word篇-实操真题详解21
  3. 计算机系统结构研究生专业课,计算机系统结构考研科目
  4. Python 虚拟机安装步骤
  5. SQL Server用户GUEST的简要介绍
  6. vscode +phpstudy 搭建php调试环境
  7. 飞剪程序、追剪程序plc程序伺服程序
  8. e-企业管理解决方案-客户管理系统
  9. np.linalg.norm()用法总结
  10. @rollup/plugin-terser 用法