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_李疆~的博客-优快云博客_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打包不难,只要按照要求配置好,就能打包成功并运行。


 

要安装和打包Node.js的软件包(pkg),您可以按照以下步骤进行操作: 1. 首先,确保您已经在您的系统上安装了Node.js。您可以在终端或命令提示符中输入以下命令来检查Node.js的版本: ``` node --version ``` 如果显示了Node.js的版本号,则表示已经安装。 2. 接下来,您需要安装 `pkg` 运行时。可以使用以下命令进行全局安装: ``` npm install -g pkg ``` 3. 创建一个目录,并在该目录中创建一个 `package.json` 文件。您可以使用以下命令创建 `package.json` 文件: ``` npm init ``` 您可以根据提示输入相关信息,或者直接按回车键接受默认值。 4. 在 `package.json` 文件中添加一个脚本,用于打包您的应用程序。打开 `package.json` 文件,并在 `"scripts"` 字段中添加以下内容: ```json "scripts": { "build": "pkg your-app.js --output your-app" } ``` 替换 `your-app.js` 为您的应用程序的入口文件的路径。 5. 接下来,您可以使用以下命令来运行打包过程: ``` npm run build ``` 这将使用 `pkg` 工具将您的应用程序打包到可执行文件中。 6. 打包完成后,您将在当前目录中找到一个名为 `your-app` 的可执行文件。您可以使用以下命令来运行您的应用程序: ``` ./your-app ``` 这样,您就可以安装和打包Node.js应用程序了。请注意,这些步骤假设您已经在您的系统上正确安装了Node.js和npm。如果遇到任何问题,请参考相关文档或在社区寻求帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值