[Tools] turbo
现在的monorepo项目中,要一个个进入相关文件夹再依次去运行实在太麻烦了,我们可以使用相关工具,方便、快捷、高速的帮我们处理这个问题。Turborepo 是一个用于 monorepo 项目管理 的构建工具,它支持 任务缓存、依赖追踪、并行构建,适合管理多个前端/后端包组成的项目。
其实基本的道理很简单,我们现在的最基本的痛点是运行管理起来太麻烦,turbo工具可以帮我们直接在根目录,根据workspace路径,索引到相关命令,帮我们运行,而且还有相关的缓存处理。
所以,最基本的要求:在pnpm-workspace.yaml每个路径,比如 apps/* 或 packages/* 中的 package.json 都要有标准的 scripts,这样才能精准的进行索引
也就是说你想一键的打包packages下面的包,那么packages路径下package.json中最好有统一的打包脚本命令,而且最好不要和其他外部包命令重名,比如,我们的脚本如下:
"scripts": {
"build:watch": "pnpm run build:watch:transpile & pnpm run build:watch:types",
"build:watch:transpile": "tsup --watch",
"build:watch:types": "tsc -p tsconfig.types.json --watch",
"build:lib": "pnpm run build:transpile & pnpm run build:types",
"build:transpile": "tsup",
"build:types": "tsc -p tsconfig.types.json"
},
注意:之前的build脚本命令我改了一个名字,
build:lib目的是为了和其他外部的一些脚本命令进行区分
我们在根目录引入turbo
pnpm add turbo -D --workspace-root
根目录下创建turbo.json文件
{
"$schema": "https://turbo.build/schema.json",
"tasks": {
"build:watch": {
"cache": false,
"persistent": true
},
"build:lib": {
"outputs": ["build/**/*"]
},
"dev": {
"cache": false,
"persistent": true
},
"start:dev": {
"dependsOn": ["^start:dev"],
"outputs": ["dist/**/*"],
"cache": false,
"persistent": true
},
"build:server": {
"outputs": ["dist/**/*"]
}
},
"ui": "tui",
"cacheDir": ".turbo/cache"
}
这里的build:watch、build:lib、dev、start:dev、build:server相当于就是turbo定义的任务,我们还需要在根目录的package.json中定义相关脚本任务
build:lib、build:server为了方便启动,都是分别给库代码中加入了build:lib脚本,给backend代码中加入了build:server脚本,免得因为同名的问题而困扰
"scripts": {
"build:watch": "turbo build:watch",
"build:lib": "turbo build:lib",
"build:server": "turbo build:server",
"start": "turbo start:dev",
"dev": "turbo dev",
},
turbo就会自动的在整个项目中匹配对应的脚本命令,并且还会保存相应的缓存信息,下次再次执行的时候,效率就会相当的高。
caddy
Caddy 是一个现代的 Web 服务器(和反向代理服务器),和 Nginx 属于同一类工具。
- Caddy配置文件简单直接,可读性高,
- 本地开发体验更好,你可以直接让 Caddy 代理多个服务,开箱即用
- 部署快速简单,单文件可执行,适合容器、轻量服务部署
- Caddy 一行配置搞定https,只要在配置文件顶部写上你的域名Caddy 就会自动帮你向 Let’s Encrypt 申请证书,并配置好 TLS,自动监听 443 端口,自动续期证书
我们还是直接在容器中安装caddy,为了好安装/卸载caddy,我们单独配置一个可执行文件,运行docker命令,还是在.dccontainer文件夹下创建caddy文件夹,创建restart.sh文件
docker run -d \
--name monitor-caddy \
--restart always \
-p 3060:80 \
-p 443:443 \
caddy:2.10.0
编写一个 shell 脚本之后,默认这个文件可能没有执行权限
查看文件状态
ls -la
给文件 restart.sh 添加执行权限
chmod +x restart.sh
chmod:是 change mode 的缩写,用于改变文件或目录的权限。
+x:意思是 添加可执行权限(x = execute)。
restart.sh:是目标文件名,通常是一个 Shell 脚本。
现在已经可以启动并运行caddy服务器了。
不过我们需要将自己的前端代码给挂载到服务器上,并且我们的前端代码里面还有之前开发阶段配置的访问后端api的代理,这些我们都需要经过caddy的反向代理配置才行,所以我们创建Caddyfile配置文件,把前端打包好的文件,复制粘贴到当前目录下方便访问。restart.sh重新配置一下,加入配置文件和代码文件的映射。注意,这一步配置之后,我们需要删除原来的容器,重新安装一下才行
docker run -d \
--name monitor-caddy \
--restart always \
-p 3060:80 \
-p 443:443 \
-v $PWD/Caddyfile:/etc/caddy/Caddyfile \
-v ./dist:/data \
caddy:2.10.0
配置Caddyfile文件:
:80 {
handle /api/* {
reverse_proxy 192.168.50.91:3030
}
handle_path /dsn-api/* {
reverse_proxy 192.168.50.91:3000
}
uri strip_suffix /
root * /data
handle {
templates
try_files {path} /index.html
file_server
}
}
其中,如果我们有域名,就将:80替换为我们自己的域名即可,handle /api/*配置主要是由于我们/api前缀是存在的,handle_path /dsn-api/*这个/dsn-api是需要去掉的,不需要配置caddy会自动帮我们处理
mac查看IP地址:
ifconfig | grep "inet " | grep -v 127.0.0.1
进入docker容器内部查看:
docker exec -it monitor-caddy sh
当我们输入命令
vi /etc/caddy/Caddyfile
可以看到外部的命令直接映射进来了
进入/data,外部dist目录中的内容也映射进来了
现在我们在浏览器上输入localhost:3060就能直接访问到具体的前端页面了
pm2
后端的项目要运行,当然也是启动打包之后的结果,不过每次还需要自己手动node dist/main.js这个不现实,并且程序挂了就挂了,没人帮你重启
我们Nest.js的项目还有一个问题是,并没有把全部的库文件帮我们打包,在打包文件中你还会发现这样的代码:require("@nestjs/core");。也就是说我们还要手动的去下载node_modules
PM2 是一个功能强大的 Node.js 应用进程管理工具,它主要解决两个问题
- 进程守护
- 进程管理与监控
PM2 可以让你的 Node.js 应用在后台持续运行,哪怕终端关闭或者程序崩溃,它都能自动重启,保持服务“永不宕机”。
PM2 还提供了一整套命令和可视化工具来查看服务状态、资源占用、日志等,非常方便开发和运维。
所以,我们直接使用pm2帮我们处理这些问题,首先当然还是安装,直接在项目根目录局部安装pm2
pnpm add pm2 -D --workspace-root
生成配置文件:
npx pm2 ecosystem
我们在配置文件中配置相关的要运行的后端代码即可
module.exports = {
apps: [{
name: "dsn-server",
script: './apps/backend/dsn-server/dist/main.js',
}, {
name: "monitor-server",
script: './apps/backend/monitor-server/dist/main.js',
}]
};
当然上面只是一个最简单的配置,其他内容可以去查看pm2官网
然后我们就可以直接运行了
npx pm2 start ecosystem.config.js

浙公网安备 33010602011771号