javascript - Expo: Kan inte hitta ingångsfilen: Fältet `main` som definieras i din `package.json` pekar på en icke-existerande sökväg
Jag arbetar med standard TypeScript-mallen som genereras från kommandoraden npx create-expo-app -t expo-template-blank-typescript och jag får detta fel när jag försöker starta projektet.
Huvudanledningen tror jag är att jag arbetar i ett monorepo.
Ingångspunkten i package.json pekar på "main": "node_modules/expo/AppEntry.js" men i ett monorepo finns expo-modulen endast i den överordnade node_modules-mappen.
Vad jag har försökt
Jag har försökt ställa in startpunkten i app.json till: ./src/App.tsx, ./dist/App.js utan framgång
När jag ändrar huvudfältet i package.json till ../../node_modules/expo/AppEntry.ts får jag detta fel:
Invariant Violation: Misslyckades med att anropa JavaScript-modulmetoden AppRegistry.runApplication(). Modulen har inte registrerats som anropbar. Registrerade anropbara JavaScript-moduler (n=11)
Min setup
Jag arbetar med turborepo. Min mappstruktur ser ut som
├── app
│ ├──project1
│ │ ├── package.json
│ │ ├── App.tsx
│ │ ├── app.json
│ │ └── tsconfig.json
│ └──node_modules
└── node_modules
└── expo
└── AppEntry.js
Finns det ett rent sätt att hantera detta scenario?
Svar #1
Jag hittade äntligen svaret här:
https://docs.expo.dev/guides/monorepos/
Du behöver skriva över metro-konfigurationen:
Det finns tre huvudförändringar vi behöver:
- Se till att Metro övervakar hela monorepot, inte bara apps/cool-app.
- Berätta för Metro var det kan lösa paket. De kan vara installerade i apps/cool-app/node_modules eller node_modules.
- Tvinga Metro att endast lösa (sub)paket från nodeModulesPaths.
Vi kan konfigurera detta genom att skapa en metro.config.js med följande innehåll:
const { getDefaultConfig } = require('expo/metro-config');
const path = require('path');
// Find the project and workspace directories
const projectRoot = __dirname;
// This can be replaced with `find-yarn-workspace-root`
const workspaceRoot = path.resolve(projectRoot, '../..');
const config = getDefaultConfig(projectRoot);
// 1. Watch all files within the monorepo
config.watchFolders = [workspaceRoot];
// 2. Let Metro know where to resolve packages and in what order
config.resolver.nodeModulesPaths = [
path.resolve(projectRoot, 'node_modules'),
path.resolve(workspaceRoot, 'node_modules'),
];
// 3. Force Metro to resolve (sub)dependencies only from the `nodeModulesPaths`
config.resolver.disableHierarchicalLookup = true;
module.exports = config;
OCH
Ändra standardingångspunkten i index.js
import { registerRootComponent } from 'expo';
import App from './App';
// registerRootComponent calls AppRegistry.registerComponent('main', () => App);
// It also ensures that whether you load the app in Expo Go or in a native build,
// the environment is set up appropriately
registerRootComponent(App);
