ไลบรารีร่วมและแพ็กเกจภายใน
สร้างไลบรารี UI และยูทิลิตีร่วม แล้วนำเข้าในแอปต่าง ๆ ด้วย alias เส้นทางของ TypeScript
ไลบรารีร่วมและแพ็กเกจภายใน เป็นบทเรียน React Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน React Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
ทำไมต้องใช้ไลบรารีร่วมกัน
แทนที่จะทำซ้ำคอมโพเนนต์ ฮุก และยูทิลิตีในหลายแอป ให้แยกสิ่งเหล่านี้เป็นโครงการไลบรารีที่ใช้ร่วมกัน ซึ่งแอปใด ๆ ในโมโนเรโปก็สามารถนำไปใช้ได้
การสร้างไลบรารี
ใช้ตัวสร้างของ Nx เพื่อสร้างโครงการไลบรารีที่มีการระบุชนิดข้อมูลและสามารถสร้างได้
# UI component library:
npx nx generate @nx/react:library ui --directory=libs/ui --importPath=@myorg/ui
# Utility library:
npx nx generate @nx/js:library utils --directory=libs/utils --importPath=@myorg/utils
# Data access library (hooks, API calls):
npx nx generate @nx/react:library data-access --importPath=@myorg/data-accessAPI สาธารณะของไลบรารี
ส่งออกทุกอย่างจาก index.ts เพียงไฟล์เดียว ซึ่งเป็น API สาธารณะ ผู้ใช้ไลบราควรนำเข้าเฉพาะจาก @myorg/ui ไม่ใช่จากเส้นทางภายในที่ซ้อนลึกลงไป
// libs/ui/src/index.ts
export { Button } from './lib/Button';
export { Card } from './lib/Card';
export { Input } from './lib/Input';
export type { ButtonProps } from './lib/Button';
// Consumer in apps/web:
import { Button, Card } from '@myorg/ui';
// NOT: import { Button } from '@myorg/ui/src/lib/Button'; // internal pathประเภทของไลบรารี: แบบเผยแพร่ได้กับแบบสร้างได้
ไลบรารีแบบสร้างได้ จะคอมไพล์แบบเพิ่มทีละส่วนเพื่อให้การสร้างโมโนเรโปทำได้เร็วขึ้น ส่วนไลบรารีแบบเผยแพร่ได้จะสร้างแพ็กเกจที่เข้ากันได้กับ npm เพิ่มเติม เพื่อให้ผู้ใช้นอกโครงการนำไปใช้ได้
# Buildable (monorepo internal use only):
npx nx generate @nx/react:library ui --buildable
# Publishable (for npm too):
npx nx generate @nx/react:library ui --publishable --importPath=@myorg/uiการบังคับใช้ขอบเขตของโมดูล
ใช้กฎ ESLint @nx/enforce-module-boundaries เพื่อป้องกันการพึ่งพากันแบบวนรอบ และจำกัดว่าโครงการใดสามารถนำเข้าจากโครงการใดได้บ้าง
// nx.json or .eslintrc
"depConstraints": [
// Apps can only import from libs:
{ "sourceTag": "type:app", "onlyDependOnLibsWithTags": ["type:lib"] },
// Feature libs can't import other feature libs (via shared libs only):
{ "sourceTag": "type:feature", "notDependOnLibsWithTags": ["type:feature"] }
]Storybook สำหรับไลบรารีที่ใช้ร่วมกัน
เรียกใช้ Storybook กับไลบรารี UI เพื่อจัดทำเอกสารคอมโพเนนต์แบบแยกอิสระ โดยไม่ขึ้นกับแอปใดแอปหนึ่ง
# Generate Storybook config for the ui lib:
npx nx generate @nx/storybook:configuration ui
# Run Storybook:
npx nx storybook uiการทดสอบไลบรารี
ไลบรารีแต่ละแห่งมีเป้าหมายการทดสอบของตัวเอง เมื่อไลบรารีมีการเปลี่ยนแปลง ให้เรียกใช้การทดสอบของไลบรารีและแอปทั้งหมดที่ได้รับผลกระทบ
# Test specific library:
npx nx test ui
# Test all affected by a change:
npx nx affected --target=testการจัดการเวอร์ชันในโมโนเรโป
ในโมโนเรโป แพ็กเกจทั้งหมดใช้ package.json และเวอร์ชันเดียวกัน สำหรับไลบรารีแบบเผยแพร่ได้ ให้ใช้เครื่องมืออย่าง @jscutlery/semver หรือ Changesets เพื่อจัดการเวอร์ชันแยกกัน
การย้ายโค้ดเดิมไปไว้ในไลบรารี
ย้ายโค้ดที่ใช้ร่วมกันไปไว้ในไลบรารีทีละขั้นตอน: สร้างไลบรารี ย้ายไฟล์ อัปเดตคำสั่งนำเข้า แล้วปล่อยให้นามแฝงเส้นทางของ TypeScript จัดการส่วนที่เหลือ
# Move a component:
# 1. Copy src/components/Button.tsx → libs/ui/src/lib/Button.tsx
# 2. Export from libs/ui/src/index.ts
# 3. Update imports across apps from relative paths to '@myorg/ui'
# 4. Delete the original fileการจัดทำเอกสารด้วย Compodoc หรือ Storybook Docs
ใช้แท็ก autodocs ของ Storybook หรือ Compodoc เพื่อสร้างเอกสาร API จากชนิดข้อมูลของ TypeScript และคอมเมนต์ JSDoc ในไฟล์ของไลบรารี
ตรวจสอบความเข้าใจ
จุดนำเข้าเดียวที่ผู้ใช้ควรใช้เมื่อนำเข้าจากไลบรารี Nx ที่ใช้ร่วมกันคืออะไร
ทบทวน
สร้างไลบรารีด้วย nx generate ส่งออกทุกอย่างจาก index.ts เพียงไฟล์เดียว และบังคับใช้ขอบเขตของโมดูลด้วยกฎ ESLint ใช้ไลบรารีแบบสร้างได้เพื่อให้การสร้างแบบเพิ่มทีละส่วนเร็วขึ้น และใช้ไลบรารีแบบเผยแพร่ได้เมื่อต้องการเผยแพร่ไปยัง npm เรียกใช้ Storybook กับไลบรารี UI เพื่อจัดทำเอกสารแบบแยกอิสระ
คำถามที่พบบ่อย
บทเรียน “ไลบรารีร่วมและแพ็กเกจภายใน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ไลบรารีร่วมและแพ็กเกจภายใน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส React Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส React Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ไลบรารีร่วมและแพ็กเกจภายใน”
สร้างไลบรารี UI และยูทิลิตีร่วม แล้วนำเข้าในแอปต่าง ๆ ด้วย alias เส้นทางของ TypeScript คุณปฏิบัติ React Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน React Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน React Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “ไลบรารีร่วมและแพ็กเกจภายใน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน React Academy นี้ได้ไหม
ได้ บทเรียน React Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสร้าง Nx Monorepo ด้วยแอป React
- ไลบรารีร่วมและแพ็กเกจภายใน
- คำสั่ง Nx Affected และการแคช
- ตัวสร้างโค้ดและการทำงานอัตโนมัติของพื้นที่ทำงาน