Анонсуємо Dart Sass

протягом кількох останніх місяців ми тихо працювали треба новим проектом. Сьогодні я готова анонсувати Dart Sass всього світу. Це абсолютно нова імплементація Sass, створена, щоб бути швидкої і легкої в установці і розробки. Вона ще не завершена — я веду роботу по приведенню її у відповідність з специфікацією Sass — так що сьогодні я просто публікую версію 1.0.0-alpha.1. Але вона досить надійна, щоб можна було скачати, погратися з нею і почати повідомляти баги.

Ви можете скачати архів з зі сторінки релізу — просто розпакуйте його, додайте директорію у path, і запустіть
dart-sass
. Dart також компілюється в JavaScript, так що якщо у вас встановлений npm, то ви можете встановити JS-версію запустивши
npm install -dart g-sass
. І якщо ви вже є користувачем Dart, то можете його встановити через
pub global dart-sass
.
Навіщо переписувати Sass?
протягом останніх кількох років було дві основні реалізації Sass. Ruby Sass був першим, написаним в основному мною при істотній підтримці Кріса. Він був високорівневим і легким для розробки, і був тим місцем, де ми обкатували і випускали нові можливості. Потім з'явився LibSass — імплементація на C++, спочатку створена Аароном і Гемптоном, а в даний час підтримується Марселем і Майклом. Це низькорівнева версія, що робить її швидкої і легкої в установці і вбудовуванні в інші мови. Зокрема, байндинг до Node.js є дуже популярним способом використання Sass в світі JavaScript.
Гідності кожної версії доповнюють слабкості іншої. Там де LibSass швидка і переносима, Ruby Sass повільний і складний до встановлення не-Ruby користувачами. Зате Ruby Sass простіше в розробці, в той час як в LibSass додавати нові можливості набагато складніше через нізькорівневої мови. Хоча взаємодоповнюючі відносини можуть бути здоровими, але це так само означає, що жодне з рішень не таке гарне, яким мало би бути. Це ми виявили, коли в травні Марсель офіційно покинув команду LibSass. (Примітка автора: Я кажу "офіційно", тому що він все ще бере участь в проекті по мірі можливості, але не в тому обсязі як офіційний розробник).
Позбавлені зусиль двох людей, ми були не впевнені, що LibSass зможе підтримувати темп, так що Кріс і я захотіли внести зміни в мову, що використовується. Протягом довгого часу було зрозуміло, що Ruby Sass набагато повільніше при обробці великих таблиць стилів. Нам потрібна була нова імплементація, яка могла б швидко генерувати CSS швидко додавати нову функціональність.
Чому Dart?
Ми розглянули декілька можливих мов і зупинилися на Dart з кількох причин. По-перше, він дійсно швидкий – Dart-VM в основному сильно швидше ніж JavaScript VM попередні бенчмарки показують, що для великих файлів Dart Sass в 5-10 разів швидше Ruby Sass і тільки в 1,5 рази повільніше LibSass. (Примітка автора: Я не експерт в бенчмарках, і в тестах були підібрані (ad hoc — пер.) нерепрезентативні вихідні файли. Якщо хтось зацікавлений у роботі над більш науковими вимірами, дайте мені знати). З побоюванням припущу, що це буде в 1,5-2 рази швидше спеціалізованої JS-реалізації, але не можу сказати впевнено. Крім того, продуктивність Dart покращується з часом.
В той час як з Dart легко працювати набагато легше, ніж з C++, і в деякій мірі легше ніж з Ruby для такого великого проекту. Звичайно, не так багато людей знайомі з ним, як з JavaScript, але робота над реалізацією мови не передбачає безлічі зовнішніх учасників у будь-якому випадку. Я буду робити велику частину роботи над новою імплементацією, і Dart це мову з яким я особисто відчуваю себе комфортно в даний момент (в той час, коли я не працюю над Sass, я в команді Dart). Використання Dart дає мені надбавку в швидкості.
На відміну від Ruby або JavaScript, Dart статично типізований, так що тип кожного значення може бути виведений без необхідності запускати сам код. Також, на відміну від C++, він зі збиранням сміття, тобто нам не потрібно турбуватися про приборку за собою. Це робить його легким для написання, редагування і підтримки. Може бути, навіть більш важливо те, що він легко транслюється в інші мови програмування, що дозволить LibSass отримувати нові можливості швидше.
Остання причина вибору Dart, це те, що деякі мови можуть похвалитися: сумісність з JavaScript. Dart може бути скомпільований в JavaScript, який може безпосередньо використовуватися в Node.js і навіть можливо в браузері. Велика частина екосистеми Sass побудована на node-sass, і ми маємо намір зробити JS-версію Dart Sass як можна більш сумісною з API c node-sass, щоб можна було легко перекинути на нову версію існуючі інструменти і системи складання.
Єдиний недолік тут – це провал по швидкості: Dart Sass приблизно вдвічі повільніше при запуску на V8 порівняно з Dart VM. Однак, він все ще дає впевнений приріст у 3-4 рази порівняно з Ruby Sass. У підсумку, ми також сподіваємося, що зможемо надати користувачам JS-версії шлях міграції на Dart VM настільки легкий, наскільки можливо.
Що ж станеться з Рештою Имплементациями?
Ніяких змін в розробці LibSass. Майкл напружено працює над додаванням нових можливостей Sass 3.5, і ми очікуємо, що цей процес триватиме щонайменше додавання нової функціональності. Єдиною відмінністю стане те, що LibSass більше не буде зобов'язана бути строго сумісна з останньою версією мови, перед запуском цієї версії, оскільки вона більше не буде єдиною версією з розумною продуктивністю.
Більше гнучкості виллється в більш швидкі релізи LibSass, які поставлять на перший план можливості, які користувачі хочуть сильніше всього. Сувора сумісність значила, що важливі нововведення, такі, як, наприклад, підтримка користувальницьких CSS-властивостей не можуть бути випущені до тих пір, поки не будуть оброблені всі маленькі й хитрі граничні випадки, які були у відповідній версії Ruby Sass, наприклад,
об'єднання :root
. Ми все ще намагаємося досягати максимальної сумісності, наскільки можливо, але ми не будемо дозволяти стояти їй на шляху у швидкості.
Ruby Sass в кінцевому підсумку піде зовсім, якщо не з'явиться новий розробник для нього. Ми не хочемо робити перехід раптовим, ризикуючи розколоти екосистему: я і Кріс збираємося підтримувати його протягом одного року, що включає підтримку функціональності на тому ж рівні, що додаватиметься Dart Sass. Якщо хтось зацікавлений в участі як розробник після цього періоду, ми будемо раді познайомити його з кодом протягом наступного року. А якщо ніхто не виступить, то Ruby Sass буде офіційно визнаний застарілим і непідтримуваних.
Я хочу підкреслити, що ми не здійснюємо рішення припинити розробку Ruby Sass просто так. Це велика і не просте для мене зміна, я безперервно працював над ним майже 10 років, і мені складно дозволити піти цієї історії. Але ми з Крісом ретельно обговорили це і схилилися до того, що це правильний хід. Ми присвятили так багато часу Sass, що це більше не має сенсу витрачати цей час на реалізацію, повільну настільки, що це неприйнятно для наших найбільших користувачів.
далі
Перед тим як ми випустимо першу стабільну версію Dart Sass, є кілька великих речей в нашому списку:
  • Повна сумісність зі специфікацією Sass. Тут все ще є моменти, де Dart Sass веде себе неправильно, особливо у відношенні
    @extend
    . Я не очікую ніякої особливої несумісності, яку буде важко вирішити, специфікація Sass досить вичерпна, так що це лише справа зменшення кількості непройдених тестів до нуля.
  • Досить близька сумісність з
    render()
    з node-sass. Цей API є основною точкою входу в LibSass в світі JavaScript. Саме так системи збирання запускають Sass, користувачі визначають свої власні Sass-функції і Eyeglass передає свої модулі в Sass. Ми хочемо підтримати API з достатньою мірою, щоб існуюча екосистема працювала з Dart Sass.
  • Сумісність Dart і Ruby Sass. Тут є кілька випадків, де Dart-функціональність навмисно відрізняється від Ruby, зокрема, там де поведінка Ruby розцінюється як баг. Ми повинні додати попередження про це в Ruby Sass або, якщо ми зможемо це зробити з мінімальними правками, внести нове поведінка і Ruby.
Тут ще кілька пунктів, які ми хотіли б зробити в кінцевому рахунку, як, наприклад, підтримка Sass в браузері і надання node-sass-сумісної обгортки для Sass на Dart VM, але це не блокує початковий реліз.
В подальшому майбутньому
На кілька наступних місяців я бачу багато роботи по становленню Dart Sass стабільніше і сумісності, а також додавання можливостей Sass 3.5 LibSass. Я думаю, що швидше всього на початку 2017 ми побачимо стабільний реліз Dart Sass і версію LibSass 3.5. В цей час ми визначимося з нашим поглядом на велику функціональність і почнемо працювати над Sass 4.0 і його абсолютно нової системою модулів.
Dart Sass не є великою зміною, але в той же час захоплюючою. Це дозволить нам швидше доставляти нову функціональність в руки користувачів, а також змусити цю функціональність працювати швидше. Крім того, це дозволить користувачам легко встановити і запустити еталонну імплементацію. І, нарешті, це вперше дасть нам продуктивний шлях запустити Sass на чистому JavaScript. Переваги такі більше великі і відчутні, що я впевнена, що він коштують витрат.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.