Payload 配置

Payload 是一个基于配置、代码优先的 CMS 和应用框架。Payload Config 是 Payload 所有功能的核心,通过简单直观的 API 实现对应用的深度配置。Payload Config 是一个完全类型化的 JavaScript 对象,可以无限扩展。

数据库选择到管理面板的外观,一切都通过 Payload Config 完全控制。你可以在这里定义字段、添加本地化、启用认证、配置访问控制等等。

Payload Config 通常是一个位于项目根目录下的 payload.config.ts 文件:

import { buildConfig } from 'payload'

export default buildConfig({
  // 你的配置写在这里
})

Payload Config 采用强类型设计,直接与 Payload 的 TypeScript 代码库集成。这意味着你的 IDE(如 VSCode)会在编写配置时提供类型提示等有用信息。

提示: Payload Config 的位置可以自定义。更多详情

配置选项

要编写你的 Payload 配置,首先确定你想要使用的 数据库,然后通过 字段 使用 集合全局数据 来定义你的数据结构。

以下是一个最简单的 Payload 配置示例:

import { buildConfig } from 'payload'
import { mongooseAdapter } from '@payloadcms/db-mongodb'

export default buildConfig({
  secret: process.env.PAYLOAD_SECRET,
  db: mongooseAdapter({
    url: process.env.DATABASE_URI,
  }),
  collections: [
    {
      slug: 'pages',
      fields: [
        {
          name: 'title',
          type: 'text',
        },
      ],
    },
  ],
})

注意: 更多复杂示例,请查看 Payload 仓库中的 模板示例 目录。

以下是可用的配置选项:

选项描述
admin管理面板的配置选项,包括自定义组件、实时预览等。更多详情
bin注册 Payload 执行的自定义 bin 脚本。更多详情
editor用于 richText 字段的富文本编辑器。更多详情
db *Payload 使用的数据库适配器。更多详情
serverURL定义应用绝对 URL 的字符串。需包含协议,例如 https://example.com。不允许包含路径,仅允许协议、域名和(可选)端口。
collectionsPayload 管理的集合数组。更多详情
compatibilityPayload 早期版本的兼容性标志。更多详情
globalsPayload 管理的全局数据数组。更多详情
cors跨域资源共享 (CORS) 机制,允许来自指定域的传入请求。你也可以自定义 Access-Control-Allow-Headers 头。更多详情
localization选择将内容翻译为多种语言。更多详情
logger日志选项、带有目标流的日志选项或已实例化的日志记录器实例。更多详情
loggingLevels用于覆盖 Payload 错误日志级别的对象。
graphQL管理 GraphQL 特定功能,包括自定义查询和变更、查询复杂度限制等。更多详情
cookiePrefix将作为前缀添加到 Payload 设置的所有 cookie 的字符串。
csrf允许 Payload 接受 cookie 的 URL 白名单数组。更多详情
defaultDepth如果用户在请求资源时未指定 depth,将使用此深度。更多详情
defaultMaxTextLength应用范围内允许的最大字符串长度。有助于防止恶意的公共文档创建。
folders用于配置全局文件夹设置的可选对象。更多详情
queryPresets用于配置集合查询预设的对象。更多详情
maxDepth应用范围内允许的最大深度。此设置有助于防止恶意查询。默认为 10更多详情
indexSortableFields自动索引数据库中所有可排序的顶级字段,以提高排序性能并为 Azure Cosmos 等数据库添加兼容性。
uploadPayload 上传基础配置。更多详情
routes控制 Payload 绑定的路由结构。更多详情
email配置 Payload 使用的邮件适配器。更多详情
onInit启动后立即调用的函数,接收 Payload 实例作为唯一参数。
debug启用以暴露更详细的错误信息。
telemetry通过传递 false 禁用 Payload 遥测。更多详情
hooks根钩子数组。更多详情
plugins插件数组。更多详情
endpoints添加到 Payload 路由器的自定义端点数组。更多详情
custom用于添加自定义数据(例如插件)的扩展点。
i18n国际化配置。传递你希望管理界面支持的所有 i18n 语言。默认为仅英语。更多详情
secret *Payload 用于任何加密工作流程的安全、不可猜测的字符串 - 例如密码盐/哈希。
sharp如果你希望 Payload 提供裁剪、焦点选择和自动媒体调整大小功能,请安装 Sharp 模块并将其传递给此处的配置。
typescript在此处配置 TypeScript 设置。更多详情

