Недавно мы решили перенести некоторые из наших существующих веб-приложений с AngularJS на Vue.js и установить Vue в качестве нового стандартного фреймворка для создания пользовательского интерфейса в Unbabel.

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

Сделав это, мы смогли постепенно перенести наши старые приложения Angular 1.2 на Vue.

Мы можем разбить процесс на следующие 3 этапа:

1 - Детские шаги

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

Что касается конфигурации, мы хотим, чтобы все было просто. К счастью, Vue приходит нам на помощь. В разделе Начало работы вы обнаружите, что можете начать работу, просто включив скрипт на свою страницу и начав писать компонент Vue.

Благодаря простоте использования, мы смогли создать первые компоненты без каких-либо дополнительных инструментов и продолжить предоставлять новые функции. Одной из первых вещей, которые мы разработали, была новая боковая панель для нашего приложения.

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

Наша новая боковая панель получает информацию от основного приложения и отображает ее в определенном формате. Поскольку мы уже включаем jQuery на нашу страницу, один очень простой способ взаимодействия между Angular и Vue - это использование событий jQuery для передачи информации. Мы можем использовать .trigger() на стороне Angular, а затем поймать результат с помощью .on().

Когда код в main-application.js запускается, боковая панель перехватит событие, получит данные и вызовет внутренний метод handleUpdateSidebarData, который затем обновит состояние компонента.

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

Если вам нужно иметь компоненты Vue внутри нашего существующего приложения Angular, это также возможно.

Создайте точку монтирования для вашего компонента Vue, добавьте ее в желаемое место на целевом элементе DOM, затем создайте свой компонент и подключите его к ранее созданной точке монтирования.

Не забывайте вызывать $destroy() на ComponentVM, когда это больше не нужно, чтобы очистить его соединения с другими существующими виртуальными машинами, отвязать все его директивы и отключить все прослушиватели событий.

2 - Подготовка инструментов к масштабированию

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

Подобно тому, как React имеет create-response-app, Vue также имеет аналогичный набор инструментов, который предоставляет разработчикам Webpack, настроенный с горячей перезагрузкой, линтингом, извлечением css и vue-loader, что позволяет вам использовать потрясающий Single Файловые компоненты . Вы можете найти его здесь vuejs-templates / webpack.

Мы хотели иметь все эти замечательные инструменты, потому что они делают разработку с Vue намного лучше, поэтому мы загрузили шаблон и адаптировали файлы конфигурации к нашей собственной структуре проекта.

После того, как инструменты были правильно настроены, у нас была задача переместить компоненты, которые мы создали ранее, и переместить их в Однофайловые компоненты, это было довольно просто, нам просто нужно было объединить шаблон и компонент, который мы создали. раньше, в тот же файл.

Здесь у вас есть простой компонент Vue, шаблон которого объявлен в HTML.

При использовании он будет отображать <h1>Hello World!</h1>

А вот эквивалентный компонент, написанный с использованием Single File Components.

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

Взгляните на vuejs-templates / webpack, если вы хотите сразу начать использовать однофайловые компоненты.

Управление общими зависимостями

Если у вас есть зависимости, которые являются общими для Angular и Vue, например jQuery, вы должны добавить их в качестве требования вашего приложения Vue и открыть их в окне. Это позволит использовать jQuery в приложении Angular, как и раньше.

Если вы ссылаетесь на jQuery через переменную $, вам также нужно будет открыть ее в таком окне window.$ = jQuery

3 - Здоровый рост

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

В настоящее время мы используем Jest by Facebook. Это очень эффективный инструмент с первой минуты его установки. В зависимости от конфигурации вашей разработки первое и единственное, что вам нужно, - это создать любой файл, соответствующий .test.js или .spec.js, написать несколько тестов и затем запустить Jest. Он автоматически найдет любые файлы, имя которых соответствует предыдущему шаблону, и сделает внутри любые утверждения. Взгляните на раздел начало работы, чтобы получить представление о том, как начать использовать Jest.

Jest также сообщает о покрытии кода, если вы запускаете его с --coverage в качестве опции. Вы можете использовать эту опцию, чтобы понять, какие части вашего кода вы не тестировали. Вам не нужно стремиться к 100-процентному покрытию кода, если у вас более 80%, вы уже неплохо справляетесь.

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

Добавьте "test": "jest --coverage" в раздел scripts вашего package.json файла, затем запустите команду npm test, чтобы увидеть результаты. Напоминаем, что любые другие команды в разделе scripts можно выполнить с помощью следующей команды npm run :script-name:.

Вы можете настроить Jest, создав jest.config.js и поместив его в тот же каталог, что и ваш package.json файл.

Использование относительного импорта

Если вы импортируете файлы с использованием псевдонима @, например import Header from @/components/Header, вам нужно, чтобы в тестовых файлах Jest было такое же поведение и простота использования. Для этого вам необходимо добавить следующие конфигурации.

  • rootDir - это место, где расположен ваш исходный код относительно файла конфигурации.
  • moduleNameMapper является эквивалентом псевдонима Webpack. @/Utils загрузит файл ./webapp/src/Utils

Это позволит вам использовать относительный импорт, который у вас уже есть в Webpack.

Добавление Babel и поддержка файлов .vue

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

Для этого вам нужно запустить npm install --save-dev babel-jest jest-vue, чтобы добавить babel-jest и jest-vue, затем вам нужно добавить следующие преобразования в jest.config.js

Определение mapCoverage в true важно для jest-vue, чтобы сообщить о надлежащем покрытии кода.

Мокинг зависимостей

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

В этом примере я показываю функцию, которая выполняет сетевой запрос и возвращает Promise с результатом JSON.

Если вы тестируете компонент, у которого Api.js в качестве зависимости, вы захотите имитировать эту службу и возвращать определенные выходные данные при вызове fetchData().

Для этого вы сначала создаете фиктивную версию, вот так.

Как видите, оба файла реализуют метод fetchData(), поэтому мы можем легко поменять местами один на другой, и наш код может быть выполнен должным образом.

Теперь нам нужен простой способ сказать Jest, что при импорте @/Api мы хотим вернуть @/ApiMock, и мы хотим сделать это, никоим образом не изменяя исходный код.

В Jest есть целая страница, посвященная функции имитации, но важно знать, как обрабатывать предыдущий пример, так как следующее. Вам нужно создать файл, в котором вы будете определять свои макеты, назовем его setup-mocks.js.

Внутри вы объявите, что, когда файл запрашивает @/Api, Jest вместо этого вернет @/ApiMock.

Последний шаг - добавить этот файл в вашу опцию setupFiles внутри jest.config.js.

setupFiles: [
  '<rootDir>/src/tests/setup-mocks.js',
],

Теперь, когда вы запускаете свои тесты, метод fetchData() всегда будет возвращать Promise со значением { message: 'This is a static value', } вместо выполнения сетевого запроса.

TL;DR

Перейти с Angular на Vue очень просто. Вы можете начать с включения Vue на свою страницу с помощью одного тега <script> и создать свои первые компоненты. Когда вы будете готовы к росту, вы можете добавить отличные инструменты, такие как Webpack, которые предлагают горячую перезагрузку и позволяют использовать компоненты Single File. Вам нужно будет добавить тесты в свое приложение, чтобы гарантировать устойчивый рост, и для этого вы можете использовать Jest, его очень просто настроить и начать писать тесты.