Babel 7, Cordova 7.1, Mongo 3.4, рендеринг сервера потоковой передачи и многое другое

Сегодня мы рады анонсировать Meteor 1.6.1, инкрементный выпуск, который содержит небольшие улучшения, а также одно важное обновление, требующее особого объяснения: Babel 7

Meteor 1.6.2 уже идет полным ходом, потому что мы не получили все, что хотели, в Meteor 1.6.1. Тем не менее, Meteor 1.6.1 становился довольно большим релизом (486 коммитов, даже больше, чем Meteor 1.6), поэтому мы решили переключить передачи, стабилизировать движущиеся части и выпустить все готово.

Примечание о версиях

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

Большинство программных проектов указывают на серьезные изменения с такими версиями, как 2.0 или 16, но здесь, в Meteor, мы невероятно стараемся сохранить обратную совместимость с момента выхода Meteor 1.0, поэтому мы сохраняем 2.0 для версии Meteor, которая требует серьезных изменений в существующий код. А пока второстепенные версии, такие как Meteor 1.6, представляют собой наши самые интересные релизы.

Согласно этому соглашению, Meteor 1.6.1 представляет собой инкрементный выпуск, в котором исправлены ошибки и реализованы относительно консервативные новые функции (по сравнению с Meteor 1.6). Meteor 1.6.1 - отличная версия для запуска нового приложения, и она должна быть привлекательным обновлением, если вы уже используете последнюю предыдущую версию (1.6.0.1), хотя это не является абсолютно обязательным. Говоря о Meteor 1.6.0.1, четырехзначная версия представляет собой минимальный выпуск исправления, который устраняет критическую проблему для некоторой группы разработчиков Meteor, такую как обновление безопасности для связанной зависимости, такой как Node.js.

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

По номерам

  • Недели активной разработки и тестирования: 12
  • Уникальных участников pull request: 36
  • Комментариев к запросу на вытягивание: 76
  • Реакции на PR-комментарии: 61 👍, 10 🎉, 11, 1 😄, 0 😕, 0 👎.
  • Выполняется с Meteor 1.6.0.1: 486
  • Добавлено строк кода: 20 825
  • Удалено строк кода: 31 149
  • Закрытых проблем в Вехе в выпуске 1.6.1: 57
  • Бета-релизы: 22
  • Релиз-кандидатов: 11

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

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

Mac и Linux

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

Окна

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

choco install meteor

Как обновить

Mac, Linux и Windows

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

Откат

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

Вавилон 7

Безусловно, наиболее заметным изменением в Meteor 1.6.1 является то, что мы обновили версию Babel, используемую для компиляции пакета ECMAScript и кода приложения, с 6.24.7 до 7.0.0-beta.38. Да, это бета-версия, но мы считаем, что это приемлемо по нескольким причинам:

  • Мы сможем повторно публиковать пакеты babel-compiler и ecmascript, чтобы использовать небета-версию Babel, когда будет завершена 7.0.0, без необходимости публиковать новую версию Meteor.
  • Другие проекты, такие как React, уже начали рекомендовать плагины Babel, которые зависят от Babel 7, например @babel/plugin-transform-react-jsx: https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment -support.html # babel
  • Meteor использует бета-версии Babel для реализации meteor инструмента командной строки с момента выхода Meteor 1.6, что дало нам возможность выявить и исправить несколько проблем, с которыми мы столкнулись до сих пор.
  • Используя абстракции meteor-babel и babel-preset-meteor, а также упаковывая все их зависимости, Meteor может предоставить согласованное ядро хорошо протестированных подключаемых модулей Babel, которое ограждает разработчиков Meteor от большей части сложности изменение экосистемы плагинов Babel.

Что ожидать

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

@babel/runtime (серьезность: 🌤)

Пакет babel-runtime npm требуется для всех приложений Meteor, начиная с версии 1.3. В Babel 7 babel-runtime был переименован в @babel/runtime. Если вы обновитесь до Meteor 1.6.1 без добавления @babel/runtime к вашим package.json зависимостям, пакет Meteor babel-runtime выдаст полезную ошибку, в которой рекомендуется запустить meteor npm install @babel/runtime. Вам стоит последовать этому совету!

Эта смена имен на самом деле довольно удобна, потому что позволяет установить @babel/runtime вместе с babel-runtime, если вам по какой-то причине нужно и то, и другое; например, если вы полагаетесь на специальный плагин Babel, который по-прежнему предполагает, что установлен babel-runtime.

Большинство разработчиков Meteor должны иметь возможность удалить babel-runtime после добавления @babel/runtime, хотя нет ничего плохого в том, чтобы оставить его установленным, поскольку ни один из его модулей не будет объединен, если они не используются.

Конфликты версий пакета Атмосфера (серьезность: ⛈)

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

Если вы являетесь автором пакета Meteor, который зависит от babel-compiler, и вы определили, что обновление совместимо с предыдущим использованием babel-compiler вашим пакетом (плюс-минус любые настройки, которые могут вам потребоваться), вы можете сделать свой пакет совместимым с Babel 6 или Babel 7, используя синтаксис ограничения версии ||:

Package.onUse(function (api) {
  ...
  api.use("[email protected]||7.0.0");
  ...
});

Этот подход хорошо работает, например, для пакета coffeescript-compiler. Говоря о CoffeeScript, в то время как Meteor 1.6.1 находился в стадии разработки, была выпущена новая основная версия пакетов coffeescript и coffeescript-compiler (последняя версия - 2.0.3_4), о которой стоит упомянуть по той же причине, что и обновление [email protected]: пакеты типа practicalmeteor:mocha, которые зависит от версии 1.x coffeescript, возможно, потребуется обновить или заменить. В частности, мы сочли meteortesting:mocha хорошим выбором.

К сожалению, конфликтующие ограничения версий могут возникать из-за пакетов Meteor, которые не поддерживаются активно, и в этом случае вам, возможно, придется взять дело в свои руки. К счастью, Meteor делает это возможным: просто клонируйте пакет в свой локальный packages/ каталог, а затем при необходимости измените код, вероятно, ослабив ограничения версии в его package.js файле, но также внося другие необходимые изменения в пакет. Ваша локальная копия пакета будет иметь приоритет над версией Atmosphere.

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

Устаревшие пользовательские .babelrc плагины (серьезность: 👾)

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

  • Пожалуйста, вернитесь к использованию любых предустановок, таких как babel-preset-es2015 или babel-preset-env, поскольку Meteor предоставляет аналогичные функции через babel-preset-meteor. Избыточные пресеты тратят время компиляции (в лучшем случае) или вносят ошибки (в худшем), потому что не все плагины могут безопасно запускаться дважды. Вот недавний пример ошибки Babel, возникающей из-за избыточных плагинов Babel. Вместо этого вы должны как можно больше полагаться на значения по умолчанию, предоставляемые Meteor, и осторожно добавлять отдельные плагины по мере необходимости, а не вслепую добавлять плагины или пресеты, которые могут вам не понадобиться. В прошлом это могло сработать, но Babel 7 может выявить скрытые проблемы.
  • Если вы используете официальный плагин Babel, например babel-plugin-transform-decorators, скорее всего, он был переименован в что-то вроде @babel/plugin-proposal-decorators. В этом сообщении в блоге подробно рассказывается о причинах этого переименования и может помочь вам угадать, как теперь называется пакет. В противном случае вы можете найти старое имя пакета здесь, а затем искать новое имя пакета в текущем package.json файле.
  • Пожалуйста, обратитесь к этому сообщению в блоге для получения общих рекомендаций по обновлению до Babel 7, особенно если у вас возникнут проблемы после обновления до Meteor 1.6.1.

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

Не паникуйте!

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

Прочие улучшения

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

Мы обновили Cordova, Mongo и многие пакеты npm, используемые пакетами Meteor и инструментом командной строки meteor. Динамический import() теперь использует HTTP-запросы POST. Благодаря Джеймсу Бэксли III, пакет server-render теперь поддерживает передачу объекта Stream методам ServerSink, которые ранее ожидали строку, что позволяет потоковое рендеринг на стороне сервера с React 16:

import React from "react";
import { renderToNodeStream } from "react-dom/server";
import { onPageLoad } from "meteor/server-render";
import App from "/imports/Server.js";
onPageLoad(sink => {
  sink.renderIntoElementById("app", renderToNodeStream(
    <App location={sink.request.url} />
  ));
});

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

Что дальше

Теперь, когда Meteor 1.6.1 завершен, пришло время обратить наше внимание на всю интересную работу, которую мы отложили до Meteor 1.6.2:

Я особенно взволнован запросом на вытягивание # 9439, который обещает значительно уменьшить размеры пакетов для современных браузеров и Node, а также включить в браузере по-настоящему нативные _54 _ / _ 55_ (и другие функции ECMAScript).

Заключение

Пока ваше приложение поддерживает контроль версий, чтобы вы могли откатиться в случае проблем, нет ничего плохого в том, чтобы запустить meteor update, чтобы посмотреть, что произойдет. Кто знает; вы могли даже не заметить обновление Babel 7. Ваше приложение уникально среди всех приложений Meteor.

Если у вас возникнут проблемы с обновлением или возникнут какие-либо вопросы, не стесняйтесь открывать проблему, комментировать пулреквест Meteor 1.6.2 или начинать обсуждение на наших форумах, и мы сделаем это. все, что в наших силах, чтобы заставить Meteor 1.6.1 (или хотя бы Meteor 1.6.2) работать на вас.

И, конечно же, если Meteor 1.6.1 действительно работает для вас, мы тоже будем рады услышать об этом! Напишите нам в комментариях ниже или @meteorjs в Twitter.