Отложенные устаревшие сборки, ленивые плагины, meteor create --react, Babel 7, Mongo 4 и т. Д.

Ни для кого не секрет, что с Метеором 1.7 время восстановления увеличилось. В конце концов, создание совершенно нового клиентского пакета для устаревших браузеров требует времени. Мы были полностью осведомлены об этом падении производительности, когда выпустили Meteor 1.7, но обещание освободить современные браузеры от жестких ограничений устаревшей совместимости, казалось, стоило некоторых технических долгов, если у нас был план погашения этих долгов в будущем. .

Что ж, это будущее сейчас, и Meteor 1.8 является кульминацией этого плана.

Мы не только устранили многие проблемы с производительностью, характерные для Meteor 1.7, но и глубоко погрузились в исторические внутренности системы плагинов компилятора Meteor, начиная с версии 1.2 (сентябрь 2015 года!), Чтобы добиться впечатляющих улучшений времени сборки, и все это. без ущерба для наших фундаментальных ограничений дизайна.

Повышение производительности

Отложенные устаревшие сборки

Meteor 1.7 представил новый пакет клиента под названием web.browser.legacy в дополнение к пакетам web.browser (современный) и web.cordova, чтобы современные вечнозеленые браузеры больше не были вынуждены запускать код, скомпилированный для браузеров, которые перестали получать обновления программного обеспечения много лет назад.

Эта разработка остается значительным конкурентным преимуществом для Meteor, поскольку ни один другой фреймворк не смог успешно скопировать эту функциональность, хотя есть некоторая путаница в том, что считать успехом. В этом выступлении я предсказал, что другим фреймворкам будет сложно последовать его примеру, и мое утверждение все еще остается в силе:

Естественно, этот дополнительный пакет увеличил время сборки (и восстановления) клиента. В то время нам было комфортно с этим падением производительности, потому что это было похоже на цену прогресса, а также потому, что мы полагали, что можем улучшить время сборки по всем направлениям в следующем выпуске, вместо того, чтобы принимать радикальные меры, такие как отключение устаревшей сборки в разработке.

Однако, поскольку разработчики тратят большую часть своего времени на тестирование современного пакета в процессе разработки, а устаревший пакет в основном обеспечивает безопасный откат в производственной среде, Meteor 1.8 ловко откладывает сборку устаревшего пакета до момента перезапуска сервера разработки, так что разработка можно продолжить, как только будет завершена сборка современного пакета.

Поскольку устаревшая сборка теперь происходит в то время, когда процесс сборки в противном случае полностью простаивал бы, влияние устаревшей сборки на производительность сервера разработки минимально. Тем не менее, устаревший пакет по-прежнему регулярно перестраивается, поэтому любые устаревшие ошибки сборки будут обнаруживаться своевременно, а устаревшие клиенты могут протестировать новый устаревший пакет, ожидая немного дольше, чем современные клиенты. Приложения, использующие пакеты autoupdate или hot-code-push, будут перезагружать современные и устаревшие клиенты независимо, как только каждый новый пакет станет доступным.

Другими словами, мы почти устранили технический долг по компиляции дополнительного клиентского пакета, что было одной из главных причин замедления времени сборки в Meteor 1.7. И мы сделали это, не возлагая на разработчиков Meteor какой-либо дополнительной нагрузки по настройке. 🚫 🏗✨

Плагины ленивого компилятора

Даже если бы мы не выяснили, как отложить выпуск устаревшей сборки, Meteor 1.8 все равно будет быстрее, чем Meteor 1.7, с большим отрывом, потому что мы внесли ряд других существенных улучшений производительности, сократив время сборки по всем направлениям для современных, устаревших , Кордова и серверные комплекты. Фактически, стирание стоимости устаревшего пакета было просто вишенкой на торте по сравнению с тем, что мы собираемся описать.

Фантазия, которой мы никогда не позволим

Когда вы разрабатываете систему компиляции, возникает соблазн предположить, что отдельные файлы можно компилировать по одному, потому что это предположение значительно упрощает инкрементную перекомпиляцию, отслеживание зависимостей и кэширование. Например, Babel никогда не нужно смотреть на другие модули JavaScript, чтобы определить, как скомпилировать текущий модуль.

Это предположение не работает для таких языков, как TypeScript, для многих диалектов компиляции в CSS, таких как LESS и SASS, и для любого языка программирования, который должен выполнять статический анализ нескольких файлов во время сборки. Если один модуль TypeScript импортирует enum из другого модуля, например, компилятор должен знать не только то, что экспорт был enum, но также был ли он const enum или нет, потому что это влияет на то, могут ли значения enum быть скомпилированы до целочисленные константы в другом месте программы. МЕНЬШЕ миксинов, импортированных из других файлов, бесполезны без доступа к содержимому файла, в котором миксин был определен.

