在React Native/Expo中配置Vitest时遇到Rollup解析错误:Expected 'from', got 'typeof'
在React Native/Expo中配置Vitest时遇到Rollup解析错误:Expected 'from', got 'typeof'
看起来你碰到的是Vitest底层的Rollup没法识别React Native里遗留的Flow类型语法问题——那些import typeof是Flow特有的写法,Rollup默认不支持这种语法,所以才会抛出解析错误。下面给你几个实用的解决步骤:
1. 用@rollup/plugin-flow处理Flow语法
首先得给Rollup加个能解析Flow语法的插件,把那些特殊的import typeof转换成常规代码:
- 先安装依赖:
npm install --save-dev @rollup/plugin-flow
- 然后修改你的
vite.config.mts,把这个插件加到配置里:
import { defineConfig } from 'vite'; import tsconfigPaths from 'vite-tsconfig-paths'; import flow from '@rollup/plugin-flow'; export default defineConfig({ plugins: [ // 要先处理Flow语法,再执行其他插件 flow({ all: true }), tsconfigPaths() ], });
2. 配置Vitest的React Native测试环境(推荐)
因为你是在Expo项目里跑Vitest,直接用原生模块可能会有更多环境适配问题,建议引入专门的React Native测试插件:
- 安装依赖:
npm install --save-dev @vitest/react-native
- 更新
vite.config.mts的测试配置:
import { defineConfig } from 'vite'; import tsconfigPaths from 'vite-tsconfig-paths'; import flow from '@rollup/plugin-flow'; import reactNative from '@vitest/react-native'; export default defineConfig({ plugins: [ flow({ all: true }), tsconfigPaths(), reactNative() ], test: { environment: 'react-native', }, });
3. 优化你的测试代码(可选)
如果不想依赖原生模块的真实实现,也可以手动模拟expo-linking的方法,让测试更轻量化:
import { describe, test, expect, vi } from 'vitest'; import * as Linking from 'expo-linking'; // 手动模拟parse方法的返回值 vi.spyOn(Linking, 'parse').mockReturnValue({ hostname: null, path: '/path', queryParams: {} }); describe('deep-link-redirection', () => { test('deep-link', () => { const result = Linking.parse('scheme://path'); expect(result.path).toBe('/path'); }); });
补充说明
React Native的核心模块里大量使用Flow的import typeof来声明类型,但Vite默认的Rollup配置没有处理这种语法,所以必须通过@rollup/plugin-flow做转换。而@vitest/react-native能帮你模拟React Native的运行环境,减少后续可能出现的其他兼容问题。
备注:内容来源于stack exchange,提问作者Zorayr
相关产品推荐
相关产品推荐

