资源
了解如何在项目中使用静态资源,包括图片、视频、声音、数据库文件和字体。
静态资源是与应用的二进制文件(原生二进制文件)打包在一起的文件。此文件类型不是包含应用代码的应用 JavaScript 打包包的一部分。常见的静态资源类型包括图片、视频、声音、SQLite 的数据库文件和字体。这些资源可以从你的项目本地提供,也可以通过网络远程提供。
¥A static asset is a file that is bundled with your app's binary (native binary). This file type is not part of your app's JavaScript bundle which contain your app's code. Common types of static assets include images, videos, sounds, database files for SQLite, and fonts. These assets can be served locally from your project or remotely over the network.
本指南介绍了在项目中加载和使用静态资源的不同方式,还提供了有关如何优化和最小化资源的其他信息。
¥This guide covers different ways you can load and use static assets in your project and also provides additional information on how to optimize and minify assets.
在本地提供资源
¥Serve an asset locally
当资源存储在项目的文件系统中时,它可以在构建时嵌入到应用二进制文件中或在运行时加载。你可以使用 require
或 import
语句将其像 JavaScript 模块一样导入。
¥When an asset is stored in your project's file system, it can be embedded in your app binary at build time or loaded at runtime. You can import it like a JavaScript module using require
or import
statements.
例如,要在 App.js 中渲染名为 example.png 的图片,你可以使用 require
从项目的 assets/images 目录导入图片并将其传递给 <Image>
组件:
¥For example, to render an image called example.png in App.js, you can use require
to import the image from the project's assets/images directory and pass it to the <Image>
component:
<Image source={require('./assets/images/example.png')} />
在上面的例子中,打包器读取导入图片的元数据并自动提供宽度和高度。欲了解更多信息,请参阅 静态图片资源。
¥In the above example, the bundler reads the imported image's metadata and automatically provides the width and height. For more information, see Static Image Resources.
expo-image
和 expo-file-system
等库的工作方式与使用本地资源的 <Image>
组件类似。
¥Libraries such as expo-image
and expo-file-system
work similarly to the <Image>
component with local assets.
资源如何在本地提供服务
¥How are assets served locally
在开发过程中,本地存储的资源通过 HTTP 提供服务。它们会在生产应用的构建时自动打包到你的应用二进制文件中,并从设备上的磁盘提供服务。
¥Locally stored assets are served over HTTP in development. They are automatically bundled into your app binary at the build time for production apps and served from disk on a device.
使用 expo-asset
配置在构建时加载资源插件
¥Load an asset at build time with expo-asset
config plugin
注意:
expo-asset
配置插件仅适用于 SDK 51 及更高版本。如果你使用的是较旧的 SDK,则可以加载 使用useAssets
钩子。¥Note: The
expo-asset
config plugin is only available for SDK 51 and above. If you are using an older SDK, you can load a using theuseAssets
hook.
要在构建时加载资源,你可以使用 expo-asset
库中的 配置插件。该插件会将资源文件嵌入到你的原生项目中。
¥To load an asset at build time, you can use the config plugin from the expo-asset
library. This plugin will embed the asset file in your native project.
1
Install the expo-asset
library.
-
npx expo install expo-asset
2
Add the config plugin to your project's app config file. The configuration must contain the path to the asset file using assets
property which takes an array of one or more files or directories to link to the native project.
The path to each asset file must be relative to your project's root since the app config file is located in the project's root directory.
{
"expo": {
"plugins": [
[
"expo-asset",
{
"assets": ["./assets/images/example.png"]
}
]
]
}
}
3
After embedding the asset with the config plugin, create a new development build. Now, you can import and use the asset in your project without using a require
or an import
statement.
For example, the example.png is linked by the above config plugin. You can directly import it into your component and use its resource name as the URI. Note that when rendering assets without using require
, you need to explicitly provide a width / height.
import { Image } from 'expo-image';
%%placeholder-start%%... %%placeholder-end%%
export default function HomeScreen() {
return <Image source={{ uri: 'example' }} style={{ width: 100, height: 100 }} />;
}
Different file formats are supported with theexpo-asset
config plugin. For more information on these formats, see Assets API reference. If you don't see a file format supported by the config plugin, you can use theuseAssets
hook to load the asset at runtime.
Load an asset at runtime with useAssets
hook
The useAssets
hook from expo-asset
library allows loading assets asynchronously. This hook downloads and stores an asset locally and after the asset is loaded, it returns a list of that asset's instances.
1
Install the expo-asset
library.
-
npx expo install expo-asset
2
Import the useAssets
hook from the expo-asset
library in your screen component:
import { useAssets } from 'expo-asset';
export default function HomeScreen() {
const [assets, error] = useAssets([
require('path/to/example-1.jpg'),
require('path/to/example-2.png'),
]);
return assets ? <Image source={assets[0]} /> : null;
}
Serve an asset remotely
When an asset is served remotely, it is not bundled into the app binary at build time. You can use the URL of the asset resource in your project if it is hosted remotely. For example, pass the URL to the <Image>
component to render a remote image:
import { Image } from 'expo-image';
%%placeholder-start%%... %%placeholder-end%%
function App() {
return (
<Image source={{ uri: 'https://example.com/logo.png' }} style={{ width: 50, height: 50 }} />
);
}
There is no guarantee about the availability of images served remotely using a web URL because an internet connection may not be available, or the asset might be removed.
Additionally, loading assets remotely also requires you to provide an asset's metadata. In the above example, since the bundler cannot retrieve the image's width and height, those values are passed explicitly to the <Image>
component. If you don't, the image will default to 0px by 0px.
Additional information
Manual optimization methods
Images
You can compress images using the following:
Some image optimizers are lossless. They re-encode your image to be smaller without any change or loss in the pixels displayed. When you need each pixel to be untouched from the original image, a lossless optimizer and a lossless image format like PNG are a good choice.
Other image optimizers are lossy. The optimized image differs from the original image. Often, lossy optimizers are more efficient because they discard visual information that reduces file size while making the image look nearly identical to humans. Tools like imagemagick
can use comparison algorithms like SSIM to show how similar two images look. It's quite common for an optimized image that is over 95% similar to the original image to be far less than 95% of the original file size.
Other assets
For assets like GIFs or videos, or non-code and non-image assets, it's up to you to optimize and minify those assets.
注意:GIF 是一种非常低效的格式。现代视频编解码器可以生成更小、质量更好的文件。
¥Note: GIFs are a very inefficient format. Modern video codecs can produce significantly smaller file sizes with better quality.
字体
¥Fonts
有关如何向应用添加自定义字体的更多信息,请参阅 添加自定义字体。
¥See Add a custom font for more information on how to add a custom font to your app.