По этим причинам система плагинов компилятора Meteor была разработана с самого начала для предоставления полного списка файлов, которые, возможно, потребуется скомпилировать в любой плагин компилятора, который регистрирует интерес к обработке определенного расширения файла, такого как .js, .ts или .less, а не вызов плагина компилятора один раз для каждого отдельного файла. Это было абсолютно правильное решение, и мы не собираемся когда-либо отказываться от него.

Цена соблюдения наших принципов

Хотя мы по-прежнему привержены этому дизайну, мы также должны признать, что он поощряет плагины компилятора компилировать каждый полученный файл, независимо от того, будет ли этот файл когда-либо фактически импортирован, и даже если скомпилированный код нигде не появляется в окончательной сборке.

На эту ненужную компиляцию приходится значительная часть времени сборки во многих крупных приложениях Meteor, и поэтому мы рады сообщить, что Meteor 1.8 наконец-то представляет простой механизм, позволяющий избежать компиляции неиспользуемых файлов.

Если вы не поддерживаете какие-либо плагины компилятора, вы можете спокойно пропустить оставшуюся часть этого раздела и просто автоматически насладиться преимуществами этой новой функции!

Вот как это работает. Плагины компилятора, которые вызывают inputFile.addJavaScript или inputFile.addStylesheet, теперь могут задерживать дорогостоящую работу по компиляции, передавая частичные параметры ({ path, hash }) в качестве первого аргумента, а затем функцию обратного вызова в качестве второго аргумента, которая будет вызываться системой сборки, как только она узнает, что модуль будет входит в комплект. Например, вот старая реализация BabelCompiler#processFilesForTarget:

а вот и новая версия:

Плагин компилятора по-прежнему обрабатывает все возможные файлы и должен указывать, как каждый файл должен быть скомпилирован (с помощью функции обратного вызова), но любые неиспользуемые файлы теперь будут игнорироваться системой сборки, а их невызванные обратные вызовы будут отброшены после сборки пакета. . ☎️ 🚮 👋

Если вы поддерживаете плагин компилятора, мы настоятельно рекомендуем перейти на этот новый API, поскольку преимущества производительности для ваших пользователей потенциально огромны. Хотя этот новый API доступен только в Meteor 1.8, вы можете использовать inputFile.supportsLazyCompilation, чтобы динамически определять, доступен ли API, поэтому вы можете поддерживать старые версии Meteor без необходимости поддерживать несколько версий вашего плагина.

Обновления зависимостей

Вавилон 7

Когда был выпущен Meteor 1.7, Babel 7 все еще находился в стадии бета-тестирования (в частности, бета 49). Meteor очень внимательно следит за пререлизами Babel, поставляя новую версию нашего babel-compiler пакета почти для каждого бета-релиза (все 56 из них) и релиз-кандидата.

Хотя доставка бета-версии программного обеспечения сопряжена с риском, мы были уверены, что сможем обойти любые критические изменения или ошибки, используя нашу meteor-babel абстракцию, тем самым защитив разработчиков Meteor от этих сбоев. Тем не менее, большое облегчение, что Babel 7 был завершен, и мы можем вернуться к нормальному семантическому управлению версиями для будущих выпусков.

Из-за особого критического изменения в @babel/[email protected] (удаление каталога @babel/runtime/helpers/builtin) мы не будем обновлять Meteor 1.7.0.x и ранее до окончательной версии Babel 7. Эти версии Meteor останутся в версии 7.0.0- beta.55. Другими словами, обновление до Meteor 1.8 необходимо, чтобы получить преимущества не бета-версии Babel 7, и вы обязательно захотите установить последнюю версию @babel/runtime, выполнив следующую команду:

meteor npm install @babel/runtime@latest

Если вы использовали собственные плагины Babel в файле .babelrc, сейчас самое время убедиться, что они полностью совместимы с Babel 7.

Монго 4

Meteor 1.8 поставляется с MongoDB 4.0.2, основным обновлением версии 3.6.4 в Meteor 1.7. Это означает, что ваша локальная база данных разработки теперь будет использовать версию 4.0, хотя драйвер [email protected] будет успешно подключаться к производственным базам данных, начиная с Mongo 2.6:



