Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@ FROM node:26-alpine AS web
WORKDIR /web
# pnpm-workspace.yaml 必须一起 COPY:pnpm 从这里读 allowBuilds(放行 esbuild
# 的 postinstall),缺失会以 ERR_PNPM_IGNORED_BUILDS 退出。
COPY web/package.json web/pnpm-lock.yaml web/pnpm-workspace.yaml ./
# .npmrc 同理必须带上:里面有 auto-install-peers=false,与 lockfile 的
# settings.autoInstallPeers 必须一致,否则 --frozen-lockfile 直接报
# ERR_PNPM_LOCKFILE_CONFIG_MISMATCH。
COPY web/package.json web/pnpm-lock.yaml web/pnpm-workspace.yaml web/.npmrc ./
# Node 25 起不再内置 corepack,裸 `corepack enable` 会 exit 127(command not found);
# 先用 npm 装一份再 enable。0.34.x 与 pnpm 11+ 不兼容,固定到 0.36.0。
RUN npm install -g corepack@0.36.0 && corepack enable && pnpm install --frozen-lockfile
Expand Down
9 changes: 9 additions & 0 deletions web/.npmrc
Original file line number Diff line number Diff line change
@@ -1 +1,10 @@
verify-deps-before-run=false
# 不自动安装 peer 依赖。
# 起因:@lobehub/icons 把 @lobehub/ui / antd 声明为 peer,自动安装会拖进 400+ 个
# 包(antd 全家桶、emotion、rc-*),而我们只 import 它的静态图标组件
# (es/<Name>/components/{Color,Mono}),那些文件不引用 @lobehub/ui。
# 关掉后 lock 里的包从 1023 降到 601 个,也避免 peer 版本对不上(icons 6.x 要
# ui ^6,自动装的却是 5.42.6)。
# 代价:真正需要的 peer 必须显式声明——@testing-library/dom 已加进 devDependencies。
# pnpm 每次安装会列出「Peer dependencies that should be installed」,缺了看得见。
auto-install-peers=false
25 changes: 13 additions & 12 deletions web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,33 +13,34 @@
},
"dependencies": {
"@fontsource-variable/geist": "^5.3.0",
"@lobehub/icons": "^5.23.0",
"@tanstack/react-query": "^5.104.1",
"@lobehub/icons": "^6.0.0",
"@tanstack/react-query": "^5.104.3",
"class-variance-authority": "^0.7.1",
"cn": "^0.4.0",
"lucide-react": "^1.55.0",
"radix-ui": "^1.7.0",
"react": "^19.3.0",
"react-dom": "^19.3.0",
"cn": "^0.5.0",
"lucide-react": "^1.58.0",
"radix-ui": "^1.8.1",
"react": "^19.3.1",
"react-dom": "^19.3.1",
"react-router-dom": "^7.18.4",
"recharts": "^3.10.1",
"tw-animate-css": "^1.4.0"
},
"devDependencies": {
"@tailwindcss/vite": "^4.3.3",
"@testing-library/dom": "^10.4.1",
"@testing-library/jest-dom": "^7.0.1",
"@testing-library/react": "^16.3.0",
"@testing-library/user-event": "^14.6.1",
"@testing-library/user-event": "^14.6.8",
"@types/node": "^26.6.5",
"@types/react": "^19.2.0",
"@types/react-dom": "^19.2.0",
"@vitejs/plugin-react": "^6.1.2",
"@vitest/coverage-v8": "^5.0.3",
"jsdom": "^30.1.2",
"shadcn": "^4.21.4",
"@vitest/coverage-v8": "^5.0.5",
"jsdom": "^30.1.3",
"shadcn": "^4.22.0",
"tailwindcss": "^4.3.3",
"typescript": "^7.0.2",
"vite": "^8.3.4",
"vitest": "^5.0.3"
"vitest": "^5.0.5"
}
}
Loading
Loading