nodejs打包成桌⾯程序(exe)的进阶之路
nodejs打包成桌⾯程序(exe)的进阶之路
node js bat 前端计划任务
前⾔:最近的研究,请⼤佬们细品
第⼀篇 - 任务计划程序篇
说真的研究到将nodejs打包成可执⾏的exe⽂件是个意外的⽅向。
刚开始我的需求就是想要在电脑开机时⾃启动nodejs的项⽬;因为⾃⼰⽬前是搞前端开发的,⽽nodejs现在对于前端来说还是很⽕的,我们也会经常接触到它,⽐如webpack、Vue、React等都要⽤到nodejs进⾏编译,转换成浏览器可识别的⽂件,在这⾥nodejs扮演的是⼀个⼯具⼈的⾓⾊,给它们提供⼀个编译的环境。
那么nodejs可以做⼀个⽹站的服务么,这是肯定的,它有着如express等框架提供⼀个快速服务开发,让它像php、java⼀样提供⼀个API,但是到这⾥⼜遇到了⼀个问题,我⾃⼰⽤nodejs开发了⼀个⾃⼰的⼯作系统,在⾃⼰的电脑跑,如果是linux的话,可以⽤pm2等守护进程⼯具,但是在window⽤这个⼯具,
亲测过它占⽤的内存会越来越⼤,然后有说⽤nssm将nodejs注册成服务,亲测可以,但是呢我⼯作中要⽤到mockjs进⾏数据模拟,我将这⼀个也集成到了我的⼯作系统中,那么这时候,如果我修改了⼀下模拟系统的代码,就要⼿动重启这个服务了,那么这个注册成服务对于我所需要的场景就有点废了。
既然上⾯提到的被否定了,那么我⼜想了其他⽅法。之前我也仔细研究过window系统,从封装到重装,哈哈哈,所以我想到了⼀个和系统服务差不多的——任务计划程序,设置⼀个任务计划程序,让它在电脑登录的时候启动服务那么可⾏吗。
那么现在我就采⽤任务计划程序这⼀条⽅案,这个呢需要⾃⼰写⼀个bat⽂件,调⽤nodemon启动项⽬。
nodemon与node启动对⽐,nodemon会监听项⽬的代码修改,如果有修改则⾃动重启
@echo off
echo.
echo 光之旅star
echo.
color 0a
set AutoPath=%~dp0
%AutoPath:~0,2%
pushd %AutoPath%
cd /d %AutoPath%
cd ../server
nodemon bin/www
pause
上⾯就是我启动服务所⽤的server.bat⽂件
color 0a :设置cmd窗⼝颜⾊
set AutoPath=%~dp0 :将当前⽂件所在的⽬录赋值给⼀个变量
cd ../server :到项⽬的根⽬录
nodemon bin/www :⽤nodemon启动服务(项⽬⽤的是Express 应⽤程序⽣成器创建的:express-generator )
然后将这个bat⽂件添加到任务计划程序中
这样保存后,重新启动电脑登录,就会⾃动调⽤这个bat⽂件启动服务
本来到这⾥就完了,完美的实现了我的需求,但是呢。。。。。。
这样就会出现⼀个cmd窗⼝,如果关闭了cmd窗⼝,服务就会停⽌,嗯,这是正常的情况,我们常常要⽤到nodejs的时候也是有这个窗⼝的,但是呢。。。。。。
这个窗⼝⼀直在任务栏占着⼀个位置,强迫症让我想要关掉它,这可以实现么,所以就来到了我们的第⼆篇研究中,请看第⼆篇。。。。。。
第⼆篇 - cmd打包成exe篇
如何在启动服务的时候不显⽰cmd窗⼝呢,之前我有⽤VBScript写过⼀些脚本程序,这个呢可以不显⽰cmd窗⼝在后台执⾏,那我这次是要⽤这个么,当然不是,为什么呢
VBScript写的脚本程序相信有些⼈有⽤过,就是后缀为.vbs的可执⾏⽂件,但是有些病毒正是利⽤这个特点写了⼀些病毒脚本,⽐如在U盘插进电脑的时候就触发运⾏,导致电脑中毒的情况,最经典的就是 U盘⽂件变成快捷⽅式的病毒,想要了解的可以看我另外⼀个博⽂,这⾥就不赘述,运⾏这个后缀的程序是window⾃带的⽂件,所以我把它删除了。
那么我要⽤什么呢,在这⾥我需要借助⼀个⼯具(cmd to exe converter),这个⼯具可以将bat⽂件打包成exe,并且可以设置该打包的⽂件隐⾝运⾏,那么这样就达到了我所需要的在后台运⾏的需求,下⾯看操作
将之前的bat⽂件⽤cmd to exe converter 打开,如图进⾏相关设置,然后点击菜单栏的转换即可打包出exe⽂件
然后将exe⽂件参照第⼀篇在任务计划程序中使⽤
bat⽂件如果是ANSI格式的,引⼊到cmd to exe converter 中,中⽂可能乱码,因为cmd to exe converter 默认是UTF8编码
cmd窗⼝默认不解析UTF8编码的中⽂,可以在bat⽂件中添加代码让cmd窗⼝解析UTF8编码
chcp 65001
上⾯我们⽣成了exe⽂件,并且点击exe⽂件会在后台启动服务,但是我们多点击⼏下exe⽂件,在任务管理器中我们可以看到会同时启动好多这个⽂件,并不是只允许当前点击的这个⽂件,那么这并不是我们需要的,这个怎么解决呢
看上⾯的代码,我们可以再建⽴⼀个bat⽂件,我将它命名为start.bat。
⾥⾯先关掉之前的进程,再去调⽤,这样就保证了每次都只存在⼀个实例
taskkill /f /t /
在这⼀篇中,我们所讲的是将cmd打包成exe⽂件,解决了我希望启动的程序在后台运⾏的情况,但并没有将我的项⽬也打包成exe,这和标题有些不符合,那么接下来要怎么做呢,请看下⼀篇
第三篇 - nodejs打包成exe
我在思考,cmd可以打包成exe,那么⽤nodejs做的项⽬可以打包成exe吗,打包成exe后就可以将项⽬发给别⼈看,且不需要安装node环境
⾸先想到的是 Electron ,它是⽬前使⽤ JavaScript,HTML 和 CSS 构建跨平台的桌⾯应⽤程序最常⽤的解决⽅案,但是要⽤它的话,就要遵循它的规范,说不定还要重构我的程序,且学习起来还是需要⼀些成本在⾥⾯的,基于这些情况,我把它抛弃了。
那么还有什么解决⽅案呢,这时候⼀个pkg的node包映⼊了我的眼帘,它的作⽤就是打包node为可执⾏⽂件(.exe)的⼯具,接下来我们直接⽤
npm install -g pkg
pkg server.js
pkg -t win server.js
npm install -g pkg :全局安装pkg
pkg server.js :将 api.js 编译成 可执⾏⽂件
pkg -t win server.js :上⾯的命令会同时编译出 linux 、windows 、mac 版的 exe,加 -t win 就可以只编译 windows 下的
//server.js
//⽤express做的简单服务
const express = require("express");
const app = express();
const path = require("path");
app.use(express.static(path.join(__dirname, "dist"))); //注意这⾥使⽤path.join(__dirname, 'dist')⽽不是'dist',虽然在命令⾏中执⾏起来效果是⼀样的,不过pkg打包会⽆法识别到dist⽬录var server = app.listen(8081, function () {
var host = server.address().address;
var port = server.address().port;
console.log(`AIbuy agents server start successfully on ${host}:${port}`);
});
注意在编译的过程中(pkg -t win server.js)可能会出现报错的情况,如下
> pkg@4.3.0
> Fetching base Node.js binaries to PKG_CACHE_PATH
fetched-v12.18.1-win-x64 [ ] 0%
> Error! connect ETIMEDOUT 13.229.188.59:443
> Asset not found by direct link:
{"tag":"v2.6","name":"uploaded-v2.6-node-v12.18.1-win-x64"}
这是因为编译的时候要从github下载uploaded-v2.6-node-v12.18.1-win-x64包,由于下载不了导致的,
这时我们可以先去github下载到这个包,放到当前⽤户下,如C:\Users\cheng\.pkg-cache\v2.6
,让包的名字改为 fetched-v12.18.1-win-x64 ,再次运⾏编译即可。
要下载什么版本的包看⾃⼰的报错需要什么版本。
如何下载javascript正常下载⽹速很慢,推荐使⽤ IDM 进⾏下载
注:pkg除了根据⽂件名打包,还可以根据package.json⽂件打包,要注意的是项⽬中引⽤⽂件的⽅式,pkg只会打包使⽤require或者通过__filename和__dirname的⽂件
这⼀篇我们讲了将nodejs打包成exe,但是不知道你们有没有注意到,我们上⾯的操作都只是为了启动nodejs的服务,但是要访问的话,还是需要在浏览器中访问,那么如果代码中⽤了es6的语法,是不是还要带个⾕歌浏览器让其他要访问你页⾯的⼈安装呢,这是⼀个值得思考的问题,我们继续看下⼀篇
第四篇 - 加个浏览器的壳
上⾯我们提到站点访问的问题,可能会说的⽐较极端,但是确实也是我当时在考虑的问题,那么这个要怎么解决呢。
这次就不卖关⼦了,直接使⽤npm的easy-window包
可以直接下载,或者使⽤git克隆下来
⾥⾯有⼀些案例感兴趣的可以看看
我们所需要的是⾥⾯的 ⽂件,将该⽂件拷贝到第⼆篇或者第三篇⽂件所在的⽬录中,⽐如我们⽤第⼆篇的⽬录为例,创建⼀个bat⽂件,内容如下
-url localhost:3000/ -title "管理系统" -maxbox true -topmost true
-url :要⽤的url地址
-title :标题
-maxbox :允许窗⼝最⼤化
-topmost :将窗⼝置顶
运⾏后就可以弹出⼀个的窗⼝,我们上⾯输⼊的地址内容就在这个窗⼝⾥⾯运⾏,这就像是给我们的项⽬加了⼀个壳,让我们项⽬在我们给定的壳⾥运⾏,这个壳是⼀个精简版的浏览器
需要注意的是easy-window⾥⾯运⾏传统的⽹页没问题,但是运⾏单页应⽤就会出问题。
easy-window各种参数
结尾
到此我的 nodejs打包成桌⾯程序(exe)的进阶之路就算是⼀个摸索的结点,上⾯提到的都不⽤怎么去学新的技术,⽽是将多种⼯具组合灵活使⽤。如果需要继续进阶,可以考虑学习Electron、PyQt(⽤
python写Qt)等桌⾯应⽤相关的知识。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论