Ключевым преимуществом MongoDB 4.0 является поддержка многодокументных транзакций, которые теперь поддерживаются системой хвостовой обработки журналов операций Meteor благодаря this pull request. Конечно, если вы решите использовать транзакции в процессе разработки, вы также захотите использовать MongoDB 4.0 в производственной среде. Ваш провайдер базы данных должен быть в состоянии помочь с этим.

Максимально эффективное использование этой версии MongoDB будет постоянным процессом, но мы уверены, что обновление должно быть в основном бесшовным для приложений, которые ранее использовали MongoDB 3.x.

Node.js 8.12.0 *

* На данный момент все еще 8.11.4.

Первоначально мы планировали выпустить Node.js 8.12.0 с Meteor 1.8, но эти планы были прерваны достоверными сообщениями о высокой загрузке ЦП в производственной среде, по-видимому, из-за чрезмерной сборки мусора. Эти отчеты начались, когда Meteor 1.8 находился на стадии финального релиза-кандидата, поэтому мы не чувствовали себя комфортно, продвигаясь с обновлением 8.12.0. Вместо этого Meteor 1.8 поставляется с предыдущей версией 8.11.4.

Если вы хотите начать использовать Node.js 8.12.0 (возможно, из-за улучшения производительности, связанного с использованием Meteor Fibers), мы рекомендуем вам принять участие в предварительном выпуске Meteor 1.8.1. Просто запустите команду

meteor update --release 1.8.1-beta.n

где n в beta.n относится к самой последней бета-версии в нашем запросе на перенос версии 1.8.1. Первый выпуск, включающий Node.js 8.12.0, также является первым бета-выпуском 1.8.1-beta.0. Если вы развернете приложение в Galaxy с этой версией Meteor, оно будет автоматически выполнено с использованием Node.js 8.12.0. Пожалуйста, сообщите о своих выводах (хороших, плохих или интересных) в этом выпуске.

Мы надеемся выпустить Meteor 1.8.1, как только сможем диагностировать и исправить эти проблемы с производительностью, и это произойдет раньше, если вы сможете воспроизвести проблему или иным образом помочь нам выяснить, что происходит! 🐌 🔜

Функции, которые вы всегда хотели

Meteor create --react

Meteor был отличным способом использования React почти на протяжении всего существования React. Фактически, мой личный интерес к Meteor возродился, когда я работал в Facebook в команде инфраструктуры JavaScript, которая отвечала за поддержку проекта с открытым исходным кодом React.

React, как известно, не знает, откуда берутся данные вашего приложения, и я подумал, что Meteor может дать убедительный ответ с его продвинутой системой данных в реальном времени, поэтому я подготовил внутреннюю демонстрацию, чтобы показать команде. Он работал невероятно хорошо, что не станет сюрпризом для тех, кто знаком с Meteor и React. Очевидно, что React не собирался начинать в зависимости от Meteor или даже адаптироваться к Meteor, но простота настройки этой демонстрации показала, насколько гибкими являются обе технологии.

С тех пор многое изменилось, но приверженность Meteor к опыту разработчиков React остается неизменной. Вот почему Meteor 1.8 наконец-то представляет простой способ создания новых приложений Meteor с React вместо Blaze (хотя вы, конечно, можете использовать два рядом, если хотите):

meteor create --react my-new-react-app

Несмотря на то, что этот шаблон приложения относительно прост, он отражает идеи многих участников, особенно @dmihal и @alexsicart, и, без сомнения, он продолжит развиваться в будущих выпусках Meteor. ⚛️💫

Отмена решателя ограничений

Если вы когда-либо изо всех сил пытались заставить Meteor решатель ограничений распутывать сложные конфликты версий пакетов или ругали пакет, который больше не поддерживается, за случайное ограничение версии пакета, который вы хотели обновить, Meteor 1.8 представляет невероятно мощный предохранительный клапан, который можно использовать для лучшего руководства решающей программой.

В частности, файл .meteor/packages (где вы перечисляете желаемые версии всех ваших пакетов верхнего уровня) поддерживает новый синтаксис для переопределения проблемных ограничений версии из пакетов, которые вы не контролируете.

Если ограничение версии пакета в .meteor/packages заканчивается символом !, то любые другие (не !) ограничения, наложенные на этот пакет где-либо еще в приложении, будут ослаблены, чтобы разрешить любую версию больше или равную ограничение, даже если основная / дополнительная версии не совпадают. Примечание: этот синтаксис работает только в .meteor/packages, поэтому нет риска злоупотребления кем-либо, кроме разработчика приложения.

