При запуске eas build / npx expo update для Android происходит сбой объединения из-за ошибки, исходящей от expo-router, в которой говорится, что первый аргумент require.context должен быть строкой. Приложение работает в Expo Go, но дает сбой только во время EAS/упаковки. Я попытался добавить expo-router/babel в Babel.config.js (как рекомендовано), но ошибка не устранена.
Пример изображения
https://i.sstatic.net/YjEJVSWx.png
Среда
- ОС: Windows 10/11
- Узел: v24.7.0
- Expo CLI/EAS: использование команд eas (сборка/обновление)
- Expo SDK: 54.0.30
- expo-router: ~6.0.21
- React Native: 0.81.5
- Соответствующие параметры: Metro-react-native-babel-preset ^0.77.0
- npx expo Export:embed --eager --platform android --dev false --reset-cache
- eas build (или eas update)
Код: Выделить всё
Starting Metro Bundler
SyntaxError: node_modules\expo-router\_ctx.android.js: node_modules\expo-router\_ctx.android.js:Invalid call at line 2: process.env.EXPO_ROUTER_APP_ROOT
First argument of `require.context` should be a string denoting the directory to require.
Error: node_modules\expo-router\_ctx.android.js:Invalid call at line 2: process.env.EXPO_ROUTER_APP_ROOT
First argument of `require.context` should be a string denoting the directory to require.
at transformJS ... @expo/metro-config\build\transform-worker\metro-transform-worker.js:337:23
at transformJSWithBabel ... @expo/metro-config\build\transform-worker\metro-transform-worker.js:487:18
- package.json
Код: Выделить всё
"main": "expo-router/entry",
"dependencies": {
"expo": "^54.0.30",
"expo-router": "~6.0.21",
"metro-react-native-babel-preset": "^0.77.0",
...
}
- app.json
Код: Выделить всё
{
"expo": {
"plugins": ["expo-router", ...],
"runtimeVersion": { "policy": "appVersion" },
"updates": { "url": "..." }
...
}
}
- babel.config.js (текущий)
Код: Выделить всё
module.exports = {
presets: ["module:metro-react-native-babel-preset"],
plugins: [
"expo-router/babel",
["react-native-worklets/plugin", workletsPluginOptions]
],
};
- metro.config.js
Код: Выделить всё
const { getDefaultConfig } = require("expo/metro-config");
const { withUniwindConfig } = require("uniwind/metro");
const config = getDefaultConfig(__dirname);
module.exports = withUniwindConfig(config, { cssEntryFile: "./src/global.css" });
- Комплектировщик должен встроить/преобразовать процесс.env.EXPO_ROUTER_APP_ROOT, используемый expo-router, чтобы require.context получил строковый литерал и объединение прошло успешно.
- Добавлен плагин expo-router/babel в Babel.config.js.
- Очищен кэш Metro (), запустил expo-doctor (все проверки пройдены).
Код: Выделить всё
--reset-cache - Пытался установить переменную env вручную перед экспортом (PowerShell: $env:EXPO_ROUTER_APP_ROOT="src/app").
- Проверенное приложение работает нормально в Expo Go (поэтому маршруты времени выполнения работают локально).
- Почему процесс.env.EXPO_ROUTER_APP_ROOT не встраивается на этапе объединения даже после добавления expo-router/babel в конфигурацию Babel?
- Известны ли проблемы с Node v24 или определенными порядками плагинов Metro/Babel, которые могут помешать преобразованию?
- Должен ли я изменить конфигурацию Metro на явно включить плагин преобразования, или существует ли рекомендуемый порядок/размещение для expo-router/babel?
- Какие дополнительные журналы или минимальное воспроизведение будут наиболее полезны для дальнейшей отладки?
- Минимальный репозиторий, который использует expo-router с корнем в приложении и запускает npx expo Export:embed --eager --platform android --dev false --reset-cache должна выдать ту же ошибку (маршрутизация на основе файлов и основная: "expo-router/entry").
- expo, expo-router, Metro, Babel, React-native, eas, Bundling
Подробнее здесь: https://stackoverflow.com/questions/798 ... e-a-string
Мобильная версия