@ alxia/ 创建
开始一个 阿尔克夏 在一个命令中应用: a 尝试 alxia 的最小一个, 一个使用 Zod 写 OpenAPI spec first, a GraphQL API 先写出计划, 或反应路由器的官方模板 由艾克夏负责.
bun create @alxia my-app
bun create @alxia 运行此软件包的文件夹, 如 bun create <name> 运行
create-<name> 财务报告和审定财务报表 bun create @scope 运行 @scope/create它要求
未给出的, 写入项目, 安装并打印下一个
步骤 :
cd my-app
bun dev
它需要1.4.2号或以后, 而它写的项目正在运行.
模板
bun create @alxia my-app --template minimal # the template to try alxia with
bun create @alxia my-api --template api
bun create @alxia my-graph --template graphql
bun create @alxia my-site --template react-router
minimal 首先是:一个文件,一个依赖,一个测试,以及
bun dev 30秒后回复.
| 模板 | 它写的是什么 |
|---|---|
minimal | 最小的 alxia 应用 : src/index.ts 出口 app = alxia().get("/", …) 并倾听 PORT 只有输入文件, src/index.spec.ts 给它打电话 app.request()· ; bun dev (单位:千美元)NODE_ENV=development bun --hot, (中文(简体) ), build, (中文(简体) ), start, (中文(简体) ), typecheck严格 tsconfig.json,Biome和 verify (单位:千美元)check:ci, (中文(简体) ), typecheck,则 test页:1 Dockerfile 运行中 oven/bun:1-alpine, (中文(简体) ), .dockerignore, (中文(简体) ), .gitignore, (中文(简体) ), .vscode/ 和读取。 一个依赖, @alxia/core: 没有 OpenAPI, 没有代码生成, 没有校验器, 没有 env 文件 |
api | a 一个 @alxia/core 应用与 Zod, OpenAPI 光谱 : openapi.yaml 声明 GET /todos, (中文(简体) ), POST /todos 财务报告和审定财务报表 GET /todos/{id}· ; bun run generate 写入 src/generated/ 从它与 @nxgt/openapi-codegen (单位:千美元)openapi-codegen.config.ts),承诺,所以安装或建造时没有产生任何物; src/env.ts 读取 PORT, (中文(简体) ), API_KEY, (中文(简体) ), API_DOCS 和可选 TRUSTED_PROXIES (CIDR范围,增加 trustProxy({ trusted, untrusted: "refuse" }) 返回基数时: ctx.ip 来自信任的代理 X-Forwarded-For,一个来自任何其它拒绝连接,健康探测器未触及的转发信头) defineEnv 从 @alxia/env, (中文(简体) ), API_KEY 秘密默认为 dev-key 下级 NODE_ENV development 财务报告和审定财务报表 test 单独一人,其他任何地方都需要; src/context.ts 守住航道的基地, alxia({ errors: "problem" }) 所以Alxia自己的错误是 RFC 9457问题,因为 openapi.yaml 申报,并登记 @alxia/core是因为 Register· ; src/routes/todos.ts时 defineRoutes(),读取上下文,但不导入应用程序,并将每个操作与 route(operation, …middlewares, handler),作为 route(operations.createTodo, requireKey, handler)时 requireKey时 defineMiddleware,在没有API密钥的情况下回答401,操作的策略验证请求并检查处理者的答复; src/app.ts 挂载 health() (单位:千美元)GET /health, (中文(简体) ), GET /ready, (中文(简体) ), apiDocs 从 @alxia/openapi (在 /docs从 openapi.yaml 输入到捆绑中; 正在开发中, 否则 API_DOCS=true和基地上的路线;a bun test 斯凯, src/proxy.spec.ts,在后面建立基地 TRUSTED_PROXIES 和电话 app.fetch 与同伴, src/env.spec.ts,检查一个畸形 TRUSTED_PROXIES 停止应用,一个 bun test 通过输入调用应用程序的光谱 @nxgt/openapi-httpyz 客户端在生成时 operations.ts页:1 fetch 状态 app.fetch (正在处理中,没有服务器;答复的状态缩小),保留一个 app.request() 检验和断言 matchesSpec 从 @alxia/openapi:每个行动都有它的路线,以及 strict: true 在光谱以外的路线上也失败; bun dev (单位:千美元)NODE_ENV=development变化重新开始, typecheck, (中文(简体) ), build严格 tsconfig.json生物群落biome.json, (中文(简体) ), lint, (中文(简体) ), format, (中文(简体) ), check, (中文(简体) ), check:ci, (中文(简体) ), verify,从 generate --check页:1 Dockerfile 运行中 oven/bun:1-alpine, (中文(简体) ), .dockerignore, (中文(简体) ), .gitignore, (中文(简体) ), .env.example, (中文(简体) ), .vscode/ 和读取. @alxia/openapi 属属; @nxgt/httpyz, (中文(简体) ), @nxgt/openapi-httpyz 财务报告和审定财务报表 @nxgt/openapi-codegen 是依赖关系 |
graphql | a 图QL API 与 图QL 瑜伽 结束 @alxia/graphql,首先计划: schema.graphql 合同( 日期)Query, (中文(简体) ), Mutation, (中文(简体) ), Subscription(三); bun run generate 写入 src/generated/resolvers.ts 从它与 GraphQL 代码生成器 (单位:千美元)codegen.ts),执业,打字 Resolvers 应用的上下文; src/context.ts 拥有基地 viewerOf,中间软件读取 Authorization: Bearer <token> 因此,每个解析器读取一个键 viewer· ; src/loaders.ts, (中文(简体) ), createLoaders(),则 数据记录器一项请求的 s , 由 context 选项 graphql() 内 src/app.ts 这样 Note.author 将笔记列表的作者装入一个批次(findUsers而不是每次打一通电话; src/resolvers.ts· ; src/schema.ts 财务报告和审定财务报表 src/app.ts 正在安装 health() 财务报告和审定财务报表 graphql(app, { schema, context }),只用克图QL; src/env.ts (单位:千美元)PORT 选项 TRUSTED_PROXIES,作为 api与 defineEnv· ; src/store.ts在记忆中,与酒吧/潜水员 noteAdded 订阅(服务器发送事件);a bun test 发送到 /graphql 结束 app.request(), (中文(简体) ), src/proxy.spec.ts, 后面的基数 TRUSTED_PROXIES,以及 src/env.spec.ts一个畸形的人拒绝了, Dockerfile,Biome和 .vscode/ 作为 api, (中文(简体) ), verify 从开始 generate --check,则a .env.example。 。 。 . @alxia/graphql, (中文(简体) ), @alxia/env, (中文(简体) ), dataloader, (中文(简体) ), graphql 财务报告和审定财务报表 graphql-yoga 是依赖关系; 代码生成器是一个 dev依赖关系 |
react-router | 反应路由器的官方模板, 如 create-react-router 写入、 装入此包并复制, 并带有 @alxia/react-router 校对:Soup alxia() 内 vite.config.ts插件 :, dev 下级 NODE_ENV=development, (中文(简体) ), start 运行 NODE_ENV=production bun build/server/index.js页:1 bunfig.toml 启动 Bun, a 上的路由器 CLI Dockerfile 运行中 oven/bun:1-alpine 代替路由器的节点之一,Biome作为 api 项目有它,脚手架 由它格式化一次。 没有服务器文件:默认文件为网页服务; bunx alxia-react-router reveal 写出来自定义 |
心脏 api 工程、其中间软件和绑定到
运行 openapi.yaml (整个文件, 以及如何添加一个操作,
处于 指南:
// src/context.ts, in part: the base, registered
export const base = alxia().decorate({ todos });
declare module "@alxia/core" {
interface Register {
context: typeof base;
}
}
// src/routes/todos.ts, in part: no import of the app
const requireKey = defineMiddleware(({ request, reply }, next) =>
request.headers.get("x-api-key") === env.API_KEY
? next()
: reply(401, { error: "unauthorized" as const }),
);
export const todoRoutes = defineRoutes()
.route(operations.createTodo, requireKey, ({ body, todos, reply }) => {
const todo = { id: todos.length + 1, title: body.title, done: false };
todos.push(todo);
return reply.created(todo);
});
// src/app.ts
export const app = base.plugin(todoRoutes);
operations.createTodo 实值 POST /todos 作为 openapi.yaml 声明:
尸体在操作员面前验证 操作员读取它打字
(a) 处理者的答复与小组的答复核对; requireKey是因为
401是它自己的,按原样发送. 要更改 API,请编辑 openapi.yaml 运行
bun run generate; 绝不编辑 src/generated/。 。 。 .
这个 graphql 项目的心脏,一个计程器和一个解析器读取键入
viewer (通过,有订阅和如何添加一个字段)
指南:
// schema.graphql, in part
// type Mutation { addNote(text: String!): Note! }
// src/context.ts, in part: a middleware, then the resolvers' context
const viewerOf = defineMiddleware(({ request }, next) => {
const token = request.headers.get("authorization")?.match(/^Bearer (.+)$/i)?.[1];
const id = token === undefined ? undefined : db.tokens.get(token);
return next({ viewer: (id === undefined ? undefined : db.users.get(id)) ?? null });
});
export const base = alxia().decorate({ env, db }).use(viewerOf);
export type Context = GraphQLContext<typeof base, { loaders: Loaders }>;
// src/resolvers.ts, in part: `Resolvers` is generated from the schema
export const resolvers: Resolvers = {
Mutation: {
addNote: (_, { text }, { viewer, db }) => {
if (viewer === null) {
throw new GraphQLError("Sign in to add a note", {
extensions: { code: "UNAUTHENTICATED" },
});
}
// …
},
},
Note: {
// The notes of one query load their authors in one batch (N+1 otherwise).
author: (note, _, { loaders }) => loaders.user.load(note.authorId),
},
};
要更改 API,请编辑 schema.graphql 运行 bun run generate从来没有
编辑 src/generated/。 。 。 .
缩写和格式
每艘项目船 生物体,设置方式相同:a
biome.json 拥有Biome推荐的规则、空间和
双引号,导入排序,构建输出(和 .react-router/
或者说 src/generated/(一) 如果项目有它们,则跳过; @biomejs/biome 正如Biome所问的,完全被钉住
.vscode/ 建议其扩展,格式化为保存。 一个新项目
通过 bun run check:ci 没有发现.
| 脚本 | 运行 |
|---|---|
bun run check | biome check --write: 涂料、格式和分类导入, 修正其可能的内容 |
bun run lint | biome lint |
bun run format | biome format --write |
bun run check:ci | biome ci: CI 运行,只读 |
bun run verify | minimal数字 : check:ci, (中文(简体) ), typecheck,则 test· ; api 财务报告和审定财务报表 graphql数字 : generate --check然后这些; react-router数字 : check:ci, (中文(简体) ), typecheck,则 build |
bun run generate | api数字 : nxgt-openapi generate, (中文(简体) ), src/generated/ 从 openapi.yaml· ; graphql数字 : graphql-codegen, (中文(简体) ), src/generated/resolvers.ts 从 schema.graphql; 与 --check,不写,文件呆滞时退出 1 |
cd my-api
bun run verify
check:ci 没有 ci,从 bun ci bun的冷冻锁文件安装,
名称的脚本 ci 将不替换。 这个
指南
有设置和原因.
夹克
每个项目都以成像为基础:
oven/bun:1运行 oven/bun:1-alpine 作为非根 bun 用户, a
图像 大约 130 MB。 每个 Dockerfile
建筑在自己的舞台上, 图像仅保留建筑输出,
没有 node_modules数字 :
minimal数字 :bun run build捆绑src/index.ts输入dist/index.js; 数据 图像持有dist/运行bun --no-install dist/index.js。 。 。 .api数字 :bun run build捆绑src/server.ts及其依存关系dist/server.js, (中文(简体) ),src/generated/包括作为承诺,因此 构建生成无;图像控件dist/运行bun --no-install dist/server.js。 。 。 .graphql数字 :bun run build捆绑src/server.ts,其附属关系和schema.graphql(输入为正文)dist/server.js, (中文(简体) ),src/generated/包括承诺; 图像保存dist/运行bun --no-install dist/server.js,关闭 GraphiQL(NODE_ENV=production,所以alxia的dev开关关闭了).react-router数字 :bun run build,每个依赖build/server/index.js以@alxia/react-router插件; 图像 持有build/运行bun --no-install build/server/index.js。 。 。 .
cd my-api
docker build -t my-api .
docker run -p 3000:3000 -e API_KEY=change-me my-api # API_KEY is required: the app does not start without it
minimal 财务报告和审定财务报表 graphql 运行相同的方式,没有 -e数字 : docker run -p 3000:3000 my-app。 。 。 .
cd my-site
docker build -t my-site .
docker run -p 3000:3000 my-site
提交 bun.lock 那个 bun install 写入: 图像从中安装
与 --frozen-lockfile编辑
指南
有阶段
排除出问题
对于一个不能捆绑的依赖,以及对于一个
仅用于 glibc 的本地添加符, (中文(简体) ),
不载入高山.
选项
| 选项 | |
|---|---|
[dir] | 在哪里写入工程:一个已空出或尚未存在的目录。 未给出时询问 |
--template <name>, (中文(简体) ), -t | minimal, (中文(简体) ), api, (中文(简体) ), graphql 或者说 react-router问到没有给出, minimal 默认 |
--no-install | 写入文件, 跳过 bun install |
--help, (中文(简体) ), -h | 用途 |
都这样 dir 财务报告和审定财务报表 --template它不问什么,所以它运行 在剧本
(原始内容存档于2018-03-26). 或CI.
版本数
- alxia 的软件包 —— 说
@alxia/core, (中文(简体) ),@alxia/env(单位:千美元)api, (中文(简体) ),graphql, (中文(简体) ),@alxia/openapi(单位:千美元)api, (中文(简体) ),@alxia/graphql(单位:千美元)graphql和@alxia/react-router(单位:千美元)react-router——移至登记处最新版本 在此范围内释放@alxia/create发表于:^0.3.1写入^0.3.4一次出0.3.4,从不^0.4.0之后 虽然登记册尚未为该版本服务,但最新版本 同一未成年人被写作(^0.3.0一旦到达,则需要0.3.1, 输出是这么说的.bunx @alxia/create@<version>选择旧的套装. - 其他的都一样 — Zod, TypeScript, Vite, React, React 路由器, GraphQL,
尾风——当项目完成时被移动到登记册的最新版本
写入, 在范围 alxia 包接受: TypeScript 内
^6.0.3 || ^7.0.0内部^7.0.0 || ^8.0.0,反应路由器及其 软件包内部^8.0.0,在^4.2.0, (中文(简体) ),graphql在内部^16.11.0 || ^17.0.0财务报告和审定财务报表graphql-yoga在内部^5.16.0; 无 alxia 包件 约束到npm的latest阿尔克萨射程外的一个新主力是 左出,输出说. - 生物体 写得准确,写得准确:
模板的次要,
2.5.15写作2.5.16但从不2.6.0,其新的 规则未检查模板. - 密码生成器 被固定在模版上
版本,从未移动到更新的补丁 :
@nxgt/openapi-codegen(单位:千美元)api, (中文(简体) ),0.11.0)和 GraphQL 代码生成器@graphql-codegen/cli, (中文(简体) ),typescript财务报告和审定财务报表typescript-resolvers(单位:千美元)graphql) (中文(简体) ).bun run verify运行generate --check对所犯src/generated/,该释放 以不同方式写入文件会在新工程中失败 .
登记处就是那个 BUN_CONFIG_REGISTRY 或者说 npm_config_registry
名称,其他npmjs.org;不回答时,模板是自己的
版本保留,并带有警告.
其他软件包管理器
bunx @alxia/create my-app --template minimal
npm create @alxia my-app -- --template minimal
垃圾箱运行在 Bun (#!/usr/bin/env bun以跑者开始,和
它所写的工程 bun install。 。 。 .
API 密码
| 导出 | |
|---|---|
create-alxia | 弹匣 bun create @alxia, (中文(简体) ), bunx @alxia/create 财务报告和审定财务报表 npm create @alxia 运行。 包输出无模块 |
文档
- 指南: 每个模板文件按文件排列, 向操作添加
api工程和一个字段graphql一个,什么react-router模板添加到 React 路由器、 Biome 的设置中Dockerfile,如何选择版本,并在 CI 中运行. - 解决问题:每条消息,命令印出,如何处理.
- 路线图:即将到来的,以及没有计划的.
- 食谱数字 : 五分钟后开始, (中文(简体) ), 光谱第一 CRUD API, (中文(简体) ), 图形QL API, (中文(简体) ), 与 Docker 一起部署。 。 。 .