Monorepo Architecture
ကျွန်တော် အရင်လုပ်ခဲ့တဲ့အလုပ်မှာ ဒီ monorepo ဆိုတဲ့ structure ကို လေ့လာခဲ့ရတယ်။ သူ့ရဲ့ အသုံးပြုပုံကတော့ သိပ်ပြီး ရှုပ်တာတော့မဟုတ်ပါဘူး။ project ထဲမှာ web, mobile နဲ့ shared ဆိုပြီး folder ၃ခုခွဲထားတယ်။ web မှာက Next.js ကို သုံးထားပြီး mobile အတွက် React Native ကို အသုံးပြုထားတယ်။ shared ထဲမှာတော့ web ရော mobile မှာပါ အသုံးပြုလို့ရတဲ့ အစိတ်အပိုင်းတွေကို ထည့်ထားတယ်။ ဘယ်လိုအစိတ်အပိုင်းတွေလဲဆိုတော့ state management လိုမျိုးဟာတွေရယ်၊ api setup တွေရယ်၊ configuration တွေရယ် စသဖြင့်ပါဝင်တယ်။ ပြောရမယ်ဆိုရင်တော့ ခွဲထုတ်လို့ရတာတွေကို ခွဲထုတ်ပြီး web ရော mobile ရောမှာ ပြန်သုံးလို့ရအောင် လုပ်ထားတာမျိုးပေါ့။
ဒီလို setup လုပ်ထားတာ ဘာတွေအကျိုးရှိသလဲဆိုတော့ ပြောင်းလဲတွေ လုပ်ဖို့လိုတာတဲ့အခါ web အတွက် တခါ၊ mobile အတွက် တခါ ခွဲပြီး လုပ်ဖို့ မလိုတော့ဘူး။ ပြီးတော့ web နဲ့ mobile ထဲမှာ business logic တွေအများကြီး ရှိမနေတဲ့အတွက် UI layer က UI အလုပ်ကို သေချာလေးလုပ်လို့ရသွားတယ်။ logical test တွေကိုလဲ တနေရာထဲမှာ လုပ်လို့ရသွားတယ်။ တခုရှိတာကတော့ shared ဆိုတဲ့ folder ကို web ရော mobile ရောက အသုံးပြုနေတဲ့အတွက် တခုခုလွဲတာရှိခဲ့ရင် ၂ခုလုံးမှာ သွားပြီးတော့ သက်ရောက်နိုင်တယ်။ ပြီးတော့ web နဲ့ mobile အသုံးပြုပုံချင်း အရမ်းကွာခြားတဲ့အခါ data တွေက shared ထဲမှာ ပြန့်ကျဲနေတာမျိုးလဲ ဖြစ်တတ်တယ်။ ဒီတော့ ဒီ structure ကို အသုံးပြုတော့မယ်ဆိုရင် common ဖြစ်မယ့်ဟာတွေက ဘယ်လိုရှိမလဲဆိုတာနဲ့ ဘယ်နေရာတွေမှာ အသုံးပြုမယ်ဆိုတာ သိထားဖို့တော့လိုတယ်။
ဒီလို monorepo တည်ဆောက်ဖို့ဆို lerna
ဆိုတဲ့ tool ကို အသုံးပြုလို့ရတယ်။ setup လုပ်ပုံကို သူ့ documentation မှာ သွားရောက်ပြီး ကြည့်လို့ရပါတယ်။
lerna မှာက packages
ဆိုပြီး အသုံးပြုတာဖြစ်တဲ့အတွက် အပေါ်မှာပြောထားတဲ့ web, mobile, shared တွေက packages folder ထဲမှာ folder တခုချင်းစီ ဖြစ်သွားမယ်။
lerna နဲ့ setup လုပ်ထားတဲ့ monorepo ဖြစ်သွားတဲ့အခါ တခုသတိထားရမှာက package တွေကို install လုပ်ချင်တဲ့အခါ အရင်ကလို project ထဲသွားပြီး အခုလို လုပ်လို့မရတော့ပါဘူး။
npm install <package>
အရင် lerna version တွေမှာ lerna add
lerna bootstrap
စသဖြင့် အသုံးပြုရပေမယ့် အခုနောက်ဆုံး version မှာတော့ အောက်မှာ ပြထားသလို အသုံးပြုလို့ရသွားပါပြီ။ သုံးနေကျ npm command နောက်မှာ package ကိုပါ ထည့်ပေးရမှာ ဖြစ်ပါတယ်။
npm install <dependency> -w <package>
ပြီးရင်တော့ ကိုယ်လိုချင်တဲ့ package ကို တခြား package ထဲမှာ dependency အနေနဲ့ အသုံးပြုလို့ရပါပြီ။