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下配置

扫描二维码关注公众号,回复: 15024047 查看本文章

(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打包不难,只要按照要求配置好,就能打包成功并运行。


 

猜你喜欢

转载自blog.csdn.net/m0_55173487/article/details/128015052
今日推荐