วิธีการที่เห็นได้ชัดในการสนับสนุนหลายแพลตฟอร์มด้วย React Native โดยใช้ Monorepo Workspaces Monorepo
ตรวจสอบ Running React Native ทุกที่ สำหรับคู่มือเชิงลึกเกี่ยวกับวิธีการและเหตุผลที่ฉันแนะนำให้ลองใช้วิธีนี้หากคุณวางแผนที่จะสนับสนุนหลายแพลตฟอร์มในแอปของคุณ

monorepo นี้ใช้พื้นที่ทำงานของเส้นด้ายและ typescript เพื่อรองรับโครงการ Native Native แบบแยกส่วน
แนวคิดหลักคือการแยกรหัสแอพ JavaScript ออกจากการกำหนดค่าแพลตฟอร์ม (รหัสดั้งเดิม + แอพ Bundlers เช่น Metro และ Webpack)
การแยกนี้เกิดขึ้นโดยการใช้พื้นที่ทำงานที่แตกต่างกัน: เรามี app ร์กสเปซสำหรับรหัสแอพ JavaScript ซึ่งเป็นพื้นที่ทำงาน mobile สำหรับการกำหนดค่ามือถือ React Native, macos Workspace สำหรับการกำหนดค่า MacOS แบบดั้งเดิมและอื่น ๆ
เรายอมรับ nohoist เส้นด้ายอย่างเต็มที่เพื่อให้ใช้ React Native เวอร์ชันต่าง ๆ ในแต่ละแพลตฟอร์ม (ซึ่งแนะนำ แต่ไม่จำเป็น) ทำให้การใช้การอัปเดตแบบดั้งเดิมของ React ใหม่ง่ายขึ้น
ขอบคุณ Nohoist, เวิร์กสเปซแต่ละแพลตฟอร์ม ( mobile , macos , ฯลฯ ) สามารถขึ้นอยู่กับเวอร์ชันดั้งเดิมที่ตอบสนองไม่ว่าพื้นที่ทำงานของแพลตฟอร์มอื่น ๆ จะใช้เวอร์ชันใด ตัวอย่างเช่นเราสามารถใช้ [email protected] บนแอพมือถือและ [email protected] บนแอพ MacOS-ตราบใดที่รหัสแอพ JavaScript รองรับทั้งสองเวอร์ชัน
วิธีการนี้ส่งเสริมการอัปเดต Native Native แบบค่อยเป็นค่อยไปเกี่ยวกับการอัปเดตใน LockStep
สำหรับรายละเอียดเพิ่มเติมลองดู "Running React Native ทุกที่: การตั้งค่า Monorepo Workspaces"
โปรดสังเกตว่าฉันไม่ได้บอกว่านี่เป็นวิธี ที่ถูกต้อง ในการทำปฏิกิริยา monorepos พื้นเมือง นี่เป็นเพียงวิธีการที่ฉันสนุกกับการใช้รหัสฐานขนาดใหญ่ :)
คุณสามารถใช้ repo นี้เป็นแผ่นหม้อไอน้ำลบพื้นที่ทำงานของแพลตฟอร์มที่คุณไม่ต้องการหรือคุณสามารถสร้างการตั้งค่านี้ตั้งแต่เริ่มต้นหากคุณต้องการเข้าใจวิธีการทำงานอย่างเต็มที่
[email protected]:mmazzarolo/react-native-universal-monorepo.gitcd react-native-universal-monorepo && yarnทีละขั้นตอนการสอนเกี่ยวกับการสร้างที่เก็บนี้ตั้งแต่เริ่มต้น:
การสอนสำหรับทีวีและแพลตฟอร์ม next.js จาก @thefinnomenon:
แหล่งข้อมูลเพิ่มเติม:
การพัฒนาและสร้างคำสั่ง:
yarn android:metro : เริ่มเซิร์ฟเวอร์ Metro สำหรับ Android/iOSyarn android:start : เริ่มพัฒนาแอพ Androidyarn android:studio : เปิดแอพ Android บน Android Studioyarn ios:metro : เริ่มเซิร์ฟเวอร์ Metro สำหรับ Android/iOSyarn ios:start : เริ่มพัฒนาแอพ iOSyarn ios:pods : ติดตั้ง iOS cocoapods การพึ่งพาyarn ios:xcode : เปิดแอพ iOS บน xcodeyarn macos:metro : เริ่ม Metro Server สำหรับ MacOSyarn macos:start : เริ่มพัฒนาแอพ MacOSyarn macos:pods : ติดตั้ง macOS cocoapods การพึ่งพาyarn macos:xcode : เปิดแอพ MacOS บน xcodeyarn web:start : เริ่มพัฒนาเว็บแอปyarn web:build : สร้างงานสร้างการผลิตของเว็บแอปyarn electron:start : เริ่มพัฒนาแอพอิเล็กตรอนyarn electron:package:mac : แพ็คเกจการผลิตไบนารีของแอพอิเล็กตรอนสำหรับ macOSyarn electron:package:win : แพ็คเกจการผลิตไบนารีของแอพอิเล็กตรอนสำหรับ Windowsyarn electron:package:linux : แพ็คเกจการผลิตไบนารีของแอพอิเล็กตรอนสำหรับ Linuxyarn browser-ext:start : เริ่มพัฒนาส่วนขยายเบราว์เซอร์yarn browser-ext:build : สร้างงานสร้างการผลิตของส่วนขยายเบราว์เซอร์yarn windows:metro : เริ่ม Metro Server สำหรับ Windowsyarn windows:start : เริ่มพัฒนาแอพ Windowsyarn tv:android:metro : เริ่มเซิร์ฟเวอร์ Metro สำหรับ Android TVyarn tv:android:start : เริ่มพัฒนาแอพ Android TVyarn tv:android:studio : เปิดแอพ Android TV ใน Android Studioyarn tv:tvos:metro : เริ่ม Metro Server สำหรับ TVOSyarn tv:tvos:start : เริ่มพัฒนาแอพ TVOSyarn tv:tvos:xcode : เปิดแอพ TVOS ใน XCodeyarn tv:tvos:pods : ติดตั้ง tvos cocoapods การพึ่งพาyarn next:start : เริ่มแอป next.jsyarn next:build : สร้างแอป next.jsyarn next:serve : เสิร์ฟแอปถัดไปคำสั่งอื่น ๆ (เราใช้นักวิ่งพิเศษเพื่อเรียกใช้คำสั่งเหล่านี้ในพื้นที่ทำงานทั้งหมด):
yarn lint : ผ้าสำลีแต่ละโครงการyarn lint:fix : Lint + Fix แต่ละโครงการyarn test : เรียกใช้การทดสอบของแต่ละโครงการyarn typecheck : เรียกใช้การตรวจสอบประเภท TypeScript ในแต่ละโครงการ ในขณะที่ทำงานเกี่ยวกับ React Native ใน monorepo คุณจะสังเกตเห็นว่าแพ็คเกจหลายอย่างจะไม่ทำงานอย่างถูกต้องเมื่อยก-เพราะพวกเขาจำเป็นต้องเชื่อมโยงกันอย่างสม่ำเสมอหรือเพราะพวกเขาถูกรวมเข้าด้วยกันสองครั้งทำลายการสร้าง (เช่น react , react-dom )
นี่ไม่ใช่ปัญหากับวิธีการที่ใช้ในโครงการนี้ต่อ se มันเป็นปัญหาที่พบบ่อยมากขึ้นกับ monorepos
เพื่อแก้ไขปัญหาเหล่านี้เราทำเครื่องหมายว่าเป็น nohoist ดังนั้นพวกเขาจะถูกติดตั้งในแต่ละแพ็คเกจที่ขึ้นอยู่กับพวกเขา
ใน monorepo นี้คุณสามารถดูตัวอย่างของห้องสมุดดังกล่าวใน react-native-async-storage
ใน Metro Bundler และ Webpack Configs ที่ใช้ข้าม Monorepo เราใช้ชุดเครื่องมือสร้างเพื่อให้แน่ใจว่าแพ็คเกจ NoHoisted ได้รับการแก้ไขอย่างถูกต้อง
ดังนั้นตราบใดที่คุณเพิ่มไลบรารีเหล่านี้ในรายการ nohoist คุณควรจะไปได้ดี?
เราพยายามที่จะทำให้การตั้งค่านี้เข้ากันได้กับเส้นด้ายคลาสสิก - แต่ด้วยการปรับแต่งสองสามครั้งมันเข้ากันได้กับเส้นด้าย 2+ เช่นกัน (ให้ประโยชน์ทั้งหมดของเส้นด้าย 2+)
ดู #22 สำหรับข้อมูลเพิ่มเติม
yarn set version berry ที่รูทของโครงการ มันจะสร้างไฟล์. .yarnrc.yml.yarnrc.yml เพื่อให้แน่ใจว่าไดเรกทอรี node_modules ทั้งหมดถูกสร้างขึ้นในแต่ละพื้นที่ทำงาน: nodeLinker : node-modules
nmHoistingLimits : workspacesnmHositingLimits บอกวิธีการยกการพึ่งพาสำหรับแต่ละพื้นที่ทำงาน โดยการตั้งค่าให้กับ workspaces การพึ่งพาทั้งหมดจะถูกติดตั้งใน node_modules ของแต่ละเวิร์กสเปซมากกว่าที่จะถูกยกไปยังโฟลเดอร์รูท ซึ่งหมายความว่าตอนนี้คุณสามารถสามารถส่วน noHoist ใน package.json ของรูทได้อย่างปลอดภัยตรวจสอบคู่มือ "การเริ่มต้น" ของเส้นด้าย 2+สำหรับข้อมูลเพิ่มเติม
ในบางกรณีเส้นด้ายคลาสสิกจะไม่สามารถแก้ไขการพึ่งพาได้อย่างถูกต้องซึ่งมี peerDependency react-native
ดู #22 สำหรับวิธีแก้ปัญหาสองสามข้อ การแก้ไข repo react-native-monorepo-tools repo กำลังทำงานอยู่
ยินดีต้อนรับการมีส่วนร่วมการสนทนาและข้อเสนอแนะ! โปรดถามว่ามีแผนการเปลี่ยนแปลงคุณสมบัติใด ๆ ก่อนที่จะส่ง PRS ใหม่หรือไม่?