React Canaries: Увімкнення інкрементного розгортання функцій за межами Meta

3 травня 2023 року від Дена Абрамова, Софі Альперт, Ріка Хенлона, Себастьяна Маркбоге та Ендрю Кларка


Ми хотіли б запропонувати React-спільноті можливість прийняти окремі нові функції, як тільки їх дизайн буде близький до фінального, перш ніж вони будуть випущені у стабільній версії - подібно до того, як Meta вже давно використовує найновіші версії React для внутрішнього використання. Ми представляємо новий офіційно підтримуваний канал релізу. Він дозволяє кураторським установкам, таким як фреймворки, відокремити прийняття окремих функцій React від графіка випуску React.


tl;dr

  • Ми представляємо офіційно підтримуваний Канал випусків для React. Оскільки він офіційно підтримується, якщо в ньому траплятимуться регресії, ми розглядатимемо їх з такою ж терміновістю, як і помилки в стабільних релізах.
  • Canary дозволяє почати використовувати окремі нові можливості React ще до того, як вони з'являться у напівстабільних релізах.
  • На відміну від каналу Experimental, React Canaries включає лише ті функції, які ми обґрунтовано вважаємо готовими до прийняття. Ми заохочуємо фреймворки розглянути можливість використання закріплених випусків Canary React.
  • Ми повідомлятимемо про суттєві зміни та нові можливості у нашому блозі, коли вони з'являтимуться у випусках Canary.
  • Як завжди, React продовжує слідувати semver для кожного стабільного релізу.

Як зазвичай розробляються функції React

Зазвичай, кожна функція React проходить ті самі етапи:

  1. Розробляємо початкову версію і додаємо до неї префікс experimental_ або unstable_. Функція доступна лише у каналі експериментальних релізів. Очікується, що на цьому етапі функція суттєво зміниться.
  2. Ми знайшли в Meta команду, яка готова допомогти нам протестувати цю функцію і надати відгуки про неї. Це призвело до низки змін. Коли функція стає стабільнішою, ми співпрацюємо з більшою кількістю команд в Meta, щоб випробувати її.
  3. Зрештою, ми відчуваємо впевненість у дизайні. Ми прибираємо префікс з назви API і робимо функцію доступною за замовчуванням у гілці main, яку використовує більшість продуктів Meta. На даний момент будь-яка команда Meta може використовувати цю можливість.
  4. Оскільки ми стаємо впевненішими у цьому напрямку, ми також публікуємо RFC для нової функції. На даний момент ми знаємо, що дизайн працює для широкого набору випадків, але ми можемо внести деякі корективи в останню хвилину.
  5. Коли ми близькі до завершення випуску відкритого коду, ми пишемо документацію для компонента і нарешті випускаємо його у стабільному релізі React.

Цей плейбук добре працює для більшості функцій, які ми випустили до цього часу. Однак може існувати значний розрив між моментом, коли функція загалом готова до використання (крок 3), і моментом, коли її буде випущено у відкритому коді (крок 5).

Ми хотіли б запропонувати React-спільноті можливість слідувати тому ж підходу, що і Meta, і приймати окремі нові функції раніше (коли вони стають доступними) без необхідності чекати наступного циклу релізу React.

Як завжди, всі можливості React з часом потраплять до стабільного релізу.

Можемо просто робити більше дрібних релізів?

Зазвичай ми використовуємо малі випуски для впровадження нових можливостей.

Втім, це не завжди можливо. Іноді нові можливості пов'язані з іншими новими можливостями, які ще не повністю завершені і над якими ми все ще активно працюємо. Ми не можемо випустити їх окремо, оскільки їхні реалізації пов'язані між собою. Ми не можемо випускати їх окремо, тому що вони впливають на ті самі пакети (наприклад, react і react-dom). І нам потрібно зберегти можливість ітерації над частинами, які ще не готові, без шквалу випусків великих версій, що вимагав би від нас semver.

На Meta ми вирішили цю проблему, збираючи React з гілки main і вручну оновлюючи його до певного закріпленого коміту щотижня. Це також підхід, якого дотримуються випуски React Native протягом останніх кількох років. Кожен стабільний реліз React Native закріплений за певним комітом з гілки main репозиторію React. Це дозволяє React Native включати важливі виправлення та поступово впроваджувати нові можливості React на рівні фреймворку без прив'язки до глобального графіку випуску React.

Ми хотіли б зробити цей робочий процес доступним для інших фреймворків та кураторських налаштувань. Наприклад, він дозволяє фреймворку поверх React включити пов'язане з React виправлення до того, як це виправлення буде включено в стабільний реліз React. Це особливо корисно, тому що деякі зміни впливають лише на інтеграції фреймворку. Це дозволяє фреймворку випустити таку зміну у власній молодшій версії, не порушуючи semver.

Поширення релізів на каналі Canaries дозволить нам мати тісніший цикл зворотного зв'язку і гарантувати, що нові можливості будуть всебічно протестовані у спільноті. Цей робочий процес ближчий до того, як TC39, комітет зі стандартів JavaScript, обробляє зміни на пронумерованих етапах. Нові можливості React можуть бути доступні у фреймворках, побудованих на React, до того, як вони потраплять у стабільний реліз React, так само як нові можливості JavaScript постачаються у браузерах до того, як вони будуть офіційно затверджені як частина специфікації.

Чому б не використовувати експериментальні випуски?

