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 и провјеру интегритета путем контролних сума. 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 и инсталира зависности. 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 архиви са контролном сумом. yarn cache се чисти аутоматски, али се може извршити yarn cache clean ручно. yarn cache dir показује путању до кеша. yarn cache list — листа кешираних пакета.
yarn.lock — фајл за фиксирање тачних верзија свих зависности и њихових транзитивних пакета. За разлику од 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 — његове зависности, checksum — контролна сума за верификацију. yarn.lock се комитује у репозиторијум и представља једини извор истине за зависности. Ако се yarn.lock и package.json разилазе, yarn издаје упозорење.
Yarn constraints — систем правила за монорепозиторијуме који провјерава и присилно задаје верзије зависности у 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 фиксира верзије native модула, што је критично за стабилну компилацију путем CocoaPods (iOS) и Gradle (Android). yarn workspaces су популарни у React Native монорепозиторијумима са заједничким кодом.
yarn workspaces у React Native монорепозиторијумима: коријенски package.json садржи "workspaces": ["packages/*", "mobile"]. yarn install креира јединствени node_modules фолдер на коријенском нивоу. Пакети се позивају једни на друге путем симлинкова. npx pod-install се извршава након промјене native зависности за ажурирање 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+ омогућава комитовање кеша у репозиторијум — програмери добијају готово окружење без инсталације зависности након 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 са flattening | Глобални ~/.cache/yarn |
| Језик имплементације | JavaScript | TypeScript (yarn 2+) |
Када изабрати yarn: пројекти на Expo SDK 50+, велики монорепозиторијуми (100+ пакета), тимови који цијене Zero-Installs за брзо подешавање окружења и legacy пројекти који већ користе yarn. Када изабрати npm: стандардни пројекти create-react-app, Next.js, Vite, тимови без специфичних захтјева према менаџеру пакета.
yarn 4 (2024) представио је побољшане перформансе, native 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 инсталира заједничке зависности на горњем нивоу у јединствени node_modules, креира симлинкове између локалних пакета и избјегава дуплирање. Команде се покрећу за све workspace-ове путем yarn workspaces run <script>.
Plug'n'Play (PnP) — алтернатива традиционалном node_modules фолдеру, представљена у yarn 2. Умјесто копирања фајлова, yarn креира мапу зависности у .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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође