yarn — ตัวจัดการแพ็คเกจทางเลือกสำหรับ Node.js สร้างโดย Facebook ร่วมกับ Exponent, Google และ Tilde ในปี 2016 yarn แก้ปัญหาความเร็วและความปลอดภัยของ npm 2-4: การติดตั้งแบบขนาน ไฟล์ lock ที่เข้มงวด และแคชออฟไลน์ ปัจจุบัน yarn ยังคงเป็นที่นิยมใน React Native, Expo และโมโนเรโป เรียนรู้เพิ่มเติมได้ที่ yarn Documentation
ประเด็นสำคัญ
yarn (Yet Another Resource Negotiator) เปิดตัวในเดือนตุลาคม 2016 เพื่อเป็นคำตอบของ Facebook ต่อปัญหา npm 2-4: การติดตั้งช้า การไม่มีไฟล์ lock และแพ็คเกจที่ไม่ปลอดภัย yarn นำเสนอการดาวน์โหลดแพ็คเกจแบบขนาน yarn.lock ที่แน่นอน และการตรวจสอบความสมบูรณ์ผ่าน checksum ในปี 2020 yarn เปลี่ยนไปใช้เวอร์ชัน 2 (Berry) ด้วย Plug'n'Play และแนวทาง TypeScript-first
สถาปัตยกรรมของ yarn แตกต่างจาก npm: yarn ดาวน์โหลดแพ็คเกจแบบขนาน (npm ก่อนเวอร์ชัน 5 — แบบลำดับ), แคชแต่ละแพ็คเกจใน ~/.cache/yarn โดยไม่ซ้ำกันระหว่างโปรเจกต์ และตรวจสอบความสมบูรณ์ผ่าน checksum yarn สร้าง yarn.lock เสมอในการติดตั้งทุกครั้ง ในขณะที่ package-lock.json ใน npm ปรากฏในเวอร์ชัน 5 เท่านั้น
เริ่มตั้งแต่ yarn 2 (Berry, 2020), yarn ถูกเขียนใหม่ทั้งหมดใน TypeScript และรองรับ Plug'n'Play, workspaces, constraints สำหรับโมโนเรโป และโพรโทคอลการติดตั้งจากแหล่งต่าง ๆ (npm, git, tarball) yarn 3+ (2022) เพิ่ม Zero-Installs — การเก็บแคชในพื้นที่จัดเก็บเพื่อการติดตั้งทันทีโดยไม่ต้องเชื่อมต่อเครือข่าย
yarn install — คำสั่งหลักที่อ่าน package.json และ yarn.lock และติดตั้ง dependencies yarn ดาวน์โหลดแพ็คเกจแบบขนาน ซึ่งทำให้การติดตั้งเร็วขึ้น 2-3 เท่าเมื่อเทียบกับ npm 4 และเวอร์ชันก่อนหน้า yarn ใช้แคชออฟไลน์: หากแพ็คเกจถูกดาวน์โหลดไปแล้วในโปรเจกต์อื่น มันจะถูกคัดลอกจากแคชแทนที่จะดาวน์โหลดอีกครั้ง
# คำสั่งพื้นฐานของ yarn
$ yarn install
$ yarn add react-native-webview
$ yarn add --dev typescript
$ yarn global add expo-cli
# อัปเดตแบบโต้ตอบ
$ yarn upgrade-interactive
# ลบแพ็คเกจที่ซ้ำกัน
$ yarn dedupe
yarn add — คำสั่งสำหรับติดตั้งแพ็คเกจใหม่ yarn add <package> เพิ่มใน dependencies, yarn add --dev — เพิ่มใน devDependencies yarn อัปเดต yarn.lock โดยอัตโนมัติ yarn upgrade อัปเดตแพ็คเกจเป็นเวอร์ชันล่าสุดภายในช่วงความหมาย yarn upgrade-interactive — โหมดโต้ตอบสำหรับเลือกแพ็คเกจเฉพาะเพื่ออัปเดต
yarn cache — แคชทั่วโลกใน ~/.cache/yarn/v6 แต่ละแพ็คเกจถูกเก็บไว้ครั้งเดียวในไฟล์ ZIP พร้อม checksum แคชของ yarn ถูกล้างโดยอัตโนมัติ แต่คุณสามารถเรียกใช้ yarn cache clean ด้วยตนเอง yarn cache dir แสดงเส้นทางแคช yarn cache list — รายการแพ็คเกจในแคช
yarn.lock — ไฟล์ lock ที่บันทึกเวอร์ชันที่แน่นอนของ dependencies ทั้งหมดและแพ็คเกจที่สืบทอด แตกต่างจาก package-lock.json (JSON) yarn.lock ใช้รูปแบบ YAML ที่มีโครงสร้างแบบเรียบ yarn.lock ถูกสร้างโดยอัตโนมัติเสมอระหว่าง yarn install หรือ yarn add — ซึ่งรับประกันว่านักพัฒนาทุกคนและเซิร์ฟเวอร์ CI จะได้รับชุดแพ็คเกจที่เหมือนกัน
# ตัวอย่างโครงสร้าง yarn.lock
react@^18.3.0:
version: "18.3.1"
resolution: "react@npm:18.3.1"
dependencies:
loose-envify: "^1.1.0"
checksum: "abc123def456..."
react-native@^0.76.0:
version: "0.76.3"
resolution: "react-native@npm:0.76.3"
dependencies:
react: "18.3.1"
checksum: "def789ghi012..."
ฟิลด์ของ yarn.lock: version — เวอร์ชันของแพ็คเกจที่แน่นอน, resolution — แหล่งที่มาและเวอร์ชัน, dependencies — dependencies ของมัน, checksum — checksum สำหรับการตรวจสอบ yarn.lock ถูก commit ในพื้นที่จัดเก็บและเป็นแหล่งความจริงเดียวสำหรับ dependencies หาก yarn.lock และ package.json แตกต่างกัน yarn จะออกคำเตือน
Yarn constraints — ระบบกฎสำหรับโมโนเรโปที่ตรวจสอบและบังคับใช้เวอร์ชัน dependencies ใน yarn.lock ข้อจำกัดถูกอธิบายในไฟล์ yarn.constraints.js โดยใช้ Yarn Constraint Language Constraints ช่วยให้มั่นใจได้ว่าแพ็คเกจทั้งหมดในโมโนเรโปใช้ React หรือ TypeScript เวอร์ชันเดียวกัน
React Native มีความเชื่อมโยงอย่างใกล้ชิดกับ yarn ตามธรรมเนียม Expo CLI, React Native CLI และ Create React Native App เริ่มแรกใช้ yarn ในโปรเจกต์ React Native, yarn.lock ล็อกเวอร์ชันของโมดูลเนทีฟ ซึ่งมีความสำคัญอย่างมากสำหรับการคอมไพล์ที่เสถียรผ่าน CocoaPods (iOS) และ Gradle (Android) yarn workspaces เป็นที่นิยมในโมโนเรโป React Native ที่มีโค้ดร่วมกัน
yarn workspaces ในโมโนเรโป React Native: package.json รากมี "workspaces": ["packages/*", "mobile"] yarn install สร้างโฟลเดอร์ node_modules เดียวที่ระดับราก แพ็คเกจอ้างอิงซึ่งกันและกันผ่าน symlink npx pod-install ถูกเรียกใช้หลังจากเปลี่ยน dependencies เนทีฟเพื่ออัปเดต CocoaPods
{
"private": true,
"workspaces": [
"packages/*",
"apps/mobile",
"apps/web"
],
"scripts": {
"mobile:start": "yarn workspace mobile start",
"mobile:ios": "yarn workspace mobile ios",
"lint": "yarn workspaces run lint"
}
}
Expo SDK 50+ แนะนำ yarn อย่างเป็นทางการสำหรับโปรเจกต์ใหม่ที่สร้างผ่าน npx create-expo-app yarn รับประกันความเข้ากันได้กับโมดูล Expo และสร้าง yarn.lock ที่ถูกต้องโดยอัตโนมัติ Zero-Installs ใน yarn 3+ อนุญาตให้ commit แคชในพื้นที่จัดเก็บ — นักพัฒนาได้รับสภาพแวดล้อมที่พร้อมใช้งานโดยไม่ต้องติดตั้ง dependencies หลังจาก git clone
npm และ yarn แก้ปัญหาเดียวกัน — การจัดการแพ็คเกจ Node.js ด้วยการเปิดตัว npm 5-7 ช่องว่างด้านฟังก์ชันเกือบจะหายไป npm 7+ รวม workspaces, npm ci (เทียบเท่า yarn install --frozen-lockfile) และการติดตั้งแบบขนาน อย่างไรก็ตาม yarn ยังคงข้อได้เปรียบในสถานการณ์เฉพาะ: Plug'n'Play, Zero-Installs และระบบ constraints ที่โตเต็มที่
| คุณลักษณะ | npm | yarn |
|---|---|---|
| ปีที่สร้าง | 2010 | 2016 |
| ไฟล์ lock | package-lock.json (JSON) | yarn.lock (YAML) |
| การติดตั้ง | แบบลำดับ (npm 5+) | แบบขนาน |
| Plug'n'Play | ไม่ | ใช่ (yarn 2+) |
| Workspaces | ใช่ (npm 7+) | ใช่ |
| Zero-Installs | ไม่ | ใช่ (yarn 3+) |
| แคช | node_modules ที่มีการทำให้แบน | ทั่วโลก ~/.cache/yarn |
| ภาษาที่ใช้ | JavaScript | TypeScript (yarn 2+) |
เมื่อใดควรเลือก yarn: โปรเจกต์บน Expo SDK 50+, โมโนเรโปขนาดใหญ่ (100+ แพ็คเกจ), ทีมที่ให้ความสำคัญกับ Zero-Installs สำหรับการตั้งค่าสภาพแวดล้อมที่รวดเร็ว และโปรเจกต์ดั้งเดิมที่ใช้ yarn อยู่แล้ว เมื่อใดควรเลือก npm: โปรเจกต์ create-react-app มาตรฐาน, Next.js, Vite, ทีมที่ไม่มีข้อกำหนดเฉพาะเกี่ยวกับตัวจัดการแพ็คเกจ
yarn 4 (2024) นำเสนอประสิทธิภาพที่ปรับปรุงแล้ว, การรองรับ ESM ดั้งเดิม และการปรับให้เหมาะสมสำหรับโมโนเรโปขนาดใหญ่ npm 10+ ยังคงพัฒนาต่อไปโดยเน้นที่ความปลอดภัยและความเข้ากันได้ การเลือกระหว่าง npm และ yarn ในปัจจุบันเป็นเรื่องของความชอบของทีมและข้อกำหนดเฉพาะของโปรเจกต์ ไม่ใช่ความเหนือกว่าทางเทคนิคของเครื่องมือหนึ่งเหนืออีกเครื่องมือหนึ่ง
คำถามที่พบบ่อย
yarn ในตอนแรกเหนือกว่า npm ในด้านความเร็วด้วยการติดตั้งแพ็คเกจแบบขนานและการแคชที่เข้มข้น yarn.lock ถูกสร้างโดยอัตโนมัติในการติดตั้งทุกครั้ง ในขณะที่ package-lock.json ปรากฏใน npm 5 yarn นำเสนอ Plug'n'Play — ทางเลือกแทน node_modules โดยไม่มีเวลาในการติดตั้ง ด้วย npm 7+ ความแตกต่างด้านความเร็วและฟังก์ชันสำหรับสถานการณ์พื้นฐานนั้นน้อยมาก
yarn workspaces — กลไกสำหรับการจัดการหลายแพ็คเกจในพื้นที่จัดเก็บเดียว package.json รากมีฟิลด์ "workspaces": ["packages/*"] yarn install ติดตั้ง dependencies ที่ใช้ร่วมกันที่ระดับบนสุดใน node_modules เดียว สร้าง symlink ระหว่างแพ็คเกจท้องถิ่น และหลีกเลี่ยงการซ้ำซ้อน คำสั่งถูกเรียกใช้สำหรับ workspaces ทั้งหมดผ่าน yarn workspaces run <script>
Plug'n'Play (PnP) — ทางเลือกแทนโฟลเดอร์ node_modules แบบดั้งเดิม เปิดตัวใน yarn 2 แทนที่จะคัดลอกไฟล์ yarn สร้างแผนที่ dependencies ใน .pnp.cjs และเก็บแพ็คเกจในไฟล์ ZIP ในแคชทั่วโลก ข้อดีของ PnP: การติดตั้งในไม่กี่วินาที เวลาเริ่มต้น Node.js ลดลง 30-50%, ไม่มี node_modules และปัญหาเส้นทางที่เกี่ยวข้อง
ติดตั้ง yarn ทั่วโลก: npm install -g yarn ในรากของโปรเจกต์ เรียกใช้ yarn import — yarn อ่าน package-lock.json และสร้าง yarn.lock ที่เทียบเท่า ลบ node_modules และ package-lock.json เรียกใช้ yarn install เพื่อตรวจสอบ อัปเดตการกำหนดค่า CI/CD โดยแทนที่ npm ด้วย yarn yarn เข้ากันได้อย่างสมบูรณ์กับ package.json
ข้อผิดพลาด "Integrity check failed" เกิดขึ้นเมื่อ yarn.lock และ node_modules ไม่ซิงค์กัน วิธีแก้ไข: ลบ node_modules, yarn.lock และล้างแคช (yarn cache clean) จากนั้นเรียกใช้ yarn install อีกครั้ง สำหรับข้อขัดแย้งเวอร์ชัน ให้ใช้ yarn upgrade-interactive เพื่อเลือกการอัปเดตเฉพาะ yarn dedupe จะลบแพ็คเกจที่ซ้ำกัน
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