Например, использование и CoffeeScript 2, и practicalmeteor:mocha раньше было очень трудным из-за этого api.versionsFrom("1.3") оператора, который, к сожалению (и без надобности!) Ограничивает пакет coffeescript версией 1.x.

В Meteor 1.8, если вы хотите обновить coffeescript до 2.x, вы можете просто ослабить ограничение practicalmeteor:mocha, поместив

[email protected]_1! # note the !

в вашем .meteor/packages файле. Опять же, это означает, что все другие ограничения версии, наложенные другими пакетами на пакет coffeescript, потеряют способность сдерживать версию coffeescript, хотя они по-прежнему будут требовать минимальную версию. Другими словами, версия coffeescript по-прежнему должна быть не ниже 1.x, чтобы practicalmeteor:mocha мог рассчитывать на этот минимум. Однако practicalmeteor:mocha больше не будет ограничивать основную версию coffeescript до 1.x, поэтому [email protected]_1 будет работать.

Привет Джеффри Буту, ведущему разработчику CoffeeScript, который изначально завязал этот разговор после долгого разочарования по поводу конкретной проблемы, описанной выше.

Интуитивно это имеет смысл, потому что большинство случайных ограничений версии верны в отношении минимальной версии, которую они требуют, но неверны в отношении максимальной версии, которую они примут. И если они правы насчет обоих, что ж, тогда нет ничего случайного.

Когда вам понадобится этот синтаксис - если он вам понадобится, - мы думаем, вы найдете именно тот трюк, которого вам не хватало. 👌🧙‍♀️

Что дальше

Node.js 8.12.0, а на самом деле

Как обсуждалось выше, мы будем отслеживать ход разгадки тайны сборки мусора Node.js 8.12.0 в этой проблеме, и мы планируем выпустить Meteor 1.8.1, как только эти проблемы будут решены.

Официально поддерживаемый typescript пакет

Теперь, когда Meteor поддерживает плагины отложенного компилятора, мы ожидаем двух важных изменений TypeScript в Meteor:

  1. Широко используемый плагин barbatus:typescript начнет использовать отложенную компиляцию, что должно значительно повысить производительность.
  2. Наконец-то мы сможем поделиться плагином typescript, которым мы занимались с нашим приложением Engine в течение последних нескольких месяцев.

Чтобы быть в курсе этих событий, перейдите к запросу этой функции.

Более гибкие meteor create параметры, например --apollo

Новая команда meteor create --react - это только начало. Если вы можете в это поверить, у нас еще больше мнений о том, как лучше всего настроить приложение Meteor на основе Apollo, приложение, использующее TypeScript вместе с ECMAScript, и множество других различных шаблонов для новых проектов Meteor.

Одним из недостатков текущей meteor create --argument системы является то, что шаблоны привязаны к текущему выпуску Meteor, поэтому сложно отправлять обновления, не выпуская новую версию Meteor. Мы думаем, что можем преодолеть этот барьер, сочетая более частые выпуски Meteor и выборку шаблонов приложений из развивающегося репозитория Git, вместо того, чтобы запекать их в пакет meteor-tool.

Компиляция подключаемых модулей компилятора после установки

По сравнению с остальной частью экосистемы JavaScript, одним из преимуществ Meteor является то, что код пакета и приложения компилируется и объединяется при сборке приложения с использованием любых версий пакета, выбранных разработчиком приложения, вместо того, чтобы полагаться на прошлые варианты публикации авторов пакетов, которые не может предвидеть потребности отдельного приложения.

Единственным исключением из этого правила является то, что плагины компилятора Meteor компилируются и объединяются до их публикации в Atmosphere, что означает, что они могут в конечном итоге использовать устаревшие версии определенных зависимостей, если только автор плагина не выпустит новые версии. плагина. См. Эту проблему, чтобы увидеть пример такой проблемы и способы ее устранения.

Если вы поддерживаете плагин компилятора Meteor, который использует ecmascript, мы рекомендуем воспользоваться этой возможностью, чтобы поднять младшую версию вашего плагина, добавить последнюю @babel/runtime в его частные зависимости npm и повторно опубликовать плагин (и его родительский пакет) с помощью Meteor. 1.8. Обновление минорной версии важно, чтобы вы могли продолжать выпускать обновления для более старых версий Meteor.

Если вы разработчик приложения, который изо всех сил пытается использовать подключаемый модуль компилятора, который не был обновлен для Meteor 1.8, вы всегда можете взять дело в свои руки, клонировав репозиторий подключаемого модуля в свой локальный каталог packages/, чтобы он был перестроен вместе с ним. с вашим приложением.

