Skip to content

Commit 48e05aa

Browse files
committed
feat: install backend package
1 parent ba96659 commit 48e05aa

File tree

5 files changed

+4988
-1
lines changed

5 files changed

+4988
-1
lines changed

.cursorignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
.env
3+
.env.development
4+
.env.production
5+
6+
.npmrc

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,6 @@ assets/illustrations_webp
3434

3535
.env
3636
.env.development
37-
.env.production
37+
.env.production
38+
39+
.npmrc
Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
### **教程:与可选后端集成实现类型自动同步**
2+
3+
本教程将指导您如何配置您的前端项目,以便与一个可选的后端服务实现类型定义的自动同步。这可以显著提升开发体验,尤其是在处理API请求和响应时。
4+
5+
我们提供了一个模板后端项目 [tobenot/Basic-Web-Game-Backend](https://github.com/tobenot/Basic-Web-Game-Backend),您可以直接使用它,或基于此模板创建自己的后端项目。该后端通过 **GitHub Packages** 发布一个私有的npm包来共享API类型契约。
6+
7+
您估计会想使用自己的后端项目,请将下文中的所有 `@<您的GitHub用户名>` 替换为您的实际GitHub用户名。
8+
9+
---
10+
11+
## **快速使用指南(前端视角)**
12+
13+
如果您已经熟悉流程,可以直接按照以下步骤操作:
14+
15+
1. **创建 `.npmrc` 文件**
16+
在项目根目录添加 `.npmrc` 文件,并包含以下内容:
17+
```ini
18+
@tobenot:registry=https://npm.pkg.github.com/
19+
//npm.pkg.github.com/:_authToken=您的PAT令牌
20+
```
21+
将 `您的PAT令牌` 替换为您的 GitHub Personal Access Token (PAT),确保 PAT 至少具有 `read:packages` 权限。
22+
23+
2. **将 `.npmrc` 添加到 `.gitignore`**:
24+
避免将包含敏感信息的 `.npmrc` 提交到 Git:
25+
```bash
26+
echo ".npmrc" >> .gitignore
27+
```
28+
29+
3. **安装契约包**:
30+
安装后端发布的类型包:
31+
```bash
32+
npm install @tobenot/basic-web-game-backend-contract@latest
33+
```
34+
35+
4. **在代码中使用类型**:
36+
现在您可以直接从包中导入类型定义:
37+
```typescript
38+
import type { AppRouter } from '@tobenot/basic-web-game-backend-contract';
39+
40+
// 示例:在 tRPC 或其他 API 客户端中使用
41+
// const trpc = createTRPCProxyClient<AppRouter>({ ... });
42+
```
43+
44+
---
45+
46+
47+
## **详细教程(完整版)**
48+
49+
### **1. 前端仓库配置**
50+
51+
#### **1.1 创建个人访问令牌(PAT)**
52+
53+
1. 前往您的 GitHub **Settings** -> **Developer settings** -> **Personal access tokens**。
54+
2. 生成一个新令牌(classic token),并至少勾选 **`read:packages`** 权限。
55+
3. **立即保存好您的令牌**,因为关闭页面后您将无法再次查看它。
56+
57+
#### **1.2 配置`.npmrc`**
58+
59+
在您的前端项目根目录下(与`package.json`同级)创建一个名为 `.npmrc` 的文件。这个文件会告诉npm去哪里寻找 `@<您的GitHub用户名>` 作用域下的包。
60+
61+
文件内容如下:
62+
```
63+
@<您的GitHub用户名>:registry=https://npm.pkg.github.com/
64+
```
65+
66+
#### **1.3 登录到GitHub Packages**
67+
68+
打开您的终端,运行以下命令以登录到 GitHub Packages。这将把您的凭证保存在本地,以便将来 `npm install` 时使用。
69+
70+
```bash
71+
npm login --scope=@<您的GitHub用户名> --registry=https://npm.pkg.github.com
72+
```
73+
74+
当提示时,请输入:
75+
* **Username**: 您的GitHub用户名。
76+
* **Password**: 您刚刚创建的 **Personal Access Token (PAT)** (注意,不是您的GitHub密码)。
77+
* **Email**: 您的GitHub账户关联的邮箱。
78+
79+
#### **1.4 安装契约包**
80+
81+
一切准备就绪后,像安装任何其他npm包一样安装后端的类型契约包:
82+
```bash
83+
npm install @<您的GitHub用户名>/basic-web-game-backend-contract@latest
84+
```
85+
`@latest` 标签可以确保您总是获取最新版本的类型定义。
86+
87+
#### **1.5 在代码中使用类型**
88+
89+
现在,您可以在项目的任何地方导入和使用后端定义的类型,享受完整的IDE自动补全和类型检查。
90+
91+
```typescript
92+
// src/services/api.ts
93+
import type { AppRouter } from '@<您的GitHub用户名>/basic-web-game-backend-contract';
94+
import { createTRPCProxyClient, httpBatchLink } from '@trpc/client';
95+
96+
// 这是一个使用tRPC的示例,但类型可以用于任何HTTP客户端
97+
export const trpc = createTRPCProxyClient<AppRouter>({
98+
links: [
99+
httpBatchLink({
100+
url: 'http://localhost:3000', // 您的后端地址
101+
}),
102+
],
103+
});
104+
105+
// 现在您可以安全地调用后端过程
106+
// const user = await trpc.user.get.query({ id: '1' });
107+
// `user` 将拥有完整的类型信息
108+
```
109+
110+
---
111+
112+
### **2. 后端仓库配置(供参考)**
113+
114+
> **注意**:以下是后端仓库 (`Basic-Web-Game-Backend`) 需要进行的配置,以便能够成功发布类型包。作为前端开发人员,您通常不需要执行这些步骤,但了解它们有助于排查问题。
115+
116+
#### **2.1 修改`package.json`**
117+
后端的 `package.json` 需要被配置成一个作用域包,并指向生成的类型文件。
118+
```json
119+
// Backend's package.json
120+
{
121+
"name": "@<您的GitHub用户名>/basic-web-game-backend-contract",
122+
"version": "1.0.0",
123+
"main": "dist/server.js",
124+
"types": "dist/server.d.ts",
125+
"files": [
126+
"dist"
127+
],
128+
"scripts": {
129+
"build": "tsc"
130+
}
131+
}
132+
```
133+
134+
#### **2.2 调整`tsconfig.json`**
135+
后端的 `tsconfig.json` 必须启用 `declaration` 选项来生成 `.d.ts` 类型声明文件。
136+
```json
137+
// Backend's tsconfig.json
138+
{
139+
"compilerOptions": {
140+
"declaration": true,
141+
"outDir": "dist"
142+
}
143+
}
144+
```
145+
146+
#### **2.3 创建GitHub Actions工作流**
147+
后端仓库中会有一个GitHub Actions工作流 (`.github/workflows/publish-contract.yml`),用于在代码推送到 `main` 分支时自动构建和发布npm包。
148+
149+
```yaml
150+
# Backend's .github/workflows/publish-contract.yml
151+
name: Publish API Contract to GitHub Packages
152+
153+
on:
154+
push:
155+
branches: [main]
156+
157+
jobs:
158+
publish:
159+
runs-on: ubuntu-latest
160+
permissions:
161+
contents: read
162+
packages: write
163+
steps:
164+
- uses: actions/checkout@v4
165+
- uses: actions/setup-node@v4
166+
with:
167+
node-version: '18'
168+
registry-url: 'https://npm.pkg.github.com'
169+
scope: '@<您的GitHub用户名>'
170+
- run: npm ci && npm run build
171+
env:
172+
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
173+
- run: npm publish
174+
env:
175+
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
176+
```
177+
178+
---
179+
180+
## **总结**
181+
通过这种方式,前后端团队可以解耦,同时保持类型安全:
182+
1. **后端**:每次推送到`main`分支时,自动发布一个包含最新API类型的新版本包。
183+
2. **前端**:通过更新 `@<您的GitHub用户名>/basic-web-game-backend-contract` 包来获取最新的类型,从而在开发过程中避免许多常见的API集成错误。
184+
185+
这样,即使后端是可选的,一旦决定集成,我们也能拥有一个顺滑且类型安全的工作流。

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"coverage": "vitest run --coverage"
1717
},
1818
"dependencies": {
19+
"@tobenot/basic-web-game-backend-contract": "^1.0.0",
1920
"@types/react-router-dom": "^5.3.3",
2021
"react": "^18.2.0",
2122
"react-dom": "^18.2.0",

0 commit comments

Comments
 (0)