通过应用程序配置进行配置

编辑

了解 app.json/app.config.js/app.config.ts 文件的作用,以及如何动态自定义和使用它们。


应用程序配置 (app.json, app.config.js, app.config.ts) 用于配置 Expo Prebuild 生成、项目在 Expo Go 中的加载方式,以及 OTA 更新清单。

它必须位于项目的根目录,与 package.json 在同一目录下。以下是一个最小示例:

app.json
{ "name": "My app", "slug": "my-app" }

如果您的 Expo 配置有一个顶层 expo: {} 对象,则将使用此对象替代根对象,所有其他键将被忽略。

应用配置模式参考

探索应用配置文件(app.json/app.config.js)的完整架构。

属性

应用程序配置配置了许多内容,例如应用程序名称、图标、启动画面、深度链接方案、用于某些服务的 API 密钥等。有关可用属性的完整列表,请参见 app.json/app.config.js/app.config.ts 参考

您使用 Visual Studio Code 吗?如果是,我们建议您安装 Expo Tools 扩展,以便在 app.json 文件中获得属性的自动补全。

在您的应用程序中读取配置值

应用配置中的大多数配置可以在运行时通过您的 JavaScript 代码访问,使用 Constants.expoConfig。您不应在应用配置中包含任何敏感信息(有一些例外,具体字段将在下面说明)。

您可以通过运行 npx expo config --type public 来验证哪些配置将嵌入到您的构建/更新中并在运行时可用。

哪些字段会被过滤出公共应用程序配置?

以下字段已从公共应用配置中过滤(并且无法通过 Constants.expoConfig 对象访问):

您还应该避免在 JavaScript 代码中直接导入 app.jsonapp.config.js,因为这将导入整个文件,而不是其处理后的版本。相反,请使用 Constants.expoConfig 来访问配置。

扩展配置

库作者可以通过使用 Expo 配置插件 来扩展应用程序配置。

配置插件主要用于配置 npx expo prebuild 命令。

动态配置

为了更好的自定义,您可以使用 JavaScript (app.config.js) 或 TypeScript (app.config.ts)。这些配置具有以下属性:

  • 注释、变量和单引号。
  • 不支持 ESM 导入语法(import 关键字),除非使用 TypeScript 和 tsx。与您当前版本的 Node.js 兼容的 JS 文件可以使用 require() 导入。
  • TypeScript 支持空值合并和可选链。
  • 每当 Metro 打包器重新加载时更新。
  • 向您的应用提供环境信息。
  • 不支持 Promises。

例如,您可以导出一个对象来定义您的自定义配置:

app.config.js
const myValue = 'My App'; module.exports = { name: myValue, version: process.env.MY_CUSTOM_PROJECT_VERSION || '1.0.0', // All values in extra will be passed to your app. extra: { fact: 'kittens are cool', }, };

"extra" 允许将任意配置数据传递给您的应用。此键的值可以使用 expo-constants 访问:

App.js
import Constants from 'expo-constants'; Constants.expoConfig.extra.fact === 'kittens are cool';

您可以通过导出一个返回对象的函数来访问和修改传入的配置值。如果您的项目还有一个 app.json,这将非常有用。默认情况下,Expo CLI 将首先读取 app.json 并将标准化的结果发送到 app.config.js

例如,您的 app.json 可能看起来像这样:

app.json
{ "name": "My App" }

在你的 app.config.js 中,你可以在导出函数的参数中找到该配置:

app.config.js
module.exports = ({ config }) => { console.log(config.name); // prints 'My App' return { ...config, }; };

基于环境切换配置

在开发、预发布和生产环境中,通常会有一些不同的配置,或者完全更换配置以进行应用的白标化。为此,您可以使用 app.config.js 以及环境变量。

app.config.js
module.exports = () => { if (process.env.MY_ENVIRONMENT === 'production') { return { /* your production config */ }; } else { return { /* your development config */ }; } };

要使用此配置与 Expo CLI 命令,请为特定命令或在您的 shell 配置文件中设置环境变量。要为特定命令设置环境变量,请在命令前加上变量和值,如下例所示:

Terminal
MY_ENVIRONMENT=production eas update

这并不是 Expo CLI 独有的。在 Windows 上,你可以用以下命令近似实现:

Terminal
npx cross-env MY_ENVIRONMENT=production eas update

或者你可以使用任何你熟悉的环境变量机制。

使用 TypeScript 进行配置:app.config.ts 而不是 app.config.js

您可以在 TypeScript 中使用 Expo 配置的自动完成功能和文档块。创建一个 app.config.ts,内容如下:

app.config.ts
import { ExpoConfig, ConfigContext } from 'expo/config'; export default ({ config }: ConfigContext): ExpoConfig => ({ ...config, slug: 'my-app', name: 'My App', });

要将其他 TypeScript 文件导入到 app.config.ts 或自定义语言特性,我们建议使用 tsxtsx 还允许在任何由 app.config.ts 导入的文件中使用 import 语法。这意味着您可以使用完整的语言特性在 TypeScript 中编写本地 配置插件

配置解析规则

有两种不同类型的配置:静态(app.config.jsonapp.json)和动态(app.config.jsapp.config.ts)。静态配置可以通过 CLI 工具自动更新,而动态配置必须由开发者手动更新。

  1. 如果存在 app.config.json,则读取静态配置(回退到 app.json)。如果没有静态配置,则从 package.json 和你的依赖项中推断默认值。
  2. 如果存在 app.config.tsapp.config.js,则读取动态配置。如果两者都存在,则使用 TypeScript 配置。
  3. 如果动态配置返回一个函数,则静态配置将通过 ({ config }) => ({}) 传递给该函数。这个函数可以修改静态配置的值。可以将其视为静态配置的中间件。
  4. 动态配置的返回值用作最终配置。它不能包含任何 Promise。
  5. 在 Expo 生态系统中的任何工具使用配置之前,所有配置中的函数都会被评估和序列化。配置在托管时必须是 JSON 清单。
  6. 如果最终配置对象具有顶层 expo: {} 对象,则将使用该对象替代根对象,所有其他键将被忽略。

运行 npx expo config 将显示在解析完成后将在 Expo CLI 中使用的最终配置。