wok-server 0.4.13 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +61 -0
- package/README.md +44 -29
- package/dist/cache/cache.js +98 -98
- package/dist/cache/config.js +19 -19
- package/dist/cache/index.js +27 -27
- package/dist/cache/purge-task.js +46 -46
- package/dist/cache/stat.js +47 -47
- package/dist/config/convert.js +36 -36
- package/dist/config/exception.js +14 -14
- package/dist/config/index.js +81 -81
- package/dist/http-client/index.js +136 -136
- package/dist/i18n/ar.js +17 -17
- package/dist/i18n/de.js +17 -17
- package/dist/i18n/en-us.js +17 -17
- package/dist/i18n/es.js +17 -17
- package/dist/i18n/fr.js +17 -17
- package/dist/i18n/i18n.js +231 -231
- package/dist/i18n/index.js +52 -52
- package/dist/i18n/ja.js +17 -17
- package/dist/i18n/ko.js +17 -17
- package/dist/i18n/msg.js +2 -2
- package/dist/i18n/pt.js +17 -17
- package/dist/i18n/ru.js +17 -17
- package/dist/i18n/tag.js +18 -18
- package/dist/i18n/zh-HK.js +17 -17
- package/dist/i18n/zh-TW.js +17 -17
- package/dist/i18n/zh-cn.js +17 -17
- package/dist/index.js +14 -14
- package/dist/lock/index.js +114 -114
- package/dist/log/config.js +35 -29
- package/dist/log/date.js +21 -21
- package/dist/log/file.js +198 -72
- package/dist/log/index.js +135 -105
- package/dist/log/level.js +33 -33
- package/dist/log/log.js +56 -0
- package/dist/log/store.js +19 -16
- package/dist/mongodb/collection.js +2 -2
- package/dist/mongodb/config.js +34 -34
- package/dist/mongodb/doc.js +2 -2
- package/dist/mongodb/exception.js +14 -14
- package/dist/mongodb/index.js +58 -58
- package/dist/mongodb/manager/base.js +563 -563
- package/dist/mongodb/manager/index.js +63 -63
- package/dist/mongodb/manager/tx-strict.js +84 -84
- package/dist/mongodb/manager/tx.js +30 -30
- package/dist/mongodb/migration.js +52 -52
- package/dist/mvc/access-log.js +33 -33
- package/dist/mvc/config.js +27 -27
- package/dist/mvc/exchange.js +113 -113
- package/dist/mvc/handler/index.js +7 -6
- package/dist/mvc/handler/json.js +65 -65
- package/dist/mvc/handler/restful.js +35 -35
- package/dist/mvc/handler/sse.js +65 -0
- package/dist/mvc/handler/upload.js +31 -31
- package/dist/mvc/index.js +50 -50
- package/dist/mvc/interceptor.js +2 -2
- package/dist/mvc/query.js +43 -43
- package/dist/mvc/render/file.js +132 -132
- package/dist/mvc/render/html/html.js +90 -90
- package/dist/mvc/render/html/index.js +18 -18
- package/dist/mvc/render/html/style.js +2 -2
- package/dist/mvc/render/index.js +7 -7
- package/dist/mvc/render/json.js +26 -26
- package/dist/mvc/render/text.js +16 -16
- package/dist/mvc/router.js +2 -2
- package/dist/mvc/server.js +272 -272
- package/dist/mvc/static/header.js +67 -67
- package/dist/mvc/static/index.js +6 -6
- package/dist/mvc/static/mime-type.js +84 -84
- package/dist/mvc/static/server-cache-config.js +66 -66
- package/dist/mvc/static/server-cache.js +133 -133
- package/dist/mvc/static/static-handler.js +372 -372
- package/dist/mysql/config.js +51 -51
- package/dist/mysql/exception.js +14 -14
- package/dist/mysql/index.js +87 -87
- package/dist/mysql/manager/base.js +239 -231
- package/dist/mysql/manager/index.js +107 -107
- package/dist/mysql/manager/ops/count.js +20 -20
- package/dist/mysql/manager/ops/criteria.js +356 -356
- package/dist/mysql/manager/ops/delete.js +65 -65
- package/dist/mysql/manager/ops/exist.js +26 -26
- package/dist/mysql/manager/ops/find.js +169 -130
- package/dist/mysql/manager/ops/index.js +14 -14
- package/dist/mysql/manager/ops/insert.js +106 -106
- package/dist/mysql/manager/ops/modify.js +10 -10
- package/dist/mysql/manager/ops/paginate.js +23 -23
- package/dist/mysql/manager/ops/query.js +9 -9
- package/dist/mysql/manager/ops/update.js +216 -216
- package/dist/mysql/manager/ops/utils.js +24 -24
- package/dist/mysql/manager/tx-strict.js +103 -100
- package/dist/mysql/manager/tx.js +30 -30
- package/dist/mysql/manager/utils.js +56 -56
- package/dist/mysql/migration.js +136 -136
- package/dist/mysql/table-info.js +8 -8
- package/dist/task/daily.js +59 -59
- package/dist/task/fixed-delay.js +38 -38
- package/dist/task/fixed-rate.js +42 -42
- package/dist/task/index.js +9 -9
- package/dist/task/task.js +56 -56
- package/dist/validation/exception.js +36 -36
- package/dist/validation/index.js +40 -40
- package/dist/validation/validator/array.js +34 -34
- package/dist/validation/validator/enum.js +28 -28
- package/dist/validation/validator/index.js +14 -14
- package/dist/validation/validator/length.js +40 -40
- package/dist/validation/validator/max-length.js +35 -35
- package/dist/validation/validator/max.js +29 -29
- package/dist/validation/validator/min-length.js +33 -33
- package/dist/validation/validator/min.js +29 -29
- package/dist/validation/validator/not-blank.js +33 -33
- package/dist/validation/validator/not-null.js +21 -21
- package/dist/validation/validator/plain-obj.js +32 -32
- package/dist/validation/validator/regexp.js +34 -34
- package/documentation/en/cache.md +56 -0
- package/documentation/en/config.md +96 -0
- package/documentation/en/engineering.md +256 -0
- package/documentation/en/http-client.md +32 -0
- package/documentation/en/i18n.md +143 -0
- package/documentation/en/index.md +24 -0
- package/documentation/en/lock.md +51 -0
- package/documentation/en/log.md +109 -0
- package/documentation/en/mongodb.md +256 -0
- package/documentation/en/mvc.md +688 -0
- package/documentation/en/mysql.md +552 -0
- package/documentation/en/task.md +45 -0
- package/documentation/en/test.md +56 -0
- package/documentation/en/validate.md +130 -0
- package/documentation/zh-cn/engineering.md +1 -1
- package/documentation/zh-cn/log.md +81 -8
- package/documentation/zh-cn/mvc.md +66 -24
- package/documentation/zh-cn/mysql.md +24 -23
- package/documentation/zh-cn/validate.md +2 -2
- package/package.json +3 -1
- package/skills/wok-server-api-rules/SKILL.md +350 -0
- package/skills/wok-server-cache/SKILL.md +216 -0
- package/skills/wok-server-config/SKILL.md +200 -0
- package/skills/wok-server-getting-started/SKILL.md +123 -0
- package/skills/wok-server-getting-started/references/engineering.md +169 -0
- package/skills/wok-server-http-client/SKILL.md +164 -0
- package/skills/wok-server-i18n/SKILL.md +214 -0
- package/skills/wok-server-lock/SKILL.md +144 -0
- package/skills/wok-server-log/SKILL.md +218 -0
- package/skills/wok-server-mongodb/SKILL.md +235 -0
- package/skills/wok-server-mvc/SKILL.md +251 -0
- package/skills/wok-server-mvc/references/respond-html.md +157 -0
- package/skills/wok-server-mvc/references/sse.md +121 -0
- package/skills/wok-server-mvc/references/static-files.md +47 -0
- package/skills/wok-server-mvc/references/upload.md +62 -0
- package/skills/wok-server-mvc/references/websocket.md +30 -0
- package/skills/wok-server-mysql/SKILL.md +315 -0
- package/skills/wok-server-mysql/references/multi-datasource.md +76 -0
- package/skills/wok-server-mysql/references/version-control.md +22 -0
- package/skills/wok-server-task/SKILL.md +158 -0
- package/skills/wok-server-validate/SKILL.md +167 -0
- package/src/cache/cache.ts +118 -0
- package/src/cache/config.ts +53 -0
- package/src/cache/index.ts +27 -0
- package/src/cache/purge-task.ts +53 -0
- package/src/cache/stat.ts +47 -0
- package/src/config/convert.ts +27 -0
- package/src/config/exception.ts +8 -0
- package/src/config/index.ts +92 -0
- package/src/http-client/index.ts +202 -0
- package/src/i18n/ar.ts +16 -0
- package/src/i18n/de.ts +16 -0
- package/src/i18n/en-us.ts +16 -0
- package/src/i18n/es.ts +16 -0
- package/src/i18n/fr.ts +16 -0
- package/src/i18n/i18n.ts +230 -0
- package/src/i18n/index.ts +50 -0
- package/src/i18n/ja.ts +16 -0
- package/src/i18n/ko.ts +16 -0
- package/src/i18n/msg.ts +50 -0
- package/src/i18n/pt.ts +16 -0
- package/src/i18n/ru.ts +16 -0
- package/src/i18n/tag.ts +18 -0
- package/src/i18n/zh-HK.ts +16 -0
- package/src/i18n/zh-TW.ts +16 -0
- package/src/i18n/zh-cn.ts +16 -0
- package/src/index.ts +11 -0
- package/src/lock/index.ts +164 -0
- package/src/log/config.ts +71 -0
- package/src/log/date.ts +19 -0
- package/src/log/file.ts +215 -0
- package/src/log/index.ts +136 -0
- package/src/log/level.ts +29 -0
- package/src/log/log.ts +77 -0
- package/src/log/store.ts +31 -0
- package/src/mongodb/collection.ts +25 -0
- package/src/mongodb/config.ts +69 -0
- package/src/mongodb/doc.ts +12 -0
- package/src/mongodb/exception.ts +8 -0
- package/src/mongodb/index.ts +71 -0
- package/src/mongodb/manager/base.ts +674 -0
- package/src/mongodb/manager/index.ts +80 -0
- package/src/mongodb/manager/tx-strict.ts +153 -0
- package/src/mongodb/manager/tx.ts +34 -0
- package/src/mongodb/migration.ts +66 -0
- package/src/mvc/access-log.ts +33 -0
- package/src/mvc/config.ts +70 -0
- package/src/mvc/exchange.ts +126 -0
- package/src/mvc/handler/index.ts +4 -0
- package/src/mvc/handler/json.ts +96 -0
- package/src/mvc/handler/restful.ts +39 -0
- package/src/mvc/handler/sse.ts +90 -0
- package/src/mvc/handler/upload.ts +54 -0
- package/src/mvc/index.ts +48 -0
- package/src/mvc/interceptor.ts +12 -0
- package/src/mvc/query.ts +36 -0
- package/src/mvc/render/file.ts +148 -0
- package/src/mvc/render/html/html.ts +187 -0
- package/src/mvc/render/html/index.ts +16 -0
- package/src/mvc/render/html/style.ts +1201 -0
- package/src/mvc/render/index.ts +4 -0
- package/src/mvc/render/json.ts +24 -0
- package/src/mvc/render/text.ts +14 -0
- package/src/mvc/router.ts +13 -0
- package/src/mvc/server.ts +315 -0
- package/src/mvc/static/header.ts +86 -0
- package/src/mvc/static/index.ts +3 -0
- package/src/mvc/static/mime-type.ts +81 -0
- package/src/mvc/static/server-cache-config.ts +92 -0
- package/src/mvc/static/server-cache.ts +171 -0
- package/src/mvc/static/static-handler.ts +445 -0
- package/src/mysql/config.ts +130 -0
- package/src/mysql/exception.ts +8 -0
- package/src/mysql/index.ts +88 -0
- package/src/mysql/manager/base.ts +285 -0
- package/src/mysql/manager/index.ts +112 -0
- package/src/mysql/manager/ops/count.ts +30 -0
- package/src/mysql/manager/ops/criteria.ts +412 -0
- package/src/mysql/manager/ops/delete.ts +96 -0
- package/src/mysql/manager/ops/exist.ts +41 -0
- package/src/mysql/manager/ops/find.ts +226 -0
- package/src/mysql/manager/ops/index.ts +11 -0
- package/src/mysql/manager/ops/insert.ts +120 -0
- package/src/mysql/manager/ops/modify.ts +14 -0
- package/src/mysql/manager/ops/paginate.ts +60 -0
- package/src/mysql/manager/ops/query.ts +13 -0
- package/src/mysql/manager/ops/update.ts +294 -0
- package/src/mysql/manager/ops/utils.ts +20 -0
- package/src/mysql/manager/tx-strict.ts +138 -0
- package/src/mysql/manager/tx.ts +31 -0
- package/src/mysql/manager/utils.ts +75 -0
- package/src/mysql/migration.ts +149 -0
- package/src/mysql/table-info.ts +41 -0
- package/src/task/daily.ts +70 -0
- package/src/task/fixed-delay.ts +45 -0
- package/src/task/fixed-rate.ts +49 -0
- package/src/task/index.ts +4 -0
- package/src/task/task.ts +70 -0
- package/src/validation/exception.ts +27 -0
- package/src/validation/index.ts +61 -0
- package/src/validation/validator/array.ts +32 -0
- package/src/validation/validator/enum.ts +25 -0
- package/src/validation/validator/index.ts +11 -0
- package/src/validation/validator/length.ts +42 -0
- package/src/validation/validator/max-length.ts +33 -0
- package/src/validation/validator/max.ts +26 -0
- package/src/validation/validator/min-length.ts +31 -0
- package/src/validation/validator/min.ts +26 -0
- package/src/validation/validator/not-blank.ts +31 -0
- package/src/validation/validator/not-null.ts +19 -0
- package/src/validation/validator/plain-obj.ts +30 -0
- package/src/validation/validator/regexp.ts +32 -0
- package/types/cache/cache.d.ts +52 -52
- package/types/cache/config.d.ts +32 -32
- package/types/cache/index.d.ts +2 -2
- package/types/cache/purge-task.d.ts +11 -11
- package/types/cache/stat.d.ts +26 -26
- package/types/config/convert.d.ts +6 -6
- package/types/config/exception.d.ts +7 -7
- package/types/config/index.d.ts +25 -25
- package/types/http-client/index.d.ts +71 -71
- package/types/i18n/ar.d.ts +2 -2
- package/types/i18n/de.d.ts +2 -2
- package/types/i18n/en-us.d.ts +2 -2
- package/types/i18n/es.d.ts +2 -2
- package/types/i18n/fr.d.ts +2 -2
- package/types/i18n/i18n.d.ts +102 -102
- package/types/i18n/index.d.ts +9 -9
- package/types/i18n/ja.d.ts +2 -2
- package/types/i18n/ko.d.ts +2 -2
- package/types/i18n/msg.d.ts +50 -50
- package/types/i18n/pt.d.ts +2 -2
- package/types/i18n/ru.d.ts +2 -2
- package/types/i18n/tag.d.ts +11 -11
- package/types/i18n/zh-HK.d.ts +2 -2
- package/types/i18n/zh-TW.d.ts +2 -2
- package/types/i18n/zh-cn.d.ts +2 -2
- package/types/index.d.ts +11 -11
- package/types/lock/index.d.ts +64 -64
- package/types/log/config.d.ts +35 -27
- package/types/log/date.d.ts +2 -2
- package/types/log/file.d.ts +13 -5
- package/types/log/index.d.ts +53 -34
- package/types/log/level.d.ts +14 -14
- package/types/log/log.d.ts +40 -0
- package/types/log/store.d.ts +19 -12
- package/types/mongodb/collection.d.ts +25 -25
- package/types/mongodb/config.d.ts +45 -45
- package/types/mongodb/doc.d.ts +11 -11
- package/types/mongodb/exception.d.ts +7 -7
- package/types/mongodb/index.d.ts +29 -29
- package/types/mongodb/manager/base.d.ts +188 -188
- package/types/mongodb/manager/index.d.ts +38 -38
- package/types/mongodb/manager/tx-strict.d.ts +41 -41
- package/types/mongodb/manager/tx.d.ts +21 -21
- package/types/mongodb/migration.d.ts +12 -12
- package/types/mvc/access-log.d.ts +7 -7
- package/types/mvc/config.d.ts +42 -42
- package/types/mvc/exchange.d.ts +72 -72
- package/types/mvc/handler/index.d.ts +4 -3
- package/types/mvc/handler/json.d.ts +44 -44
- package/types/mvc/handler/restful.d.ts +11 -11
- package/types/mvc/handler/sse.d.ts +34 -0
- package/types/mvc/handler/upload.d.ts +36 -36
- package/types/mvc/index.d.ts +22 -22
- package/types/mvc/interceptor.d.ts +11 -11
- package/types/mvc/query.d.ts +13 -13
- package/types/mvc/render/file.d.ts +10 -10
- package/types/mvc/render/html/html.d.ts +98 -98
- package/types/mvc/render/html/index.d.ts +11 -11
- package/types/mvc/render/html/style.d.ts +1201 -1201
- package/types/mvc/render/index.d.ts +4 -4
- package/types/mvc/render/json.d.ts +17 -17
- package/types/mvc/render/text.d.ts +10 -10
- package/types/mvc/router.d.ts +11 -11
- package/types/mvc/server.d.ts +90 -90
- package/types/mvc/static/header.d.ts +27 -27
- package/types/mvc/static/index.d.ts +3 -3
- package/types/mvc/static/mime-type.d.ts +2 -2
- package/types/mvc/static/server-cache-config.d.ts +30 -30
- package/types/mvc/static/server-cache.d.ts +76 -76
- package/types/mvc/static/static-handler.d.ts +77 -77
- package/types/mysql/config.d.ts +90 -90
- package/types/mysql/exception.d.ts +7 -7
- package/types/mysql/index.d.ts +16 -16
- package/types/mysql/manager/base.d.ts +165 -159
- package/types/mysql/manager/index.d.ts +36 -36
- package/types/mysql/manager/ops/count.d.ts +13 -13
- package/types/mysql/manager/ops/criteria.d.ts +134 -134
- package/types/mysql/manager/ops/delete.d.ts +46 -46
- package/types/mysql/manager/ops/exist.d.ts +6 -6
- package/types/mysql/manager/ops/find.d.ts +86 -70
- package/types/mysql/manager/ops/index.d.ts +10 -10
- package/types/mysql/manager/ops/insert.d.ts +18 -18
- package/types/mysql/manager/ops/modify.d.ts +3 -3
- package/types/mysql/manager/ops/paginate.d.ts +36 -36
- package/types/mysql/manager/ops/query.d.ts +3 -3
- package/types/mysql/manager/ops/update.d.ts +76 -76
- package/types/mysql/manager/ops/utils.d.ts +5 -5
- package/types/mysql/manager/tx-strict.d.ts +36 -35
- package/types/mysql/manager/tx.d.ts +15 -15
- package/types/mysql/manager/utils.d.ts +17 -17
- package/types/mysql/migration.d.ts +8 -8
- package/types/mysql/table-info.d.ts +36 -36
- package/types/task/daily.d.ts +16 -16
- package/types/task/fixed-delay.d.ts +9 -9
- package/types/task/fixed-rate.d.ts +9 -9
- package/types/task/index.d.ts +4 -4
- package/types/task/task.d.ts +34 -34
- package/types/validation/exception.d.ts +38 -38
- package/types/validation/index.d.ts +32 -32
- package/types/validation/validator/array.d.ts +5 -5
- package/types/validation/validator/enum.d.ts +8 -8
- package/types/validation/validator/index.d.ts +11 -11
- package/types/validation/validator/length.d.ts +10 -10
- package/types/validation/validator/max-length.d.ts +8 -8
- package/types/validation/validator/max.d.ts +7 -7
- package/types/validation/validator/min-length.d.ts +6 -6
- package/types/validation/validator/min.d.ts +7 -7
- package/types/validation/validator/not-blank.d.ts +7 -7
- package/types/validation/validator/not-null.d.ts +6 -6
- package/types/validation/validator/plain-obj.d.ts +7 -7
- package/types/validation/validator/regexp.d.ts +8 -8
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wok-server-i18n
|
|
3
|
+
description: wok-server 国际化组件使用指南,支持多语言消息构建、语言绑定、扩展业务国际化内容。
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
author: Peak Tai
|
|
7
|
+
email: peaktai@qq.com
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# wok-server 国际化组件
|
|
11
|
+
|
|
12
|
+
## 概述
|
|
13
|
+
|
|
14
|
+
国际化组件提供多语言消息构建能力,内置 12 种语言,支持扩展新语言和业务国际化内容。`getI18n()` 返回全局单例。
|
|
15
|
+
|
|
16
|
+
注意:全局 i18n 对象是共享的,异步请求中可能出现语言被其他请求串改的问题——请使用绑定功能(`bindByRequest` / `bindLang`)解决。
|
|
17
|
+
|
|
18
|
+
## 源码与类型定义
|
|
19
|
+
|
|
20
|
+
安装 `wok-server` 后,可通过以下路径查看源码与类型定义:
|
|
21
|
+
|
|
22
|
+
- 源码目录:`node_modules/wok-server/src/i18n/`
|
|
23
|
+
- 类型定义:`node_modules/wok-server/types/` (引用 i18n 组件的 `.d.ts` 文件)
|
|
24
|
+
|
|
25
|
+
核心源码文件:
|
|
26
|
+
|
|
27
|
+
| 文件 | 说明 |
|
|
28
|
+
| :-------------- | :--------------------------------- |
|
|
29
|
+
| `i18n.ts` | `I18n`、`BoundI18n`、`ExtensibleI18n` 三个类 |
|
|
30
|
+
| `index.ts` | 模块入口,`getI18n()` 初始化 12 种语言 |
|
|
31
|
+
| `tag.ts` | 语言标签解析(`zh-CN` → `{lang, region}`) |
|
|
32
|
+
| `msg.ts` | 内置消息模板类型定义 `I18nMsgs` |
|
|
33
|
+
| `zh-cn.ts` 等 | 各语言的消息模板文件 |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 获取实例
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import { getI18n } from 'wok-server'
|
|
41
|
+
const i18n = getI18n()
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
首次调用完成初始化后始终返回同一实例。初始化时会根据环境变量 `LANG` 或 `LC_CTYPE` 自动切换语言。
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 基本操作
|
|
49
|
+
|
|
50
|
+
### 获取 / 切换语言
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
const lang = i18n.getLang() // 'zh-CN'
|
|
54
|
+
const ok = i18n.setLang('en') // true 成功,false 不支持
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### 构建消息
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
const msg = i18n.buildMsg('validate-err-max', '7')
|
|
61
|
+
// zh-CN: "7 以下である必要があります" → 实际看当前语言
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`buildMsg(key, ...args)` 中 `key` 有类型约束(`I18nMsgs`),模板中用 `{}` 占位,按顺序替换。
|
|
65
|
+
|
|
66
|
+
### 支持的语言标签检测
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
const supported = i18n.getSupportedLanguageTags('zh-CN', 'xx', 'ja')
|
|
70
|
+
// ['zh-CN', 'ja'] — 过滤掉不支持的
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 内置语言
|
|
76
|
+
|
|
77
|
+
| 语言标签 | 语言 |
|
|
78
|
+
| :------- | :----------- |
|
|
79
|
+
| en | 英语(默认) |
|
|
80
|
+
| zh-CN | 简体中文 |
|
|
81
|
+
| zh-TW | 繁体中文 |
|
|
82
|
+
| zh-HK | 香港繁体 |
|
|
83
|
+
| ja | 日语 |
|
|
84
|
+
| ko | 韩语 |
|
|
85
|
+
| ru | 俄语 |
|
|
86
|
+
| es | 西班牙语 |
|
|
87
|
+
| de | 德语 |
|
|
88
|
+
| fr | 法语 |
|
|
89
|
+
| ar | 阿拉伯语 |
|
|
90
|
+
| pt | 葡萄牙语 |
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 语言匹配规则
|
|
95
|
+
|
|
96
|
+
`setLang` 的匹配逻辑(实现在 `findMsgsByLang`):
|
|
97
|
+
|
|
98
|
+
1. 解析语言标签为 `{lang, region}`
|
|
99
|
+
2. 查 `lang` 下的 region → 精确匹配 region
|
|
100
|
+
3. 未命中查默认区域 `-`
|
|
101
|
+
4. 仍未命中取该语言下第一个 region
|
|
102
|
+
5. 全部未命中返回 `undefined`,`setLang` 返回 `false`,语言不变
|
|
103
|
+
|
|
104
|
+
**注意**:匹配失败不会回退到英文默认语言,而是保持原有语言不变。
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## 配置新语言
|
|
109
|
+
|
|
110
|
+
如果需要的语言未内置,通过 `setMsgs` 添加消息模板后即可切换:
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
i18n.setMsgs('ja', {
|
|
114
|
+
'validate-err-array': '値が配列ではありません',
|
|
115
|
+
'validate-err-max': '{} 以下である必要があります',
|
|
116
|
+
'validate-err-min': '{} 以上である必要があります',
|
|
117
|
+
'validate-err-empty': '空であってはいけません',
|
|
118
|
+
'validate-err-string': '値が文字列のタイプではありません',
|
|
119
|
+
// ... 其他 key 来自 I18nMsgs
|
|
120
|
+
})
|
|
121
|
+
i18n.setLang('ja')
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 扩展业务国际化内容
|
|
127
|
+
|
|
128
|
+
通过 `extend` 创建独立的 i18n 对象,与全局 i18n 自动保持语言同步:
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
interface ExtMsgs { hello: string; world: string }
|
|
132
|
+
|
|
133
|
+
const extI18n = i18n.extend<ExtMsgs>({ hello: 'hello', world: 'world' })
|
|
134
|
+
extI18n.setMsgs('zh-CN', { hello: '你好', world: '世界' })
|
|
135
|
+
|
|
136
|
+
i18n.setLang('zh-CN')
|
|
137
|
+
extI18n.buildMsg('hello') // "你好"
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**约束**:所有消息模板 value 必须是 `string`,模板支持 `{}` 占位。扩展对象的 `setLang` 会自动被全局 i18n 的 `setLang` 同步调用(`ExtensibleI18n` 覆写了 `setLang`,遍历 `extendedI18ns` 逐个同步)。
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 绑定语言 — 解决异步串扰
|
|
145
|
+
|
|
146
|
+
由于全局 i18n 共享,请求 A 切换语言后执行异步操作,请求 B 可能在此期间切换语言,导致 A 的消息构建语言错误。解决方案:
|
|
147
|
+
|
|
148
|
+
### bindByRequest — 根据请求头绑定
|
|
149
|
+
|
|
150
|
+
```ts
|
|
151
|
+
async function handleReq(exchange: RouterExchange): Promise<void> {
|
|
152
|
+
const boundI18n = extI18n.bindByRequest(exchange.headers)
|
|
153
|
+
await query1()
|
|
154
|
+
await query2()
|
|
155
|
+
const hello = boundI18n.buildMsg('hello') // 语言固定,不受其他请求影响
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
解析 `accept-language` 头,取第一个支持的语言,生成 `BoundI18n`。`BoundI18n` 没有 `setLang` 方法,语言不可变。
|
|
160
|
+
|
|
161
|
+
### bindLang — 手动绑定
|
|
162
|
+
|
|
163
|
+
```ts
|
|
164
|
+
const bound = i18n.bindLang('zh-CN') // 绑定指定语言
|
|
165
|
+
const bound2 = i18n.bindLang() // 绑定当前语言
|
|
166
|
+
bound.buildMsg('validate-err-empty')
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
`bindLang` 不传参时绑定当前语言,传参且语言不支持时抛出 `Error`。
|
|
170
|
+
|
|
171
|
+
### switchByRequest — 直接切换
|
|
172
|
+
|
|
173
|
+
```ts
|
|
174
|
+
i18n.switchByRequest(exchange.headers)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
根据 `accept-language` 直接切换全局语言(不创建绑定对象)。适合没有异步串扰风险的场景。
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## 无国际化需求时固定中文
|
|
182
|
+
|
|
183
|
+
在 import 框架之前设置:
|
|
184
|
+
|
|
185
|
+
```ts
|
|
186
|
+
process.env.LANG = 'zh-CN'
|
|
187
|
+
import { startWebServer } from 'wok-server'
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
或者在容器中设置 `LANG=zh-CN` 环境变量。
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## 内部实现要点
|
|
195
|
+
|
|
196
|
+
### 类层次
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
I18n<T> — 核心类:setLang/getLang/buildMsg/bindLang/bindByRequest/switchByRequest
|
|
200
|
+
└── ExtensibleI18n<T> — 增加 extend 方法,覆写 setLang 同步扩展子对象
|
|
201
|
+
BoundI18n<T> — 轻量只读绑定对象,仅 getLang/buildMsg
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### 消息存储结构
|
|
205
|
+
|
|
206
|
+
`msgsMap: Map<lang, Map<region, T>>`。两层 Map:第一层 key 为语言(`en`),第二层 key 为地区(`us` 或 `-` 表示默认)。全小写存储。
|
|
207
|
+
|
|
208
|
+
### 语言标签解析 (`tag.ts`)
|
|
209
|
+
|
|
210
|
+
仅支持 `语言-地区` 格式(如 `zh-CN`),不支持完整 BCP 47。统一转小写后匹配。
|
|
211
|
+
|
|
212
|
+
### 初始化 (`index.ts`)
|
|
213
|
+
|
|
214
|
+
`getI18n()` 首次调用:创建 `ExtensibleI18n(enUS)` → 注册 11 种语言(不含默认 en)→ 根据 `LANG`/`LC_CTYPE` 环境变量自动切换语言。
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wok-server-lock
|
|
3
|
+
description: wok-server 锁组件使用指南,协调并发请求中的异步操作,防止数据竞争。
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
author: Peak Tai
|
|
7
|
+
email: peaktai@qq.com
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# wok-server 锁组件
|
|
11
|
+
|
|
12
|
+
## 概述
|
|
13
|
+
|
|
14
|
+
锁组件基于内存实现简单的异步并发控制,用于将不确定顺序、有冲突的异步操作按顺序执行。典型场景:减库存、抽奖等并发修改操作。
|
|
15
|
+
|
|
16
|
+
**注意**:这是进程内锁,只能协调单进程内的异步流程。如果需要分布式锁,应使用外部方案(如 Redis)。
|
|
17
|
+
|
|
18
|
+
## 源码与类型定义
|
|
19
|
+
|
|
20
|
+
安装 `wok-server` 后,可通过以下路径查看源码与类型定义:
|
|
21
|
+
|
|
22
|
+
- 源码目录:`node_modules/wok-server/src/lock/`
|
|
23
|
+
- 类型定义:`node_modules/wok-server/types/` (引用 lock 组件的 `.d.ts` 文件)
|
|
24
|
+
|
|
25
|
+
核心源码文件:
|
|
26
|
+
|
|
27
|
+
| 文件 | 说明 |
|
|
28
|
+
| :-------------- | :--------------------------------- |
|
|
29
|
+
| `index.ts` | `ServerLockManager`、`getLockManager` |
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 使用
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import { getLockManager } from 'wok-server'
|
|
37
|
+
|
|
38
|
+
const lockManager = getLockManager()
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
`getLockManager()` 返回全局单例 `ServerLockManager`。
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## tryLock — 竞争锁
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
function tryLock(opts: {
|
|
49
|
+
key: string
|
|
50
|
+
run: () => Promise<void>
|
|
51
|
+
waitSeconds?: number
|
|
52
|
+
expiresInSeconds?: number
|
|
53
|
+
}): Promise<boolean>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
| 参数 | 说明 |
|
|
57
|
+
| :----------------- | :------------------------------------------------------------------- |
|
|
58
|
+
| `key` | 锁标识,相同 key 产生竞争关系,排队执行 |
|
|
59
|
+
| `run` | 获取锁成功后执行的异步函数 |
|
|
60
|
+
| `waitSeconds` | 等待秒数(可选),不设置或 ≤0 则获取不到立即返回 `false` |
|
|
61
|
+
| `expiresInSeconds` | 锁过期时间(秒),默认 60。防止持有者异常退出导致死锁 |
|
|
62
|
+
|
|
63
|
+
返回值 `boolean`:`true` 表示成功获取锁并执行完毕,`false` 表示等待超时未获取到锁。
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 完整示例
|
|
68
|
+
|
|
69
|
+
```ts
|
|
70
|
+
import { createJsonHandler, getLockManager, notBlank, notNull, min, max } from 'wok-server'
|
|
71
|
+
|
|
72
|
+
interface Form {
|
|
73
|
+
id: string
|
|
74
|
+
quantity: number
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
createJsonHandler<Form>({
|
|
78
|
+
validation: {
|
|
79
|
+
id: [notBlank()],
|
|
80
|
+
quantity: [notNull(), min(1), max(10)]
|
|
81
|
+
},
|
|
82
|
+
async handle(body) {
|
|
83
|
+
const lock = getLockManager()
|
|
84
|
+
const acquired = await lock.tryLock({
|
|
85
|
+
key: `reduce-quantity-${body.id}`,
|
|
86
|
+
waitSeconds: 2,
|
|
87
|
+
expiresInSeconds: 600,
|
|
88
|
+
async run() {
|
|
89
|
+
const product = await findProductById(body.id)
|
|
90
|
+
if (product.quantity < body.quantity) {
|
|
91
|
+
throw new BusinessException('库存不足')
|
|
92
|
+
}
|
|
93
|
+
await reduceQuantity(body.id, body.quantity)
|
|
94
|
+
}
|
|
95
|
+
})
|
|
96
|
+
if (!acquired) {
|
|
97
|
+
throw new BusinessException('系统繁忙,请稍后重试')
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
})
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 内部实现要点
|
|
106
|
+
|
|
107
|
+
### 锁结构
|
|
108
|
+
|
|
109
|
+
```ts
|
|
110
|
+
interface LockInfo {
|
|
111
|
+
value: string // 随机 UUID,验证锁归属
|
|
112
|
+
expiresAt: number // 过期时间戳(ms)
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
底层为 `Map<string, LockInfo>`,`key` 是锁标识,`value` 是随机值 + 过期时间。
|
|
117
|
+
|
|
118
|
+
### 竞争流程
|
|
119
|
+
|
|
120
|
+
`tryLock` → `waitLock`(循环尝试获取锁):
|
|
121
|
+
|
|
122
|
+
1. 检查 `lockMap` 中是否存在对应 key
|
|
123
|
+
2. 不存在或已过期 → `lockMap.set(key, { value, expiresAt })` → 获取成功
|
|
124
|
+
3. 存在且未过期 → 等待一次 `setTimeout(0)`(让出事件循环)→ 继续循环
|
|
125
|
+
4. 超时 `waitSeconds` → 返回 `false`
|
|
126
|
+
|
|
127
|
+
### 锁释放
|
|
128
|
+
|
|
129
|
+
`run()` 执行完(成功或抛异常)后,在 `finally` 中验证 `value` 一致后 `delete(key)` 释放锁。
|
|
130
|
+
|
|
131
|
+
### 死锁防护
|
|
132
|
+
|
|
133
|
+
- **过期机制**:每个锁有 `expiresAt`,到期后其他竞争者可以覆盖获取
|
|
134
|
+
- **定期清理**:`ServerLockManager` 构造时启动 10 秒间隔的过期锁清理,防止 `lockMap` 内存泄漏
|
|
135
|
+
|
|
136
|
+
### sleep 实现
|
|
137
|
+
|
|
138
|
+
```ts
|
|
139
|
+
private sleep() {
|
|
140
|
+
return new Promise<void>(resolve => setTimeout(resolve, 0))
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
通过 `setTimeout(0)` 让出事件循环,给其他异步操作(包括锁持有者的 `run()` 执行和释放)创造执行机会。
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wok-server-log
|
|
3
|
+
description: wok-server 日志组件使用指南,支持级别控制、文件输出、自定义存储和结构化日志。
|
|
4
|
+
license: MIT
|
|
5
|
+
metadata:
|
|
6
|
+
author: Peak Tai
|
|
7
|
+
email: peaktai@qq.com
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
# wok-server 日志组件
|
|
11
|
+
|
|
12
|
+
## 概述
|
|
13
|
+
|
|
14
|
+
日志组件提供日志记录能力,支持级别过滤、控制台输出、文件写入、自定义存储、日志前缀、JSON/文本双格式。
|
|
15
|
+
|
|
16
|
+
## 源码与类型定义
|
|
17
|
+
|
|
18
|
+
安装 `wok-server` 后,可通过以下路径查看源码与类型定义:
|
|
19
|
+
|
|
20
|
+
- 源码目录:`node_modules/wok-server/src/log/`
|
|
21
|
+
- 类型定义:`node_modules/wok-server/types/` (引用 log 组件的 `.d.ts` 文件)
|
|
22
|
+
|
|
23
|
+
核心源码文件:
|
|
24
|
+
|
|
25
|
+
| 文件 | 说明 |
|
|
26
|
+
| :-------------- | :--------------------------------- |
|
|
27
|
+
| `index.ts` | 模块入口,`Logger` 类与 `getLogger` |
|
|
28
|
+
| `log.ts` | `Log` 结构定义、`formatLogText`/`formatLogJson` |
|
|
29
|
+
| `config.ts` | 日志配置(环境变量映射) |
|
|
30
|
+
| `level.ts` | `LogLevel` 枚举与解析 |
|
|
31
|
+
| `file.ts` | 文件存储实现,缓冲写入 + 定时清理 |
|
|
32
|
+
| `store.ts` | 自定义存储接口,`setLogStore` |
|
|
33
|
+
| `date.ts` | 日期时间格式化 |
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 环境变量
|
|
38
|
+
|
|
39
|
+
| 环境变量 | 默认值 | 说明 |
|
|
40
|
+
| :---------------- | :----- | :--------------------------------------------- |
|
|
41
|
+
| `LOG_LEVEL` | INFO | 日志级别:DEBUG / INFO / WARN / ERROR |
|
|
42
|
+
| `LOG_FILE` | false | 是否输出到文件 |
|
|
43
|
+
| `LOG_FILE_DIR` | logs | 日志文件目录(支持相对路径和绝对路径) |
|
|
44
|
+
| `LOG_FILE_MAX_DAYS` | 30 | 日志文件最大保留天数 |
|
|
45
|
+
| `LOG_CONSOLE` | true | 是否输出到控制台 |
|
|
46
|
+
| `LOG_FORMAT` | text | 输出格式:text 或 json(控制台强制 text) |
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 获取日志对象
|
|
51
|
+
|
|
52
|
+
```ts
|
|
53
|
+
import { getLogger } from 'wok-server'
|
|
54
|
+
|
|
55
|
+
const logger = getLogger()
|
|
56
|
+
const moduleLogger = getLogger('my-module') // 带前缀
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
`getLogger()` 无参时返回模块级默认单例 `Logger`(共享),传 prefix 时每次返回新实例。prefix 会在每条日志中显示为 `[INFO][my-module]日志内容`。
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## 日志输出
|
|
64
|
+
|
|
65
|
+
### 基本方法
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
logger.debug('调试信息')
|
|
69
|
+
logger.info('普通信息')
|
|
70
|
+
logger.warn('警告信息')
|
|
71
|
+
logger.warning('警告信息') // 同 warn
|
|
72
|
+
logger.error('错误信息', new Error('details'))
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### 级别判定(避免不必要的开销)
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
logger.isDebugEnabled() // 是否 DEBUG 级别可用
|
|
79
|
+
logger.isInfoEnabled()
|
|
80
|
+
logger.isWarnEnabled()
|
|
81
|
+
logger.isErrorEnabled()
|
|
82
|
+
|
|
83
|
+
if (logger.isDebugEnabled()) {
|
|
84
|
+
logger.debug(`复杂构建: ${JSON.stringify(largeObj)}`)
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 日志格式
|
|
91
|
+
|
|
92
|
+
### text 格式
|
|
93
|
+
|
|
94
|
+
```
|
|
95
|
+
[2025/05/13 14:30:22.456][INFO][my-module]日志内容
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
错误信息附带 stack trace(如果有),以换行拼接。
|
|
99
|
+
|
|
100
|
+
### json 格式
|
|
101
|
+
|
|
102
|
+
```json
|
|
103
|
+
{"level":2,"content":"日志内容","time":"2025-05-13T06:30:22.456Z","prefix":"my-module"}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
`LOG_FORMAT=json` 启用。注意控制台强制输出 text 格式,json 仅对文件有效。
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 文件日志
|
|
111
|
+
|
|
112
|
+
### 启用
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
LOG_FILE=true
|
|
116
|
+
LOG_FILE_DIR=logs
|
|
117
|
+
LOG_FILE_MAX_DAYS=30
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
模块加载时,若 `LOG_FILE=true` 则自动将 `fileStore` 注册为日志存储。
|
|
121
|
+
|
|
122
|
+
### 写入机制
|
|
123
|
+
|
|
124
|
+
- **缓冲写入**:日志先进入内存队列 `LOG_QUEUE`,延迟 100ms 批量写出,避免频繁 IO
|
|
125
|
+
- **超限立即写入**:队列超过 1024 条时立即写入,防止内存溢出
|
|
126
|
+
- **按日期分文件**:每天一个文件,文件名格式 `YYYYMMDD.log`
|
|
127
|
+
- **自动清理**:启动后每 24 小时检查并删除超过 `LOG_FILE_MAX_DAYS` 天的文件(基于文件 mtime)
|
|
128
|
+
|
|
129
|
+
### 手动 flush
|
|
130
|
+
|
|
131
|
+
```ts
|
|
132
|
+
import { flushLogsToFile } from 'wok-server'
|
|
133
|
+
|
|
134
|
+
// 进程退出前确保缓冲日志落盘
|
|
135
|
+
process.on('beforeExit', async () => {
|
|
136
|
+
await flushLogsToFile()
|
|
137
|
+
})
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 自定义存储
|
|
143
|
+
|
|
144
|
+
通过 `setLogStore` 替换默认的文件存储,可将日志发送到消息队列、外部系统等:
|
|
145
|
+
|
|
146
|
+
```ts
|
|
147
|
+
import { setLogStore } from 'wok-server'
|
|
148
|
+
|
|
149
|
+
setLogStore((log: Log, config: LogConfig) => {
|
|
150
|
+
// log.time — Date,日志时间
|
|
151
|
+
// log.level — LogLevel,级别枚举
|
|
152
|
+
// log.content — string,日志正文
|
|
153
|
+
// log.error — any,可选的异常对象
|
|
154
|
+
// log.prefix — string | undefined,可选的模块前缀
|
|
155
|
+
messageQueue.push(log)
|
|
156
|
+
})
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
一旦设置 `setLogStore`,文件存储会被覆盖(即使 `LOG_FILE=true`),两者不可共存。
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## Log 结构
|
|
164
|
+
|
|
165
|
+
```ts
|
|
166
|
+
interface Log {
|
|
167
|
+
time: Date // 日志时间
|
|
168
|
+
level: LogLevel // 级别枚举(DEBUG=1, INFO=2, WARN=3, ERROR=4)
|
|
169
|
+
content: string // 日志正文
|
|
170
|
+
error?: any // 可选,关联的异常对象
|
|
171
|
+
prefix?: string // 可选,模块前缀
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## LogLevel 枚举
|
|
176
|
+
|
|
177
|
+
```ts
|
|
178
|
+
enum LogLevel {
|
|
179
|
+
DEBUG = 1,
|
|
180
|
+
INFO = 2,
|
|
181
|
+
WARN = 3,
|
|
182
|
+
ERROR = 4
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
`parseLogLevel('INFO')` 将字符串转为枚举值,不支持的字符串抛 `Error`。
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## 内部实现要点
|
|
191
|
+
|
|
192
|
+
### Logger 类 (`index.ts`)
|
|
193
|
+
|
|
194
|
+
```ts
|
|
195
|
+
class Logger {
|
|
196
|
+
constructor(private prefix?: string) {}
|
|
197
|
+
private log(level: LogLevel, message: string, error?: any) {
|
|
198
|
+
if (level < config.level) return // 级别过滤
|
|
199
|
+
const log: Log = { level, content: message, time: new Date(), prefix: this.prefix, error }
|
|
200
|
+
if (config.console) { /* 控制台输出,强制 text 格式 */ }
|
|
201
|
+
const store = getLogStore()
|
|
202
|
+
if (store) store(log, config) // 自定义存储
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
无 prefix 时使用模块级 defaultLogger 单例,有 prefix 时创建新实例。
|
|
208
|
+
|
|
209
|
+
### 配置 (`config.ts`)
|
|
210
|
+
|
|
211
|
+
通过 `registerConfig` 映射环境变量,`level` 在配置阶段通过 `parseLogLevel` 转换为 `LogLevel` 枚举值,`fileDir` 转换为绝对路径。最终配置通过 `Object.freeze` 冻结。
|
|
212
|
+
|
|
213
|
+
### 文件存储 (`file.ts`)
|
|
214
|
+
|
|
215
|
+
- 延迟批量写入(100ms 定时器)
|
|
216
|
+
- 队列上限 1024 触发立即写入
|
|
217
|
+
- 按日期分组写入不同文件
|
|
218
|
+
- 24 小时清理周期,基于文件 mtime 判断过期
|