Expo
( react native
) で相対パスの代わりにエイリアスを使いたい。
import Ctx from "../../../contexts/main";
みたいなのは書いてられないです。
next.js
で同様のことをしていたので設定自体は簡単だったのですが、思わぬ落とし穴があったのでメモしておきます。
Typescript
Typescript
を使用する場合は import
の名前解決のための変更をします。
tsconfig.json
に baseUrl
と paths
を追記。
1 2 3 4 5 6 7 8 9 10 11 |
{ "compilerOptions": { ... "baseUrl": ".", "paths": { "$components*": ["./src/components*"], "$contexts*": ["./src/contexts*"], "gl-react": ["./types/gl-react"] } } } |
ここでは alias
の他に type
のオーバーロードしたりします。
VSCode
の場合、設定反映のために再起動が必要な場合があります。
ビルド設定
トランスコンパイラの名前解決のために babel
の設定をします。
まずはプラグインの追加。
1 |
yarn add -D babel-plugin-module-resolver |
次に babel.config.js
の presets
の下に plugins
を追記します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
return { presets: ["babel-preset-expo"], plugins: [ [ "module-resolver", { alias: { $components: "./src/components", $contexts: "./src/contexts", }, }, ], ], }; |
設定を読み込むため expo start
している場合は再起動します。
エラー
最初 @xxx
をエイリアスに設定していた時にビルドが失敗した。
Failed building JavaScript bundle.
Unable to resolve "@contexts/glsl" from "src\pages\main.tsx"
設定ミスか React Native
では特殊な設定がいるのかと思って色々試したがエイリアスを @xxx
以外(今回は $xxx
)にすると問題なく通った。
next.js
では問題なかったので expo
固有の問題なんだと思いますが、思いもしなかったので大分ハマりました。