Перестройка подключаемых модулей во время сборки приложения - это общее направление, в котором мы хотим двигаться, хотя мы надеемся сделать это поведение по умолчанию, не требуя от разработчиков приложений создания локальных клонов подключаемых модулей.

Более тонкая версия пакета autoupdate для минимальных приложений Meteor

Благодаря недавней работе Christian Klaussner, пакет autoupdate скоро перестанет зависеть от пакетов mongo и minimongo, что позволит сэкономить 60 КБ + размера пакета (уменьшенного до gzip), что сделает его более приемлемым для использования autoupdate и / или hot-code-push в приложении, созданном с помощью команды meteor create --minimal.

Устанавливаете пакеты Meteor из npm?

Поскольку пакеты Meteor можно клонировать в локальный packages/ каталог, а не устанавливать из Atmosphere, нет фундаментальной причины, по которой их нельзя было бы также установить в node_modules каталог с помощью npm или yarn. В первом приближении уловка состоит в том, чтобы просто научить Meteor сканировать node_modules пакеты верхнего уровня на наличие package.json файлов с разделом meteor, который ссылается на соответствующий package.js файл конфигурации.

Представьте себе возможность npm install пакетов, которые могут запускать активный код инициализации как на клиенте, так и на сервере; может быть перекомпилирован по-разному для современных, устаревших, Cordova и серверных пакетов; и работают так же, как обычные пакеты npm, когда они установлены в приложении, отличном от Meteor!

Мы все еще находимся на ранних стадиях реализации этой идеи, но мы считаем ее привлекательной, поскольку она указывает на будущее, в котором приложения Meteor будут построены на основе расширенных пакетов npm, которые приносят пользу (и получают выгоду) от более широкой экосистемы npm, не давая их Метеорные сверхдержавы.

Как установить с нуля

Если вы впервые используете Meteor или предпочитаете переустановить Meteor с нуля, чтобы освободить место на диске, следующие команды загрузят Meteor 1.8 и установят общесистемную команду meteor.

Mac и Linux

curl https://install.meteor.com/ | sh

Окна

Сначала установите менеджер пакетов Chocolatey, затем запустите эту команду из командной строки администратора:

choco install meteor

Как обновить

Mac, Linux и Windows

Хотя мы очень стараемся сделать каждую версию Meteor настолько обратно совместимой, насколько это возможно, даже самые незначительные различия в поведении (преднамеренные или непреднамеренные) могут оказаться значительными для существующих приложений. Чтобы задокументировать важные изменения, мы начали выделять Критические изменения и Этапы миграции в наших History.md примечаниях к выпуску.

В Meteor 1.8 единственный абсолютно важный шаг миграции - это установка последней версии пакета @babel/runtime npm, поскольку в течение длительного периода бета-тестирования Babel 7 был внесен ряд критических изменений:

meteor npm install @babel/runtime@latest

Как обычно, запуск meteor update в каталоге приложения обновит приложение до Meteor 1.8. Запуск meteor update вне каталога приложений загрузит Meteor 1.8 для дальнейшего использования, а meteor create new-app создаст новое приложение Meteor 1.8.

Откат

В том маловероятном случае, если обновление оставляет ваше приложение в плохом состоянии, и вам не хочется сразу его отлаживать, убедитесь, что каталог .meteor вашего приложения привязан к вашей системе контроля версий (например, Git, Mercurial и т. Д.) перед обновлением, чтобы можно было легко отменить изменения в случае возникновения проблем.

В итоге

Это уже довольно долгое объявление о выпуске, поэтому мы сохраним этот раздел кратким.

Благодаря 453 коммитам в течение пяти месяцев разработки, Meteor 1.8 сохраняет, расширяет и исправляет новаторские функции Meteor 1.7, обеспечивая значительно лучшую производительность сборки. Если вы уже используете версию 1.7, вам обязательно нужно запустить meteor update при первой же возможности. Если вы все еще используете Meteor 1.6, потому что версия 1.7 была слишком медленной или у вас возникли проблемы с обновлением по какой-либо причине, смело переходите непосредственно к Meteor 1.8. Если вы используете еще более старую версию Meteor, см. Руководство по миграции.

Как всегда, просмотрите полные примечания к выпуску, чтобы узнать о деталях, которые могут иметь особое отношение к вашим приложениям.

Если вы застряли, не стесняйтесь задавать вопросы в комментариях к этому сообщению, или напишите о проблеме на GitHub, или посетите форумы, чтобы узнать, сталкиваются ли другие разработчики Meteor с такими же проблемами.

Теперь вперед и meteor update! 💫