web-dev-qa-db-ja.com

ExpoとReact Nativeの絶対パスでインポートを使用する方法は?

Expo およびReact Native)で、相対パスの代わりに絶対インポートパスを使用しようとしています。

Expoのドキュメントを調べましたが、答えが見つかりませんでした...見つけたreactコミュニティで件名を検索しています babel-plugin-module-resolver しかし、Expoはすでにそれを使用しているようですので、私はいくつかのエイリアスを作成するために私の.babelrcを変更しました:

{
  "presets": ["babel-preset-expo"],
  "env": {
    "development": {
      "plugins": [
        "transform-react-jsx-source",
        ["module-resolver", {
          "root": ["./app"],
          "alias": {
            "Components": "./app/components",
          }
        }]
      ]
    }
  }
}

しかし、次のエラーが発生しました。

Unable to resolve module '@expo/vector-icons/glyphmaps/Entypo.json' 
from '/Users/eduardoleal/Code/lua/rook/node_modules/@expo/vector-icons/Entypo.js': 
Module does not exist in the module map or in these directories:   /Users/eduardoleal/Code/lua/rook/node_modules/@expo/vector-icons/node_modules/@expo/vector-icons/glyphmaps ,   /Users/eduardoleal/Code/lua/rook/node_modules/@expo/vector-icons/glyphmaps  This might be related to https://github.com/facebook/react-native/issues/4968 To resolve try the following:   
1. Clear watchman watches: 'watchman watch-del-all'.   
2. Delete the 'node_modules' folder: 'rm -rf node_modules && npm install'.   
3. Reset packager cache: 'rm -fr $TMPDIR/react-*' or 'npm start --reset-cache'.
ABI16_0_0RCTFatal -[ABI16_0_0RCTBatchedBridge stopLoadingWithError:] __34-[ABI16_0_0RCTBatchedBridge start]_block_invoke_2 _dispatch_call_block_and_release _dispatch_client_callout _dispatch_main_queue_callback_4CF __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ __CFRunLoopRun CFRunLoopRunSpecific GSEventRunModal UIApplicationMain main start 0x0 

絶対パスをインポートする簡単な方法はありますか?

10
Eduardo Leal

しばらくして、これを機能させようとしました。 .babelrcをフォローすることで問題を解決できました。

{
  "presets": ["babel-preset-react-native-stage-0/decorator-support"],
  "env": {
    "development": {
      "plugins": ["transform-react-jsx-source"]
    }
  },
  "plugins": [
    ["module-resolver", {
      "alias": {
        "react-native-vector-icons": "@expo/vector-icons",
        "@expo/vector-icons/lib/create-icon-set": "react-native-vector-icons/lib/create-icon-set",
        "@expo/vector-icons/lib/icon-button": "react-native-vector-icons/lib/icon-button",
        "@expo/vector-icons/lib/create-icon-set-from-fontello": "react-native-vector-icons/lib/create-icon-set-from-fontello",
        "@expo/vector-icons/lib/create-icon-set-from-icomoon": "react-native-vector-icons/lib/create-icon-set-from-icomoon",
        "@expo/vector-icons/lib/icon-button": "react-native-vector-icons/lib/icon-button",
        "@expo/vector-icons/glyphmaps": "react-native-vector-icons/glyphmaps",
        "$components": "./app/components",
        "$config": "./app/config",
        "$helpers": "./app/helpers",
        "$navigators": "./app/navigators",
        "$reducers": "./app/reducers",
        "$screens": "./app/screens",
        "$images": "./assets/images",
        "$fonts": "./assets/fonts",
        "$icons": "./assets/icons",
        "$videos": "./assets/videos",
      }
    }]
  ]
}

babel-preset-expoの内容を.babelrcにコピーしました。これは最善の解決策ではありません...しかし、正常に機能します。

それについての詳細 ここ

2
Eduardo Leal

更新:Expov32.0.0以降

Expo initは、「babel.config.js」を作成しています。 'plugins'キーを 'babel.config.js'ファイルに追加し、エイリアスを追加するだけです。 'env'キーはもう必要ありません。

module.exports = function(api) {
  api.cache(true)

  return {
    presets: ['babel-preset-expo'],
    plugins: [
      [
        'module-resolver',
        {
          alias: {
            assets: './assets',
            components: './src/components',
            modules: './src/modules',
            lib: './src/lib',
            types: './src/types',
            constants: './src/constants',
          },
        },
      ],
    ],
  }
}

更新:Expo.io SDKv20.0.0の変更

SDK v20.0.0以降、通常のBabelExpoプリセットを使用できます

{
  "presets": ["babel-preset-expo"],
  "env": {
    "development": {
      "plugins": ["transform-react-jsx-source"]
    }
  },
  "plugins": [
    ["module-resolver", {
      "alias": {
        "alias-name": "./app",
      }
    }]
  ]
}

Expo.io SDKv19.0.0以前

root要素がなく、pluginsを分離し、presetsbabel-preset-react-native-stage-0/decorator-supportに変更すると、エイリアスが機能します。

バージョン16.0.0でExpo.ioを使用する
こちらのExpoフォーラムでこれを見つけました: https://forums.expo.io/t/relative-paths-with-expo/654/

これがあなたのケースでも機能することを確認できますか?

{
  "presets": ["babel-preset-react-native-stage-0/decorator-support"],
  "env": {
    "development": {
      "plugins": ["transform-react-jsx-source"]
    }
  },
  "plugins": [
    ["module-resolver", {
      "alias": {
        "alias-name": "./app",
      }
    }]
  ]
}
11
Laszlo Schürg

最新のエキスポユーザー向け(SDKバージョン> = 32)。

pluginsプロパティをbabel.config.jsに追加するだけです(このファイルはプロジェクトのルートディレクトリにあります)。

module.exports = function (api) {
  api.cache(true);
  return {
    presets: ['babel-preset-expo'],
    plugins: [
      [
        'module-resolver',
        {
          alias: {
            'alias-name': './src/assets/bla/bla',
          },
        },
      ],
    ],
  };
};
2
Bimal Grg
./src
 |- package.json
 |- Bar/
 |   `- index.js
 `- Foo.js

package.json

{
  "name": "~" // whatever u want
}

その後

import { Foo } from "~/Foo";
import { Bar } from "~/Bar";
// ...
0
uinz