Loading...
Loading...
Compare original and translation side by side
references/alchemy-concepts.mdreferences/alchemy-concepts.mdalchemy create my-app --template vitealchemy create my-app --template vitealchemy initalchemy initalchemy.run.tsalchemy.run.tsimport alchemy from "alchemy";
import { Worker, KVNamespace } from "alchemy/cloudflare";
const app = await alchemy("my-app");
const kv = await KVNamespace("cache", { title: "my-cache" });
const worker = await Worker("api", {
entrypoint: "./src/worker.ts",
bindings: {
CACHE: kv,
API_KEY: alchemy.secret(process.env.API_KEY),
STAGE: app.stage,
},
});
await app.finalize();import alchemy from "alchemy";
import { Worker, KVNamespace } from "alchemy/cloudflare";
const app = await alchemy("my-app");
const kv = await KVNamespace("cache", { title: "my-cache" });
const worker = await Worker("api", {
entrypoint: "./src/worker.ts",
bindings: {
CACHE: kv,
API_KEY: alchemy.secret(process.env.API_KEY),
STAGE: app.stage,
},
});
await app.finalize();alchemy deploy # deploy (default stage = $USER)
alchemy deploy --stage prod # deploy to prod
alchemy dev # local dev with hot reload
alchemy destroy # tear down all resourcesalchemy deploy # 部署(默认环境 = $USER)
alchemy deploy --stage prod # 部署到生产环境
alchemy dev # 本地开发(支持热重载)
alchemy destroy # 销毁所有资源| User Request | What to Do |
|---|---|
| Set up Alchemy in a project | Use |
| Add a Worker | |
| Add a database/KV/R2/queue | Import from |
| Use secrets | |
| Set up dev mode | |
| Use a framework (Vite/Astro/etc.) | Load |
| Deploy to production | |
| Use Neon/Stripe/AWS/other provider | Load |
| Build a custom resource | Load |
| Build a new provider for Alchemy | Run the full Provider Development Workflow below |
| 用户请求 | 操作指引 |
|---|---|
| 在项目中搭建Alchemy | 使用 |
| 添加Worker | 从 |
| 添加数据库/KV/R2/队列 | 从 |
| 使用密钥 | 输入时使用 |
| 设置开发模式 | 使用 |
| 使用框架(Vite/Astro等) | 加载 |
| 部署到生产环境 | 使用 |
| 使用Neon/Stripe/AWS或其他提供商 | 加载 |
| 构建自定义资源 | 加载 |
| 为Alchemy构建新提供商 | 遵循以下完整的提供商开发工作流 |
const db = await D1Database("my-db", { name: "my-db" });const db = await D1Database("my-db", { name: "my-db" });const worker = await Worker("api", {
entrypoint: "./src/worker.ts",
bindings: { DB: db, KV: kv, SECRET: alchemy.secret("value") },
});import type { worker } from "../alchemy.run";
export default {
async fetch(req: Request, env: typeof worker.Env) {
await env.DB.prepare("SELECT 1").run();
},
};const worker = await Worker("api", {
entrypoint: "./src/worker.ts",
bindings: { DB: db, KV: kv, SECRET: alchemy.secret("value") },
});import type { worker } from "../alchemy.run";
export default {
async fetch(req: Request, env: typeof worker.Env) {
await env.DB.prepare("SELECT 1").run();
},
};alchemy.secret(process.env.API_KEY) // wrap a value
alchemy.secret.env.API_KEY // shorthandalchemy.secret(process.env.API_KEY) // 包装值
alchemy.secret.env.API_KEY // 简写方式$USERalchemy deploy # deploys to $USER stage
alchemy deploy --stage prod # deploys to prod stage$USERalchemy deploy # 部署到$USER环境
alchemy deploy --stage prod # 部署到生产环境alchemy devalchemy dev| Framework | Resource | Plugin/Adapter |
|---|---|---|
| Vite | | |
| Astro | | |
| React Router | | |
| SvelteKit | | |
| Nuxt | | |
| TanStack Start | | |
| BunSPA | | (no plugin needed) |
| Next.js | | |
| Redwood (RWSDK) | | |
| 框架 | 资源 | 插件/适配器 |
|---|---|---|
| Vite | | |
| Astro | | |
| React Router | | |
| SvelteKit | | |
| Nuxt | | |
| TanStack Start | | |
| BunSPA | | (无需插件) |
| Next.js | | |
| Redwood (RWSDK) | | |
| Provider | Import | Key Resources |
|---|---|---|
| Cloudflare | | Worker, D1Database, KVNamespace, R2Bucket, Queue, DurableObjectNamespace, Hyperdrive, Zone, DnsRecords |
| Neon | | NeonProject, NeonBranch, NeonDatabase, NeonRole |
| Stripe | | WebhookEndpoint, Price, Product, Coupon, and 10+ more |
| AWS | | Function, Table, Vpc, Subnet, SecurityGroup, Bucket, Role |
| AWS Control | | |
| GitHub | | GitHubSecret |
| Vercel | | VercelProject, VercelDnsRecord, VercelDeployment |
| 提供商 | 导入路径 | 核心资源 |
|---|---|---|
| Cloudflare | | Worker、D1Database、KVNamespace、R2Bucket、Queue、DurableObjectNamespace、Hyperdrive、Zone、DnsRecords |
| Neon | | NeonProject、NeonBranch、NeonDatabase、NeonRole |
| Stripe | | WebhookEndpoint、Price、Product、Coupon及10+其他资源 |
| AWS | | Function、Table、Vpc、Subnet、SecurityGroup、Bucket、Role |
| AWS Control | | |
| GitHub | | GitHubSecret |
| Vercel | | VercelProject、VercelDnsRecord、VercelDeployment |
import alchemy from "alchemy"import { Worker } from "alchemy/cloudflare"await app.finalize()alchemy.run.ts$USER--stage prodalchemy.secret().alchemy/.gitignoreimport alchemy from "alchemy"import { Worker } from "alchemy/cloudflare"await app.finalize()alchemy.run.ts$USER--stage prodalchemy.secret().alchemy/.gitignorereferences/alchemy-concepts.mdreferences/resource-patterns.mdreferences/test-patterns.mdreferences/doc-patterns.mdreferences/checklist.mdreferences/alchemy-concepts.mdreferences/resource-patterns.mdreferences/test-patterns.mdreferences/doc-patterns.mdreferences/checklist.mdalchemy/src/{provider}/api.tsalchemy/src/{provider}/api.tsreferences/resource-patterns.mdResource("{provider}::{Resource}", ...)props.name ?? this.output?.name ?? this.scope.createPhysicalName(id)functionthisis{Resource}references/resource-patterns.mdResource("{provider}::{Resource}", ...)props.name ?? this.output?.name ?? this.scope.createPhysicalName(id)functionthisis{Resource}references/test-patterns.mdalchemy.test(import.meta, { prefix: BRANCH_PREFIX })destroy(scope)references/test-patterns.mdalchemy.test(import.meta, { prefix: BRANCH_PREFIX })destroy(scope)references/doc-patterns.mdalchemy-web/src/content/docs/providers/{provider}/{resource}.mdalchemy-web/src/content/docs/guides/{provider}.mdxexamples/{provider}/alchemy.run.tsreferences/doc-patterns.mdalchemy-web/src/content/docs/providers/{provider}/{resource}.mdalchemy-web/src/content/docs/guides/{provider}.mdxexamples/{provider}/alchemy.run.tsreferences/checklist.mdbun formatbun vitest alchemy/test/{provider}/bun tsc -breferences/checklist.mdbun formatbun vitest alchemy/test/{provider}/bun tsc -b