我们有一个现有的React Native项目(版本0.22.2),我正在尝试在某些文件上设置Flow类型检查器(版本0.23)。但是,Flow给出了很多错误 require()
我们正在使用的电话 <Image>
源。例如,我们在Header.js的一个组件中有这个代码:
<Image source={require('./images/nav.png')} style={styles.navIcon} />
哪个React Native处理得很好而且有效。然而,Flow似乎正试图对待 require()
作为常规模块需要而不是找到它,并给出如下错误:
Header.js:30
30: <Image source={require('./images/nav.png')} style={styles.navIcon} />
^^^^^^^^^^^^^^^^^^^^^^^^^^^ ./images/nav.png. Required module not found
如何告诉Flow停止提供这些错误?我试过添加 .*/images/.*
到了 [ignore]
我的部分 .flowconfig
,但这不会改变任何事情。
你可以使用 module.name_mapper.extension
.flowconfig中的选项。例如,
[options]
module.name_mapper.extension= 'png' -> '<PROJECT_ROOT>/ImageSourceStub.js.flow'
它将映射以...结尾的任何模块名称 .png
到了 ImageSourceStub
模块,好像不是写作 require('./foo.png')
你写过 require('./path/to/root/ImageSourceStub')
。
在 ImageSourceStub.js.flow
你可以做
const stub = {
uri: 'stub.png'
};
export default stub; // or module.exports = stub;
所以Flow知道这一点 require('*.png')
返回一个 {uri: string}
。
另见 高级配置 文档。
我没有一个真正的答案,除了说React Native的流量今天看起来真的很狡猾,如果流程根本不支持这种用法,我也不会感到惊讶,但我很想完全惊讶!
就个人而言,作为解决方法,我只需添加更高级别的组件并忽略该文件中的流错误。
// Picture.js
// (No @flow tag at top of file)
const Picture = ({ source }) => (
<Image source={require(source)} />
)
然后用 <Picture source="my/path/pic.jpg" />
代替。
有同样的问题,对于JPG文件,用这个.flowconfig解决了
module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub'
module.name_mapper='^[./a-zA-Z0-9$_-]+\.png$' -> 'RelativeImageStub'
module.name_mapper='^[./a-zA-Z0-9$_-]+\.jpg$' -> 'RelativeImageStub'