* 星号表示该属性是必填项。

注意: 某些属性会从客户端包中移除。更多 详情

TypeScript 配置

Payload 提供了多种 TypeScript 设置供你使用。这些设置用于为你的 CollectionsGlobals 自动生成 TypeScript 接口,并确保 Payload 在所有 Local API 方法中使用你的 Generated Types

要自定义 TypeScript 设置,请在 Payload Config 中使用 typescript 属性:

import { buildConfig } from 'payload'

export default buildConfig({
  // ...
  typescript: {
    // highlight-line
    // ...
  },
})

以下是可用的配置选项:

OptionDescription
autoGenerate默认情况下,Payload 会为配置中定义的所有 collections 和 globals 自动生成 TypeScript 接口。通过设置 typescript.autoGenerate: false 可以禁用此功能。更多详情
declare默认情况下,Payload 会在生成的类型中添加 declare 块,确保 Payload 在所有 Local API 方法中使用你生成的类型。通过设置 typescript.declare: false 可以禁用此功能。
outputFile通过定义 typescript.outputFile 属性为一个完整的绝对路径,可以控制 Payload 自动生成类型的输出路径和文件名。

配置文件位置

对于 Payload 命令行脚本,我们需要能够定位到你的 Payload 配置文件。默认情况下,我们会在以下位置检查是否存在 payload.config.ts

  1. 当前工作目录的根目录
  2. tsconfig 中的 compilerOptions 设置*
  3. dist 目录*

* 开发环境和生产环境下的配置文件位置检测方式不同。详情见下文。

重要提示: 确保你的 tsconfig.json 已正确配置,以便 Payload 能自动检测配置文件位置。如果该文件不存在,或未指定正确的 compilerOptions,Payload 将默认使用当前工作目录。

开发模式

在开发模式下,如果在根目录未找到配置文件,Payload 会尝试读取你的 tsconfig.json,并尝试在 rootDir 指定的目录中查找配置文件:

{
  // ...
  // highlight-start
  "compilerOptions": {
    "rootDir": "src"
  }
  // highlight-end
}

生产模式

在生产模式下,Payload 会首先尝试在 tsconfig.jsonoutDir 目录中查找配置文件,如果未找到,则会回退到 rootDir 指定的目录:

{
  // ...
  // highlight-start
  "compilerOptions": {
    "outDir": "dist",
    "rootDir": "src"
  }
  // highlight-end
}

如果以上位置都未找到配置文件,Payload 最后会检查 dist 目录。

自定义配置文件位置

除了上述自动检测机制外,你还可以为 Payload 配置文件指定自定义位置。这在配置文件不在标准位置,或者你需要在多个配置之间切换时非常有用。为此,Payload 提供了一个环境变量来绕过所有自动配置检测。

要使用自定义配置文件位置,请设置 PAYLOAD_CONFIG_PATH 环境变量:

{
  "scripts": {
    "payload": "PAYLOAD_CONFIG_PATH=/path/to/custom-config.ts payload"
  }
}

提示: PAYLOAD_CONFIG_PATH 既可以是绝对路径,也可以是相对于当前工作目录的路径。

遥测数据

Payload 会收集完全匿名的通用使用情况遥测数据。这些数据对我们非常重要,能帮助我们准确了解增长情况,并指导我们如何将软件发展得更好。收集的遥测数据还能帮助我们准确展示增长趋势,这对我们寻求投资以建设和扩展团队至关重要。如果我们能准确展示增长情况,就能更有效地继续将 Payload 作为免费开源软件进行维护。要禁用遥测功能,你可以在 Payload 配置中设置 telemetry: false

