如何在基于 TypeScript 的 React Native 应用程序中为导入配置绝对路径?

Sve*_*tøl 26 javascript typescript jestjs babeljs react-native

为了避免在基于 TypeScript 的 React Native 应用程序中出现“../../../../”样式的相对导入,我想配置该应用程序,以便我可以使用绝对导入。

重要的是配置还支持 Jest 单元测试。

我创建的应用程序使用 npx react-native init MyTestApp --template typescript

反应本机版本:0.60.5

我需要实现这一目标的确切配置是什么?

I P*_*ana 41

要求

// Meh
import config from '../../../../../../../config';

// Awesome!
import config from '@cuteapp/config';
Run Code Online (Sandbox Code Playgroud)

如何

  1. 添加这个 babel 插件包
yarn add --dev babel-plugin-module-resolver
Run Code Online (Sandbox Code Playgroud)
  1. 我的 babel.config.js
module.exports = {
  presets: ['module:metro-react-native-babel-preset'],
  plugins: [
    [
      require.resolve('babel-plugin-module-resolver'),
      {
        cwd: 'babelrc',
        extensions: ['.ts', '.tsx', '.js', '.ios.js', '.android.js'],
        alias: {
          '@cuteapp': './app'
        }
      }
    ],
    'jest-hoist'
  ]
};
Run Code Online (Sandbox Code Playgroud)
  1. 我的 tsconfig.json
{
  "compilerOptions": {
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "isolatedModules": true,
    "jsx": "react",
    "lib": ["es2015", "es2015.promise", "es2016.array.include", "dom"],
    "strict": true,
    "moduleResolution": "node",
    "baseUrl": "./",
    "paths": {
      "@cuteapp/*": ["app/*/index", "app/*"]
    },
    "noEmit": true,
    "resolveJsonModule": true,
    "target": "esnext",
    "types": ["jest"]
  },
  "exclude": ["node_modules", "babel.config.js", "metro.config.js"]
}
Run Code Online (Sandbox Code Playgroud)
  1. 重新启动 IDE。
  2. 就是这样。

  • 确保在设置后运行 `yarn start —reset-cache` :-) (10认同)
  • 一件微小的(但可能令人困惑的)事情 - 它是“babel-config-js”(而不是“json”) (2认同)
  • 另外,根据问题,“tsconfig.json”“jsx”键应该是“react-native”。 (2认同)

Sve*_*tøl 24

概括:

所述NPM包babel-plugin-module-resolver是必要的,以及在一些配置tsconfig.jsonbabel.config.js


一步步:

  1. babel-plugin-module-resolver使用 npm 或 yarn安装。

    npm i babel-plugin-module-resolver --save-dev
    
    # Or (If you're using yarn):
    
    yarn add --dev babel-plugin-module-resolver
    
    Run Code Online (Sandbox Code Playgroud)
  2. tsconfig.json: 添加"baseUrl": "."compilerOptions

  3. babel.config.js:添加一个plugins使用以下值命名的键:

[
    [
      'module-resolver',
      {
        extensions: [
          '.js',
          '.jsx',
          '.ts',
          '.tsx',
          '.android.js',
          '.android.tsx',
          '.ios.js',
          '.ios.tsx'
        ],
        root: ['.']
      }
    ]
  ]
Run Code Online (Sandbox Code Playgroud)

完整配置:

tsconfig.json

{
  "compilerOptions": {
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "esModuleInterop": true,
    "isolatedModules": true,
    "jsx": "react",
    "lib": ["es6"],
    "moduleResolution": "node",
    "noEmit": true,
    "strict": true,
    "target": "esnext",
    "baseUrl": "."
  },
  "exclude": ["node_modules", "babel.config.js", "metro.config.js", "jest.config.js"]
}
Run Code Online (Sandbox Code Playgroud)

babel.config.js

module.exports = {
  presets: ['module:metro-react-native-babel-preset'],
  plugins: [
    [
      'module-resolver',
      {
        extensions: [
          '.js',
          '.jsx',
          '.ts',
          '.tsx',
          '.android.js',
          '.android.tsx',
          '.ios.js',
          '.ios.tsx'
        ],
        root: ['.']
      }
    ]
  ]
};

Run Code Online (Sandbox Code Playgroud)

这是针对使用npx react-native init MyTestApp --template typescriptReact Native 0.60.5 版创建的全新项目

  • babel-plugin-module-resolver 应该安装到 devDependencies (7认同)

小智 14

如果你不想使用 babel 插件

  1. 使用以下内容在文件夹内创建一个新package.json文件。src(更改myapp为您想要的任何内容,甚至可以是src。)
{
  "name": "myapp"
}
Run Code Online (Sandbox Code Playgroud)
  1. 更新您的 tsconfig.json 文件
{
  "compilerOptions": {
     ...
     "baseUrl": "./",
     "paths": {
       "myapp/*": ["src/*"]
     }
     ...
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 在你的 .tsx 文件中
import { MyThing } from 'myapp/MyThing';
Run Code Online (Sandbox Code Playgroud)


Mis*_*ana 9

2023 更新

package.json1.在你的文件夹中创建一个src并添加{"name":"src"}到其中。

tsconfig.json2.像这样更新你的文件,

{
  "compilerOptions": {
     ...
     "baseUrl": "./",
     "paths": {
       "src/*": ["src/*"]
     }
     ...
  }
}
Run Code Online (Sandbox Code Playgroud)

3.重新启动你的IDE。

现在你可以像这样导入,

import MyComponent from 'src/components/MyComponent';
Run Code Online (Sandbox Code Playgroud)


And*_*nov 5

对于任何使用 TypeScript 并且只想使用不带别名的绝对路径导入的人。

假设您的所有代码文件夹都位于src.

插入"baseUrl": "src"compilerOptions对象里面tsconfig.json

现在您可以在导入中使用绝对路径。

  • 这只会让类型检查工作,对编译没有帮助 (22认同)