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);

Relaterade artiklar