Expo项目执行yarn start时出现ENOTDIR错误的解决方法
问题描述
按照Yarn官方文档激活Yarn后,通过React Native官方文档用Yarn创建了Expo应用,但执行yarn start时出现以下错误:
node:internal/errors:465
ErrorCaptureStackTrace(err);
^Error: spawn ENOTDIR
at ChildProcess.spawn (node:internal/child_process:413:11)
at Object.spawn (node:child_process:700:9)
at spawn (/Users/minseok/Repository/test/.yarn/cache/cross-spawn-npm-6.0.5-2deab6c280-f893bb0d96.zip/node_modules/cross-spawn/index.js:12:24)
at run (/Users/minseok/Repository/test/.yarn/unplugged/expo-npm-46.0.10-310b54dc3f/node_modules/expo/bin/cli.js:11:12)
at Object.<anonymous> (/Users/minseok/Repository/test/.yarn/unplugged/expo-npm-46.0.10-310b54dc3f/node_modules/expo/bin/cli.js:6:1)
at Module._compile (node:internal/modules/cjs/loader:1105:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
at Object.require$$0.Module._extensions..js (/Users/minseok/Repository/test/.pnp.cjs:20807:33)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.require$$0.Module._load (/Users/minseok/Repository/test/.pnp.cjs:20630:22) {
errno: -20,
code: 'ENOTDIR',
syscall: 'spawn'
}
解决方案
这个ENOTDIR错误通常是系统尝试在非目录路径执行文件,或Yarn的PnP机制与Expo CLI兼容性冲突导致的,可尝试以下几种解决方法:
禁用Yarn PnP模式
在项目根目录创建.yarnrc.yml文件,添加内容:nodeLinker: node-modules删除项目下的
.pnp.cjs、.pnp.loader.mjs文件,重新执行yarn install后再运行yarn start。匹配兼容的Node.js版本
Expo 46建议使用Node.js 14.x或16.x版本,版本过高/过低易引发兼容问题。可通过nvm切换版本:nvm install 16 nvm use 16重新执行
yarn install和yarn start。清理缓存并重建依赖
- 删除项目内的
node_modules目录、.yarn文件夹和yarn.lock文件 - 执行
yarn cache clean清理Yarn缓存 - 重新运行
yarn install - 启动项目:
yarn start
- 删除项目内的
直接调用Expo CLI启动
跳过Yarn的包裹逻辑,直接执行Expo的CLI脚本:node node_modules/expo/bin/cli.js start
内容的提问来源于stack exchange,提问作者minseokk

