feat!: v3 - require Node.js >= 24, migrate to ESM, modernize toolchain (#579) BREAKING CHANGE: drop Node.js < 24 support, package is now ESM-only engines.node >= 24, .nvmrc and CI workflows aligned to Node 24 CJS -> ESM: tsconfig module nodenext, package.json type module, all imports use node: prefix and .js extensions Monkey-patching uses createRequire for mutable CJS module objects (ESM namespaces are frozen in Node 24) Remove moment, replace with native formatTimestamp() Upgrade chalk v3 -> v5, ip v1 -> v2 (CVE fix), yargs v15 -> v17 ESLint v8 -> v9 flat config (eslint.config.mjs), typescript-eslint v8 Replace Jest with Vitest (native ESM, 4x faster) Update README with v3 migration guide, ESM examples, vitest badge Use AsyncLocalStorage instead of Domain
feat!: v3 - require Node.js >= 24, migrate to ESM, modernize toolchain (#579)
BREAKING CHANGE: drop Node.js < 24 support, package is now ESM-only
Tencent Server Web(TSW) 是一套面向 WEB 前端开发者,以提升问题定位效率为初衷,提供 染色抓包 和 全息日志 的 Node.js 基础设施。TSW 关注业务的运维监控能力,适用于 http、https 协议的业务场景,可无缝与现有应用(Koa、Express)进行整合。
TSW 2.0 在 1.0 的基础上抽丝剥茧,辅以现代化的设计模式,去除了 1.0 中的大量糟粕,同时对容器化、云原生更加友好。做到了无侵入、低成本接入。
TSW 3.0 在 2.0 的基础上全面拥抱现代化 Node.js 生态:
TSW 3.0 包含以下 Breaking Changes:
@tswjs/tsw
"type": "module"
export default
.mjs
.js
module.exports
npm install --save @tswjs/tsw # yarn add @tswjs/tsw
配置文件是 TSW 启动时加载进运行时的配置文件,主要声明需要使用的 插件 列表。默认会加载项目根目录下的 tswconfig.js 文件,也可以通过启动参数 -c 或者 --config 来手动指定配置文件路径。
tswconfig.js
-c
--config
TSW 3.0 同时支持 CJS 和 ESM 配置文件:
ESM 配置(推荐) — 使用 .mjs 扩展名,或在 "type": "module" 的项目中使用 .js:
// tswconfig.mjs export default { plugins: [ new MyPlugin({}) ] }
CJS 配置 — 传统写法仍然兼容:
// tswconfig.js module.exports = { plugins: [ new MyPlugin({}) ] }
参数列表: | Name | Type | default | Optional | Description | | :-: | :-: | :-: | :-: | :-: | | plugins | Array<Plugin>| - | yes | 插件列表 | | cleanLog | boolean | false | yes | 是否关闭默认打印 | | logLevel | DEBUG/INFO/WARN/ERROR | DEBUG | yes | 设置 log level | | winstonTransports | Array<TransportStream> | - | yes | Winston日志通道 |
false
DEBUG/INFO/WARN/ERROR
DEBUG
TSW CLI 支持加载 CJS(.js)和 ESM(.mjs)入口文件:
# CJS 入口 npx @tswjs/tsw ./index.js # ESM 入口 npx @tswjs/tsw ./index.mjs # 指定 ESM 配置文件 npx @tswjs/tsw -c tswconfig.mjs ./index.mjs
注意事项:原先 node --inspect ./index.js 中的 CLI 参数如 --inspect 需要转化为环境变量 NODE_OPTIONS 来执行,如 NODE_OPTIONS="--inspect" npx @tswjs/tsw ./index.js。
node --inspect ./index.js
--inspect
NODE_OPTIONS
NODE_OPTIONS="--inspect" npx @tswjs/tsw ./index.js
使用 TypeScript: 推荐使用 tsx,它无需额外配置即可支持 ESM + TypeScript:
NODE_OPTIONS="--import=tsx" npx @tswjs/tsw ./index.ts
也可以使用 ts-node(ESM 模式):
NODE_OPTIONS="--import=ts-node/esm" npx @tswjs/tsw ./index.ts
使用 npx @tswjs/tsw --help 来获取 CLI 选项。
npx @tswjs/tsw --help
我们提供了一些示例项目以让大家尽快了解该项目。
cd ~
git clone https://github.com/Tencent/TSW.git
cd TSW
cd examples/koa
npm install
npm run serve
curl localhost:4443
cd examples/esm
curl localhost:3000
curl localhost:3000/api
cd examples/https
examples/https/README.md
curl -k https://localhost:8000
TSW 核心的实现方式是 Hack NodeJS 自身的 http.request 以及 http.createServer, 以此来实现抓包机制。在服务器处理请求的前后,在服务器向其他服务器发包的前后,等等,都会有相应的事件抛出,以供用户来进行自定义处理。为了让用户更加方便地复用、传播这样一组组自定义处理,我们将他们抽象出来,形成了插件机制。
http.request
http.createServer
export class MyPlugin { constructor() { this.name = "MyPlugin" } async init(eventBus, config) { eventBus.on("RESPONSE_CLOSE", (payload) => { console.log(payload); }) } }
init 方法是必须的,这个方法在插件加载开始时会被调用,可以是同步也可以是异步。
init
eventBus
eventBus 是通过 new EventEmitter() 得到的。TSW 核心会在各个关键时机触发上面的事件。
new EventEmitter()
DNS_LOOKUP_SUCCESS
string | dns.LookupAddress[]
DNS_LOOKUP_ERROR
NodeJS.ErrorException
RESPONSE_START
writeHead
ResponseEventPayload
RESPONSE_FINISH
res.on("finish")
RESPONSE_CLOSE
res.on("close")
REQUEST_START
RequestEventPayload
在默认的情况下,TSW 只是会把所有的日志和抓包内容抓取到并且送到事件总线上,以供 插件 消费。所以将日志和抓包内容落地查看一般需要用户自己编写插件以及提供存储,使用成本过于高昂。因此,TSW 官方提供了公共的服务平台 https://tswjs.org,让用户低成本、更快、更方便地使用 TSW 的特性,详情见 开放平台使用指引。
TSW 面对容器化和云原生设计,没有内置 Cluster 相关功能,推荐直接使用容器的健康检查来完成服务的无损重启和故障重启机制。对于没有使用容器化方案的场景来说,我们推荐使用 pm2 类似工具来实现多进程模式。
// ecosystem.config.json { "apps": [ { "name": "app-name", "script": "built/index.js", "interpreter": "node", "interpreter_args": "./node_modules/@tswjs/tsw/dist/cli.js", // other options } ] }
// package.json { ... "scripts": { "start": "pm2 start ecosystem.config.json" }, ... }
winston 是一个通用且轻量的日志包。winston 支持多个日志通道,并且可以分别定义日志优先级。除了内置的三个日志传输通道Console、 File、HTTP,在 Winston 项目外部还会维护一些传输模块。查看 winston 官方文档。
winston
Console
File
HTTP
TSW 支持使用 winston 传输通道记录日志信息,用户在配置文件中可以添加 winston.transports 实例,日志会落到对应配置中。
winston.transports
使用 winston 记录 error 级别 以及 debug 级别以下的日志信息到对应文件中,当前 config 文件配置如下:
error
debug
config
import winston from "winston"; export default { winstonTransports: [ new winston.transports.File({ filename: 'error.log', level: 'error'}), new winston.transports.File({ filename: 'debug.log', level: 'debug'}) ] }
日志记录
Tencent Server Web 的开源协议为 MIT, 详情参见 LICENSE 。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
Tencent Server Web 3.0
What is it
Tencent Server Web(TSW) 是一套面向 WEB 前端开发者,以提升问题定位效率为初衷,提供 染色抓包 和 全息日志 的 Node.js 基础设施。TSW 关注业务的运维监控能力,适用于 http、https 协议的业务场景,可无缝与现有应用(Koa、Express)进行整合。
TSW 2.0 在 1.0 的基础上抽丝剥茧,辅以现代化的设计模式,去除了 1.0 中的大量糟粕,同时对容器化、云原生更加友好。做到了无侵入、低成本接入。
TSW 3.0 在 2.0 的基础上全面拥抱现代化 Node.js 生态:
Highlights
🚀
0 侵入
📒
全息日志
🛠
请求抓包
从 2.0 迁移到 3.0
TSW 3.0 包含以下 Breaking Changes:
@tswjs/tsw现在以 ESM 格式发布("type": "module"),但用户应用不受影响,CJS 和 ESM 均可正常加载export default语法(.mjs或在"type": "module"项目中使用.js);传统的module.exports写法仍然兼容Quick Start
1. 安装
2. 添加配置文件
配置文件是 TSW 启动时加载进运行时的配置文件,主要声明需要使用的 插件 列表。默认会加载项目根目录下的
tswconfig.js文件,也可以通过启动参数-c或者--config来手动指定配置文件路径。TSW 3.0 同时支持 CJS 和 ESM 配置文件:
ESM 配置(推荐) — 使用
.mjs扩展名,或在"type": "module"的项目中使用.js:CJS 配置 — 传统写法仍然兼容:
参数列表: | Name | Type | default | Optional | Description | | :-: | :-: | :-: | :-: | :-: | | plugins | Array<Plugin>| - | yes | 插件列表 | | cleanLog | boolean |
false| yes | 是否关闭默认打印 | | logLevel |DEBUG/INFO/WARN/ERROR|DEBUG| yes | 设置 log level | | winstonTransports | Array<TransportStream> | - | yes | Winston日志通道 |3. 启动
TSW CLI 支持加载 CJS(
.js)和 ESM(.mjs)入口文件:注意事项:原先
node --inspect ./index.js中的 CLI 参数如--inspect需要转化为环境变量NODE_OPTIONS来执行,如NODE_OPTIONS="--inspect" npx @tswjs/tsw ./index.js。使用 TypeScript: 推荐使用 tsx,它无需额外配置即可支持 ESM + TypeScript:
也可以使用 ts-node(ESM 模式):
CLI (Command Line Interface)
使用
npx @tswjs/tsw --help来获取 CLI 选项。Examples
我们提供了一些示例项目以让大家尽快了解该项目。
cd ~git clone https://github.com/Tencent/TSW.gitcd TSWKoa (CJS)
cd examples/koanpm installnpm run servecurl localhost:4443ESM
cd examples/esmnpm installnpm run servecurl localhost:3000或curl localhost:3000/apiHTTPS
cd examples/httpsexamples/https/README.md)npm installnpm run servecurl -k https://localhost:8000Plugins
插件是什么?
TSW 核心的实现方式是 Hack NodeJS 自身的
http.request以及http.createServer, 以此来实现抓包机制。在服务器处理请求的前后,在服务器向其他服务器发包的前后,等等,都会有相应的事件抛出,以供用户来进行自定义处理。为了让用户更加方便地复用、传播这样一组组自定义处理,我们将他们抽象出来,形成了插件机制。一个最简单的插件
init方法是必须的,这个方法在插件加载开始时会被调用,可以是同步也可以是异步。eventBuseventBus是通过new EventEmitter()得到的。TSW 核心会在各个关键时机触发上面的事件。DNS_LOOKUP_SUCCESSstring | dns.LookupAddress[]DNS_LOOKUP_ERRORNodeJS.ErrorExceptionRESPONSE_STARTwriteHead)时触发ResponseEventPayloadRESPONSE_FINISHres.on("finish"))触发ResponseEventPayloadRESPONSE_CLOSEres.on("close"))触发ResponseEventPayloadREQUEST_STARTRequestEventPayloadOpen Platform
在默认的情况下,TSW 只是会把所有的日志和抓包内容抓取到并且送到事件总线上,以供 插件 消费。所以将日志和抓包内容落地查看一般需要用户自己编写插件以及提供存储,使用成本过于高昂。
因此,TSW 官方提供了公共的服务平台 https://tswjs.org,让用户低成本、更快、更方便地使用 TSW 的特性,详情见 开放平台使用指引。
Cluster
TSW 面对容器化和云原生设计,没有内置 Cluster 相关功能,推荐直接使用容器的健康检查来完成服务的无损重启和故障重启机制。对于没有使用容器化方案的场景来说,我们推荐使用 pm2 类似工具来实现多进程模式。
pm2
使用 Ecosystem File
Winston
winston 是什么?
winston是一个通用且轻量的日志包。winston支持多个日志通道,并且可以分别定义日志优先级。除了内置的三个日志传输通道Console、File、HTTP,在 Winston 项目外部还会维护一些传输模块。查看winston官方文档。TSW 支持使用
winston传输通道记录日志信息,用户在配置文件中可以添加winston.transports实例,日志会落到对应配置中。一个简单的示例
使用
winston记录error级别 以及debug级别以下的日志信息到对应文件中,当前config文件配置如下:日志记录
Users
Stargazers over time
License
Tencent Server Web 的开源协议为 MIT, 详情参见 LICENSE 。