Compare commits

...
2 Commits
Author SHA1 Message Date
wc24 e8fc126fa6 feat: 新增 ./types 子入口,只 ship IShrimpType.ts
前端 / shrimp-admin / 任何"只要协议、不要框架运行时"的消费方装上
shrimp-server 后,import from 'shrimp-server/types' 就能拿到 types
+ ShrimpCode + ShrimpError,不会触发 Shrimp 主类 / Mongoose / express。

IShrimpType.ts 无外部 import,exports 字段把它单独切出来,vite/webpack
打包到前端时不会顺手拉走 Mongo 链。

v0.4.0
2026-05-23 19:03:04 +08:00
wc24 d8e0095a28 docs: bump install snippet to v0.3.0 + 加 ts-node/tsc 配置说明
迁移 hand-server-2 时撞到两个坑,补到 README:
  - ts-node 默认 ignore node_modules,要在 tsconfig 加 "ts-node": { "ignore": ["(?!)"] }
  - tsc 默认 moduleResolution "node" 不读 exports 字段,要升 node16 或加 paths
2026-05-23 17:18:47 +08:00
2 changed files with 62 additions and 6 deletions
+57 -5
View File
@@ -6,17 +6,64 @@
```sh
# 推荐: HTTP(任何能访问 git.zeromvc.com 的机器都能用)
npm install git+http://git.zeromvc.com/wc24/shrimp-server.git#v0.2.0
npm install git+http://git.zeromvc.com/wc24/shrimp-server.git#v0.4.0
# 也可以 SSH(需要 ssh key 配好)
npm install git+ssh://git@git.zeromvc.com:wc24/shrimp-server.git#v0.2.0
npm install git+ssh://git@git.zeromvc.com:wc24/shrimp-server.git#v0.4.0
```
> 仓库 ship `.ts` 源码,消费方项目需要 TS 运行器(`tsx` / `ts-node`)或在打包工具(vite / webpack / esbuild)里能解析 `.ts`。
### 两个入口,按需选择
### ts-node / ts-node-dev 用户:让它编译 node_modules 内的 .ts
包内提供了**核心**和**完整 server** 两个 entry,**peer deps 全部 optional**——你只装自己用得到的那一份:
`ts-node` 默认会把 `node_modules/` 当成"已编译"跳过,直接把 shrimp-server 的 `.ts`
源码丢给 Node — Node 22+ 看到 `export` 会按 ESM 加载然后炸 `Unexpected token 'export'`。
在 `tsconfig.json` 里把 ignore 覆盖掉:
```jsonc
{
"compilerOptions": { /* ... */ },
"ts-node": {
// 默认是 /(?:^|/)node_modules// — 这里清空,让 ts-node 也编译 shrimp-server
"ignore": ["(?!)"]
}
}
```
`tsx` 用户不需要这一步(tsx 默认就编译 node_modules 内的 .ts)。
### TypeScript 用户:让 tsc 识别 `shrimp-server/server` 子路径
包用 package.json `exports` 字段划分了 `'shrimp-server'`(0 重依赖核心)和
`'shrimp-server/server'`(Express 装配体)两个入口。**TS 默认的 `moduleResolution: "node"`
不读 `exports`,会找不到子路径模块。** 两个解法二选一:
```jsonc
// 方案 A: 升 moduleResolution(配合 module: node16,严格但纯净)
"compilerOptions": {
"module": "node16",
"moduleResolution": "node16"
}
```
```jsonc
// 方案 B: 保留 commonjs,显式 paths 指过去(兼容 ts-node-dev 老版)
"compilerOptions": {
"module": "commonjs",
"baseUrl": ".",
"paths": {
"shrimp-server": ["node_modules/shrimp-server/src/core.ts"],
"shrimp-server/server": ["node_modules/shrimp-server/src/server/index.ts"]
}
}
```
Node 22+ 的 CJS 加载器 **会**读 `exports`,所以运行时不需要额外配置 — 只是 TS 的
类型解析在 `moduleResolution: "node"` 模式下落后于 Node 实际行为,需要 paths 兜底。
### 三个入口,按需选择
包内提供了**核心**、**完整 server** 和**纯类型**三个 entry,**peer deps 全部 optional**——你只装自己用得到的那一份:
```ts
// 1) 核心: 0 重依赖(只需 node + tsx),适合自己接 HTTP / 只用内存 CRUD / 嵌入其它框架
@@ -24,9 +71,14 @@ import { Shrimp, ShrimpTableModule, MemoryShrimpCrud, ShrimpFieldTypes } from "s
// 2) 完整 server: 自带 Express Router + Mongoose + JWT,需要装上面 4 个 peer
import { ShrimpServer, MongoShrimpCrud } from "shrimp-server/server"
// 3) 纯类型: 只含 IShrimpType.ts(types + ShrimpCode enum + ShrimpError class)
// 给前端 / shrimp-admin / 任何"只要协议、不要框架运行时"的消费方
import { ShrimpCode, ShrimpError } from "shrimp-server/types"
import type { IFieldConfig, IMenuItem, IMeResult } from "shrimp-server/types"
```
只用 (1) 时,**不要**在自己的 package.json 里写 express/mongoose/bcrypt/jsonwebtoken,可以省下大量 install 时间(尤其是 mongoose 的 native binding)。需要 (2) 时按 peer 范围装齐即可。
只用 (1) 时,**不要**在自己的 package.json 里写 express/mongoose/bcrypt/jsonwebtoken,可以省下大量 install 时间(尤其是 mongoose 的 native binding)。需要 (2) 时按 peer 范围装齐即可。(3) 完全独立,既不会拉 Shrimp 主类也不会拉 mongoose,前端 bundle 安全。
> bcrypt 在 core 里走的是动态 `import('bcrypt')`,不触发 Password 字段 hash / `UserModule.verifyPassword` 就完全不会去 require 它。所以即便用 core 也注册了 password 字段,只要你不真正调用 `add/edit` 写入 Password 或 `getUser` 校验密码,bcrypt 仍是可不装的。
+5 -1
View File
@@ -1,6 +1,6 @@
{
"name": "shrimp-server",
"version": "0.3.0",
"version": "0.4.0",
"private": true,
"description": "Shrimp 框架后端 — 声明式字段驱动的 Node.js 管理后台框架(Express + Mongoose + JWT)",
"main": "src/index.ts",
@@ -14,6 +14,10 @@
"types": "./src/server/index.ts",
"default": "./src/server/index.ts"
},
"./types": {
"types": "./src/IShrimpType.ts",
"default": "./src/IShrimpType.ts"
},
"./package.json": "./package.json"
},
"files": [