有关我们跟踪内容的更多信息,请查看我们的隐私政策

跨域资源共享 (CORS)

跨域资源共享 (CORS) 可以通过以下方式配置:使用允许发起 CORS 请求的 URL 白名单数组、接受来自任何域的请求的通配符字符串 (*),或者包含以下属性的对象:

选项描述
origins可以是允许发起 CORS 请求的 URL 白名单数组,或者是接受来自任何域的请求的通配符字符串 ('*')。
headers将被附加到 Access-Control-Allow-Headers 中的允许头列表。

以下示例展示如何允许来自任何域的请求:

import { buildConfig } from 'payload'

export default buildConfig({
  // ...
  cors: '*', // highlight-line
})

以下示例展示如何在 Access-Control-Allow-Headers 中附加新头 (x-custom-header):

import { buildConfig } from 'payload'

export default buildConfig({
  // ...
  // highlight-start
  cors: {
    origins: ['http://localhost:3000'],
    headers: ['x-custom-header'],
  },
  // highlight-end
})

TypeScript

你可以从 Payload 导入类型,以便更轻松地编写配置并确保类型安全。有两个主要类型代表 Payload 配置:ConfigSanitizedConfig

Config 类型代表完整形式的原始 Payload 配置。只有最基本的属性被标记为必需。SanitizedConfig 类型代表经过完全清理后的 Payload 配置。通常,这仅在 Payload 内部使用。

import type { Config, SanitizedConfig } from 'payload'

服务端 vs 客户端

Payload Config 仅存在于服务端,不允许包含任何客户端代码。这样,你可以在任何服务器环境或独立脚本中加载 Payload Config,而无需使用 Bundlers 或 Node.js 加载器来处理仅客户端模块(例如 scss 文件或 React 组件),且不会出现任何错误。

在幕后,基于 Next.js 的管理面板会生成一个 ClientConfig,它会剥离所有仅限服务端的代码,并用 React 组件丰富配置。

兼容性标志

Payload Config 可以接受兼容性标志,以便在较旧数据库上运行最新版本。你应该仅在需要时使用这些标志,并在启用前确认确实需要它们。

allowLocalizedWithinLocalized

Payload 的本地化功能是按字段逐个实现的。由于你可以在其他字段中嵌套字段,理论上可以将本地化字段嵌套在另一个本地化字段中——但这将是冗余且不必要的。考虑到从父字段开始的整个数据结构都将被本地化,没有理由在已本地化的父字段内再定义本地化字段。

默认情况下,如果父字段已本地化,Payload 会从子字段中移除 localized: true 属性。仅当你有一个来自 3.0 版本之前的现有 Payload MongoDB 数据库,并且希望保留嵌套的本地化字段而不进行迁移时,才将此兼容性标志设置为 true

自定义 bin 脚本

通过 bin 配置属性,你可以向 npx payload 注入自定义脚本。以 pnpm payload seed 为例:

第一步:在与 payload.config.ts 相同的目录下创建 seed.ts 文件,内容如下:

import type { SanitizedConfig } from 'payload'

import payload from 'payload'

// 脚本必须导出一个名为 "script" 的函数,该函数接受 sanitized config
export const script = async (config: SanitizedConfig) => {
  await payload.init({ config })
  await payload.create({
    collection: 'pages',
    data: { title: 'my title' },
  })
  payload.logger.info('成功完成数据播种!')
  process.exit(0)
}

第二步:将 seed 脚本添加到 bin 配置中:

export default buildConfig({
  bin: [
    {
      scriptPath: path.resolve(dirname, 'seed.ts'),
      key: 'seed',
    },
  ],
})

现在你可以通过以下命令运行该脚本:

pnpm payload seed