Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Yarn WorkSpaces × React Nativeの環境構築

Yarn WorkSpaces × React Nativeの環境構築

React Native Matsuriの登壇資料です。

camcam_lemon

October 02, 2021
Tweet

More Decks by camcam_lemon

Other Decks in Programming

Transcript

  1. 開発環境 ! node_modulesを生成するモード ! できる限りhoistingする ! yarn v3(Berry) ! React

    Native v0.65.1 ! 環境構築は公式の「Setting up the development environment」に従う ! シミュレーターは設定済みを想定 ! React v17.0.2
  2. 開発環境  Xcode v13.0  CocoaPods v1.11.2  シミュレーター iPhone

    12(iOS 15) :  iPhone :Pixel_3a_API_30  Android
  3. yarn v3(Berry)について 4 Berryの設定した際に自動で作成される 4 node_modulesやhoistingの設定もここで変更できる 4 設定はyarnrc.ymlに記述する 4 TypeScriptの@typesを自動で追加などができる(@yarnpkg/plugin-typescript)

    4 プラグインによる拡張が可能 4 再現性のないエラーがよく起こる 4 初回設定時は空のyarn.lockがないとインストールできない(できる時もある) 4 yarn install ではなく yarn を使うべし(hoistingがぶっ壊れる時がある) Ô プロダクション運用ではv2の利用を推奨 4 yarn v3はまだ不安定
  4. hoistingとは 1 雑に言うと同一モジュールをまとめて容量削減する 1 ルートのnode_modulesに巻き上げる(hoist)のでhoisting 1 bootstrapが速くなる 1 yarnが依存関係を整理して巻き上げるかどうかを決めている 1

    依存関係はルートのyarn.lockで全て管理される 1 プロジェクトとの相性の良し悪しがある 1 使っているモジュールによってはひと手間加えないといけないことがある 1 React Nativeはその最たる例
  5. hoistingのイメージ root packages @pkgA/node_modules @pkgB/node_modules node_modules A(v1.0.0) A(v1.0.0) B(v1.0.0) A(v2.0.0)

    B(v1.0.0) C(v1.0.0) root packages @pkgA/node_modules @pkgB/node_modules node_modules A(v1.0.0) B(v1.0.0) C(v1.0.0) A(v2.0.0) Berryでは全てhoistされたpackageには node_modulesが作成されない ※
  6.  モノレポだから動かない  hoistingされたから動かない  動かすにはひと手間必要で、その原因は主に2つ  hoistingがややこしくする  React

    Native関連のモジュールがhoistingされなければエラーは起きない  一度動いてもhoistingが崩れれば動かなくなる  react-native-cliはコマンドを実行したディレクトリーをベースにテンプレートを生成する  とはいえyarn installの速度改善の恩恵は大きい  一度動き出すと安定はする(hoistingが崩れることは稀)  ReactとReact Nativeのバージョンは必ず揃え、固定するのが望ましい  相性が良いとは言えない yarn workspacesとReact Native
  7. Podfileの設定は環境によって異なる D XCodeとiOSのバージョンで異なるエラーが発生する D Xcode 12.5 以上で発生するエラー D iOS 15

    のシミュレーターで発生するエラー D 2021/9/29に修正コミットがmainブランチに取り込まれたのでもうすぐ直る D 2021/10/2にv.0.66.0がリリースされ、上記エラーは修正された D いずれのエラーもFlipperで起こる D node_modulesのパスを変更するのは共通
  8. RN v0.65.1 以下かつ iOS 15.0 以上の場合 P React Nativeのリポジトリに同問題と思われるissueが何件もある P

    Xcode 13.0 の対応でも動くようになるので、Xcode側の問題かも? P まだリリースされたばかりで情報が錯綜している P CocoaPodsを最新にあげる(react-native-cliのテンプレートはこれで動く) P project.pbxprojにswiftライブラリーの参照を足す P useFlipperをコメントアウトする P https://github.com/facebook/react-native/issues/31733 P いろいろ試して頑張って動かすしかない P RN v0.66.0だと上記問題は発生しない
  9. Metroについて 3 Metroが(hoistingされていれば)ルートのnode_modulesにいるため 3 開発時はrootのmetro.config.jsを優先的に見る e プロダクションビルド時にはmobile/metro.config.jsが参照されるので注意 3 設定ファイルはルートディレクトリーに作成する 3

    設定しないと全ての変更を監視してしまうのでMetroが重くなる 3 watchFoldersで変更を監視したいフォルダへのパスを文字列で指定 3 blockListで変更を無視したいフォルダへのパスを正規表現で指定 3 blockListはかつてblackListREという名前だった 3 モノレポではwatchFoldersとblockListは必須
  10. jetifierについて 2 Androidにとって深く歴史的経緯のある存在 2 AndroidXという単語もこの歴史に関わってくる登場人物 2 Androidは同じ処理でもAPIレベルでメソッド名やクラス名が違うことがある 2 jetifierはAPIレベルを見てよしなにしてくれる 2

    今の時代なら--no-jetifierでも(きっと)大丈夫 2 有名所のライブラリーはほぼ対応してるので、現在は起動しなくても良い 2 jetifierは実行時のディレクトリーにnode_modulesフォルダがなくても落ちるので注意 2 jetifierが必要な場合は、別プロセスで起動する
  11. yarn v3を設定するまでに実行したコマンド > yarn set version berry // 最新バージョンのBerryをインストール。berryは任意のバージョンに変更できる >

    yarn plugin import typescript // TypeScript用のpluginのインポート // プラグインはyarn.lockやnode_modulesがないと実行できなかったりする yarnコマンドが何も叩けなくなったら .yarnフォルダを消して再度yarn set version berryから始めた方が良いです
  12. blackListREについての補足 0 昔の記事でよくでてくるけど現在は使えない 0 blackListREプロパティにblackList関数でパスを渡す記事がよくヒットする 0 Metro v0.60.0を起点に変わった 0 v0.60.0でblackList関数はexclusionListにリネーム

    0 v0.61.0でblackListREプロパティはblockListにリネーム 0 チームメンバで使っているOS(Windows, Max)が違うのであれば使った方がいい 0 デフォルトで__tests__フォルダを無視している 0 exclusionListはパス区切り文字の整形などを行う