Хоча ви можете технічно використовувати експериментальні релізи, ми не рекомендуємо використовувати їх у виробництві, оскільки експериментальні API можуть зазнавати значних змін на шляху до стабілізації (або навіть можуть бути повністю видалені). Хоча Canaries також можуть містити помилки (як і будь-який реліз), в майбутньому ми плануємо повідомляти про будь-які значні зміни в Canaries в нашому блозі. Canaries найбільш близькі до коду, який Meta виконує всередині, тому ви можете очікувати, що вони будуть відносно стабільними. Однак вам необхідно зберігати закріплений реліз і вручну сканувати журнал коммітів GitHub при оновленні між закріпленими коммітами.

Ми очікуємо, що більшість людей, які використовують React поза межами кураторської установки (як фреймворк), захочуть продовжувати використовувати стабільні релізи. Однак, якщо ви створюєте фреймворк, ви можете розглянути можливість встановлення версії React на Canary, прив'язаної до певного комміту, і оновлювати її у своєму власному темпі. Перевага такого підходу полягає в тому, що ви можете випускати окремі завершені функції та виправлення React раніше для ваших користувачів і за вашим власним графіком, подібно до того, як це робиться в React Native протягом останніх кількох років. Недоліком є те, що ви берете на себе додаткову відповідальність за перевірку того, які комміти React підтягуються, і повідомляєте користувачам, які зміни React включені до ваших релізів.

Якщо ви автор фреймворку і хочете спробувати цей підхід, будь ласка, зв'яжіться з нами.

Завчасне оголошення про суттєві зміни та нові функції

Релізи Canary - це наше найкраще припущення щодо того, що увійде до наступного стабільного релізу React у будь-який момент часу.

Традиційно ми оголошували про порушення змін лише наприкінці циклу релізу (коли робили старший реліз). Тепер, коли релізи Canary є офіційно підтримуваним способом використання React, ми плануємо перейти до анонсування важливих змін та значних нових функцій по мірі їх появи в Canaries. Наприклад, якщо ми об'єднаємо важливу зміну, яка вийде в Canaries, ми напишемо про це пост в блозі React, включаючи кодомоди та інструкції з міграції, якщо це необхідно. Потім, якщо ви автор фреймворку, який випускає старший реліз, що оновлює закріплений React Canary, щоб включити цю зміну, ви можете зробити посилання на наш блог у примітках до вашого релізу. Нарешті, коли буде готова стабільна основна версія React, ми дамо посилання на вже опубліковані публікації в блозі, що, як ми сподіваємося, допоможе нашій команді швидше просуватися вперед.

Ми плануємо документувати API, коли вони з'являються на Canary - навіть якщо ці API ще не доступні за її межами. API, доступні лише на Canary, будуть позначені спеціальною приміткою на відповідних сторінках. Це стосується таких API, як use, а також деяких інших (наприклад, cache і createServerContext), для яких ми надішлемо RFC.

Канали потрібно закріпити

Якщо ви вирішили застосувати робочий процес Canary для вашої програми або фреймворку, переконайтеся, що ви завжди закріплюєте точну версію Canary, яку ви використовуєте. Оскільки Сanary є попередніми версіями, вони все ще можуть містити шкідливі зміни.

Приклад: Компоненти сервера React

>Приклад: Компоненти сервера React

Як ми анонсували в березні, угода про компоненти сервера React завершена, і ми не очікуємо значних змін, пов'язаних з їх користувацьким контрактом API. Однак, ми ще не можемо випустити підтримку компонентів сервера React у стабільному релізі React, оскільки все ще працюємо над кількома взаємопов'язаними фреймворковими функціями (такими як завантаження ресурсів) і очікуємо більше змін, що порушують роботу фреймворку.

Це означає, що Компоненти сервера React готові до прийняття фреймворками. Однак, до наступного старшого релізу React, єдиний спосіб для фреймворку прийняти їх - це випустити закріплену версію React на Canary. (Щоб уникнути створення двох копій React, фреймворки, які бажають це зробити, повинні забезпечити роздільну здатність react та react-dom у закріпленій Canary, яку вони постачають разом зі своїм фреймворком, і пояснити це своїм користувачам. Як приклад, ось що робить Next.js App Router.)

Тестування бібліотек у стабільній та Canary версіях

Ми не очікуємо, що автори бібліотеки будуть тестувати кожен окремий реліз Canary, оскільки це було б надто складно. Однак, як і тоді, коли ми вперше представили різні канали попереднього випуску React три роки тому, ми заохочуємо бібліотеки тестувати як останню стабільну, так і останню версію Canary. Якщо ви помітили зміну в поведінці, про яку не було оголошено, будь ласка, створіть ваду в репозиторії React, щоб ми могли допомогти її діагностувати. Ми очікуємо, що коли ця практика стане загальноприйнятою, вона зменшить кількість зусиль, необхідних для оновлення бібліотек до нових основних версій React, оскільки випадкові регресії будуть виявлятися по мірі їх появи.

Строго кажучи, Canary не є новим каналом релізів - раніше він називався Next. Однак ми вирішили перейменувати його, щоб уникнути плутанини з Next.js. Ми оголошуємо його як канал нових релізів, щоб повідомити про нові очікування, наприклад, про те, що Canaries є офіційно підтримуваним способом використання React.

Стабільні релізи працюють як і раніше

Ми не вносимо жодних змін до стабільних випусків React.