reactjs - Absoluta sökvägar i react native version 0.72 typescript
Hej allihopa, så jag har problem med att ställa in absoluta sökvägar i React Native. Jag använde babel-plugin-module-resolver för det och satte också tsconfig.json och 'babel.config.js' som visat nedan, och VS Code ger inget fel om sökvägen men Metro-servern kastar fel som detta
BUNDLE ./index.js
error: Error: Unable to resolve module @pages/pokemons/pokemons from D:\Work And Stydy Of IT\ReactNative\RTKTS\src\App.tsx: @pages/pokemons/pokemons could not be found within the project or in these directories:
node_modules
> 1 | import Pokemons from '@pages/pokemons/pokemons';
| ^
2 | import React from 'react';
3 |
4 | function App(): JSX.Element {
at ModuleResolver.resolveDependency (D:\Work And Stydy Of IT\ReactNative\RTKTS\node_modules\metro\src\node-haste\DependencyGraph\ModuleResolution.js:139:15)
at DependencyGraph.resolveDependency (D:\Work And Stydy Of IT\ReactNative\RTKTS\node_modules\metro\src\node-haste\DependencyGraph.js:277:43)
at Object.resolve (D:\Work And Stydy Of IT\ReactNative\RTKTS\node_modules\metro\src\lib\transformHelpers.js:169:21)
at Graph._resolveDependencies (D:\Work And Stydy Of IT\ReactNative\RTKTS\node_modules\metro\src\DeltaBundler\Graph.js:473:35)
at Graph._processModule (D:\Work And Stydy Of IT\ReactNative\RTKTS\node_modules\metro\src\DeltaBundler\Graph.js:261:38)
at async Graph._addDependency (D:\Work And Stydy Of IT\ReactNative\RTKTS\node_modules\metro\src\DeltaBundler\Graph.js:372:20)
at async Promise.all (index 2)
at async Graph._processModule (D:\Work And Stydy Of IT\ReactNative\RTKTS\node_modules\metro\src\DeltaBundler\Graph.js:322:5)
at async Graph._traverseDependenciesForSingleFile (D:\Work And Stydy Of IT\ReactNative\RTKTS\node_modules\metro\src\DeltaBundler\Graph.js:249:5)
at async Promise.all (index 0)
// tsconfig.json
{
"extends": "@tsconfig/react-native/tsconfig.json",
"compilerOptions": {
"baseUrl": "./src",
"paths": {
"@app": [
"app/index"
],
"@app/*": [
"app/*"
],
"@services": [
"services/index"
],
"@services/*": [
"services/*"
],
"@pages": [
"pages/index"
],
"@pages/*": [
"pages/*"
],
}
},
"include": [
"src/**/*",
]
}
babel.config.js
module.exports = {
presets: ['module:metro-react-native-babel-preset'],
plugins: [
[
'module-resolver',
{
root: ['./src'],
alias: {
'@app': ['app/index'],
'@app/*': ['app/*'],
'@services': ['services/index'],
'@services/*': ['services/*'],
'@pages': ['pages/index'],
'@pages/*': ['pages/*'],
underscore: 'lodash',
},
},
],
],
};
Steg som jag har försökt hittills:
- Radera
node_modulesochyarn.lock-filer och installera paketen igen. - yarn start --reset-cache
- Ta bort den gamla APK som är installerad i en emulator.
- installera allt igen.
Innan jag publicerade detta försökte jag många svar som finns på Google och efter det publicerar jag
Svar #1
Jag tror att TypeScript-konfigurationsfilen och babel.config.js-filen inte behöver index-routnamn, i mitt fall var båda konfigurationerna som följande exempel:
// tsconfig.json
"compilerOptions": {
"baseUrl": "./src",
"paths": {
"@api": ["./api"], // this is for importing index file
"@api/*": ["./api/*"], // this is for importing other files underneath of the api folder
// babel.config.js
module.exports = {
presets: ['module:metro-react-native-babel-preset'],
plugins: [
'react-native-reanimated/plugin',
[
'module-resolver',
{
root: ['./src'],
extensions: [
'.ios.ts',
'.ios.tsx',
'.android.ts',
'.android.tsx',
'.ts',
'.tsx',
'.js',
'.jsx',
'.json',
],
alias: {
'@api': './src/api',
},
},
],
],
};
TIPSPUNKTER: Glöm inte att rensa din cache efter ovanstående konfiguration:
yarn start --reset-cache
Svar #2
Det accepterade svaret ledde mig i rätt riktning, men det saknar några saker.
Jag har precis startat ett React Native-projekt från CLI (react-native: 0.73.1). Detta är vad som fungerade för mig:
// tsconfig.json
{
"extends": "@react-native/typescript-config/tsconfig.json",
"compilerOptions": {
"baseUrl": ".", // <- can also use anything, e.g: ./src
"paths": {
"@/*": ["./src/*"]
// "@api": ["./api"] <- would work the same
}
}
}
Vi behöver installera module-resolver-pluginet:
npm install babel-plugin-module-resolver --save-dev
Och lägg till det i Babel-konfigurationen:
// babel.config.js
module.exports = {
presets: ["module:@react-native/babel-preset"],
plugins: [
[
"module-resolver",
{
root: ["."], // <- this is the same as the baseUrl
extensions: [
".ios.ts",
".ios.tsx",
".android.ts",
".android.tsx",
".ts",
".tsx",
],
alias: {
"@": "./src/", // <- this is absolute (different from tsconfig)
},
},
],
],
};
Efter allt detta kan du köra npm start och fortfarande se ett Error: Unable to resolve module. Om det är fallet, kör detta kommando för att återställa cachen:
npm start -- --reset-cache
or yarn start --reset-cache
Några anteckningar:
baseUrlitsconfigbör vara samma som irootibabel.configaliasibabel.configfungerar endast med absoluta sökvägar, så: om du har itsconfig:"@/*": ["./src/*"]behöver du omvandla det till:"@": "./src/"
Som tumregel: ta bort /* från nyckeln, ta bort * från värdet.
