我对 Expo 和 React-Native 的机制以及它们如何下载资产感到困惑。
我知道的信息是,一旦你构建了你的代码,expo 就会准备一个包含 javascript(编译代码)和资产的包。
在调试会话期间,该捆绑包(作为一个整体)首先由 expo 客户端下载,然后启动应用程序。这意味着一旦应用程序启动,代码中“导入”的所有资产都应该到位。
另一方面,当我运行以下原子测试代码时,情况完全相反。加载这些资产需要时间,就好像它们是“延迟加载”一样。
所以我的问题是;是行为开发模式相关还是在生产模式下下载图像仍然需要时间?
- 如果生产模式的行为相同,那么它将从哪里下载资产?
- 如果生产模式与开发模式不同,为什么开发模式的行为会有所不同?
import * as React from 'react';
import { Text, View, StyleSheet, Image, Button } from 'react-native';
import Test0Img from './assets/test0.gif';
import Test1Img from './assets/test1.gif';
export default class App extends React.Component {
constructor() {
super();
this.state = {
imageIndex: 0,
};
}
render() {
return (
<View style={styles.container}>
<Text></Text>
<Text></Text>
<Button
onPress={() => {
let l_newImageIndex = (this.state.imageIndex + 1) % 2;
this.setState({ imageIndex: l_newImageIndex });
}}
title="Click to Change Image"
/>
<Image
source={this.state.imageIndex === 1 ? Test0Img : Test1Img}
style={{
width: '100%',
height: '100%',
resizeMode: 'contain',
}}
/>
</View>
);
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
backgroundColor: '#ecf0f1',
padding: 8,
},
});
代码可以看这个零食:https ://snack.expo.io/@mehmetkaplan/assetdownloadtest
如果您在手机中运行此代码,您很可能会发现动画 gif 不会轻易更改。但是如果你通过网络运行它,它会更快地改变。
世博会文件在这里说:
对于保存到本地文件系统的图像,使用 Asset.fromModule(image).downloadAsync() 下载并缓存图像。还有一个 loadAsync() 辅助方法来缓存一批资产。
这也与上面的问题有关,如果图像在本地文件系统中,为什么我们需要缓存它?
世博会论坛也添加了相同的问题,可以在此处看到。将两者联系起来,以便未来的访问者可以找到任何可能的答案。