前言
因为工作性质,经常需要给客户发包,更新迭代我们正在做的项目的版本。
大部分时候,我们的项目主要是依赖浏览器环境运行的,偶尔可能要带上数据库,带上后台服务器。
但是问题就在于,我们主要做 2d、3d 数据可视化产品的。通俗点说,就是主要用到 canvas 2d 或者 canvas 3d webgl 来做我们的产品。
由于浏览器的安全限制或者技术本身的限制,代码运行的时候,有些资源只能跑在服务器里面才能正常拿到。
在实际应用的场景中,客户群有一个共同的特点,他们大多数并不是技术人员,而且大多数都用的是 windows 的系统。
因此,为了兼顾这大部分客户,所以有时候,即使我们做的是纯前端项目,也会为客户提供一个可以一键运行代码的全自动化系统。
当然“全自动化系统”说法夸张了一点,仅仅只是针对 windows 32/64 位系统做了适配,如果用 MacOS 或者 Linux,我相信拿到源码,自建个服务器,塞进去,也不是什么难事吧。
所以,这篇文章,我想要分享的内容就是,如何针对 windows 32/64 位系统,提供一个免安装版本的 nodejs 静态资源服务器。
我们搭建这个 nodejs 静态资源服务器主要用到的技术有 nodejs + express + dos批处理脚本等。
至于如果你说,我还要加上 mysql 或者 mongodb 服务器,不好意思,因为篇幅有限,这里我就不做介绍了,因为思路跟添加 nodejs 无二,自己稍微摸索一下,应该就能捣鼓出来了。
思路
整体思路其实很简单,我们这个系统的目录结构是这样的:
根目录中有一个 run.bat 文件,三个文件夹,分别是 32、64、resource。
- run.bat —— 一键运行的入口
- 32 —— 存放 32 位系统相关的免安装版本运行环境,比如 nodejs、mysql、mongodb 等等
- 64 —— 存放 64 位系统相关的免安装版本运行环境,比如 nodejs、mysql、mongodb 等等
- resource —— 存放源码、打包后代码
整个系统运行的思路为:
我们通过双击 run.bat 脚本,检测指定的端口是否可用,如果不可用就继续换端口检测。
检测到可用以后,根据当前系统版本,调用对应系统版本的运行环境,同时将端口号传进去。
start_node.bat 这个脚本,会用免安装版本的 nodejs 运行 resource 下面的 app.js,执行的同时,通过命令行传参的方式,将端口号传进去,这样就成功的开启了一个 nodejs 的静态资源服务器了。
实现
run.bat
首先我们来看看我们的 run.bat 里面的内容:
@echo off
REM 设置变量,默认设成64位,端口号设为 8081
SET _Bitness=64
SET port=8081
REM 检查端口占用情况
:checkPort
netstat -ano | findstr %port% >nul
REM 获得上一句执行以后的 errorlevel
set n=%errorlevel%
REM 如果上一步获取到的 errorlevel 为 0 , 说明检测到了端口被占用了,
REM 就将端口号自增,同时跳到检测端口占用处重复检测;否则继续执行下去
if %n% == 0 (
set /a port+=1
GOTO checkPort
) else (
GOTO startBat
)
REM 检测系统为 32 位还是 64 位
:startBat
IF "%PROCESSOR_ARCHITECTURE%" == "x86" (
IF NOT DEFINED PROCESSOR_ARCHITEW6432s (
SET _Bitness=32
)
)
REM 调用对应的版本,并传入端口号
start %_Bitness%\start_node.bat %port%
@ping localhost -n 6 > nul
REM 开启页面
set "url=http://localhost:%port%/"
start %url%
如果不熟悉 Windows batch script 的语法,可以去 wikibooks 学习一下:https://en.wikibooks.org/wiki/Windows_Batch_Scripting#Syntax
start_node.bat
启动 nodejs 的批处理脚本内容很简单:
@echo off
set port=%1
64\node\node --harmony resource\app.js %port%
执行 app.js js 文件,并带上端口号。
app.js
我们的 app.js 里面的内容也很简单,拿到端口号,调用 express,创建一个静态资源服务器,只需要把我们的静态资源扔进 resource 下面的 public 文件夹就行了。
const express = require('express')
const path = require('path')
const app = express()
const argvs = process.argv;
const port = parseInt(argvs[argvs.length - 1]) || 8081;
app.use(express.static(path.join(__dirname, 'public')))
app.listen(port, () => {
console.log(`App listening at port ${port}`)
})
nodejs 免安装版文件
直接在官网下一个免安装版本的 exe 后缀的执行文件,放到对应的文件夹就行了,地址为:https://nodejs.org/en/download/
后记
虽然看起来很简单,但是摸索的过程中,还是耗费了不少精力的。
特别是因为对于 batch script 的不熟悉,一度差点想要放弃了,其实耐心调试下,batch script 的语法还是很简单的。
而且平时,配合 Windows 的定时程序,用处无穷啊。
之前就有用过 batch script,定时启动一个 python 脚本,每天定时给电脑换壁纸。
虽然有人会说,折腾来折腾去,太麻烦了,为什么不下个 apache 服务器,直接把资源扔进去不就行了。
对此种反驳,我不置可否。
反正喜欢这样用的人,肯定会觉得这篇文章有所启发,这样也就达到我分享这篇文章的目的了。
在追求技术的路上,我们的是孤独的,越前进,越会发现身边与你同行的人好像越来越少了。
希望我们彼此都能珍重,为了梦想,坚持初心,不断的走下去,即使失败很多次,也要有一往无前的信念,下一次,说不定胜利的曙光就出现了。