在 Next.js 之外使用 Payload
Payload 可以完全脱离 Next.js 使用,这在运行脚本、在单独的后端服务中使用 Payload,或者在其他前端框架(如 SvelteKit、Remix、Nuxt 等)中直接通过 Payload 的 Local API 从数据库获取数据时非常有用。
注意: Payload 及其所有官方包都是完全基于 ESM 的。如果你想在自己的项目中使用 Payload,请确保以 ESM 格式编写脚本,或者动态导入 Payload 配置。
在 Next.js 之外导入 Payload 配置
Payload 提供了一种便捷的方式来运行独立脚本,这对于诸如数据库种子填充或执行一次性操作等任务非常有用。
在独立脚本中,你可以直接导入 Payload 配置并立即使用。如果需要初始化后的 Payload 实例,可以使用 getPayload
函数。这对于数据库种子填充或执行其他一次性操作等任务非常有用。
import { getPayload } from 'payload'
import config from '@payload-config'
const seed = async () => {
// 通过传入你的配置获取 Payload 本地实例
const payload = await getPayload({ config })
const user = await payload.create({
collection: 'users',
data: {
email: 'dev@payloadcms.com',
password: 'some-password',
},
})
const page = await payload.create({
collection: 'pages',
data: {
title: 'My Homepage',
// 其他需要填充的数据
},
})
}
// 调用函数来运行你的种子脚本
await seed()
然后你可以使用 payload run
命令执行该脚本。例如:如果你将这个独立脚本放在 src/seed.ts
中,可以这样执行:
payload run src/seed.ts
payload run
命令为你做了两件事:
- 它以与 Next.js 相同的方式加载环境变量,无需额外依赖如
dotenv
。不建议使用dotenv
,因为 Next.js 加载环境变量的方式不同。通过使用payload run
,你可以确保 Payload 和 Next.js 设置之间的环境变量处理保持一致。 - 它初始化了 tsx,允许直接执行 TypeScript 文件,无需手动安装 tsx 或 ts-node 等工具。
故障排除
如果遇到导入相关错误,你有两个选择:
选项1:通过在 payload
命令后添加 --use-swc
启用 swc 模式:
示例:
payload run src/seed.ts --use-swc
注意:请先在项目中安装 @swc-node/register。虽然 swc 模式比默认的 tsx 模式更快,但某些导入可能会出现问题。
选项2:使用替代运行时如 bun
虽然我们不保证对替代运行时的支持,但你可以自由使用它们,并通过在 payload
命令后添加 --disable-transpile
标志来禁用 Payload 自身的转译功能:
bunx --bun payload run src/seed.ts --disable-transpile
此方法需要你的系统已安装 bun。