Переход с Angular 1.6 на React @ Qwil.

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

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

Время было решающим в нашем решении. Angular 2 еще не был выпущен, а фреймворки MVC с двусторонней привязкой уступали место веб-компонентам.

У React уже было большое сообщество, и было доказано, что он готов к работе, поэтому мы решили начать использовать его в нашем внешнем стеке.

Мы также хотели иметь возможность постепенно добавлять новые функции, не поддерживая две разные базы кода.

Выполнение

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

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

Первое, что нужно добавить, это webpack и babel, которые будут использоваться только для создания пакета из компонентов jsx, действий редукции и редукторов редукции. Позже этот пакет может быть внедрен как обычный актив.



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

Рендеринг компонентов React в Angular

С реагировать2ангуляр

  1. Мы создали компонент более высокого порядка, чтобы обернуть наши компоненты-контейнеры в react2angular, вот так:
import React from 'react';
import { react2angular } from 'react2angular';
function angularWrapper(componentName, propTypes = {}) {
  return function test(WrappedComponent) {
    function Wrapper(props) {
      return (
        <WrappedComponent
          {...props}
          store={window.globalReduxStore}
        />
      );
    }
    // attaches the wrapped component to window
    window[componentName] =
      react2angular(Wrapper, Object.keys(propTypes));
    return Wrapper;
  };
}
export default angularWrapper;

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

2. Украсьте компоненты контейнера

const propTypes = {  
  user: PropTypes.object,
  activePage: PropTypes.string,
};
// you need to define the name of your wrapped component
// that will be attached to the window
@angularWrapper('ReactHeader', propTypes)
@connect(mapStateToProps, mapDispatchToProps)
export default class Header extends Component {
  ...
}

3. Объявить компонент в angular

Помимо украшения ваших компонентов контейнера, вам нужно будет объявить компонент с помощью angular, например:

angular
  .module('yourWebapp', ...)
  .component('reactHeader', window.ReactHeader);

4. Теперь вы можете использовать компоненты, написанные на React, в своих шаблонах angular.

<react-header /> 

Обратите внимание, что это то же имя, которое вы указали в декораторе ReactHeader, только в другом регистре. React2Angular преобразует UpperCamelCase в спинномозговой.

Вывод

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

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

Очистить

На момент написания этой статьи наша миграция подошла к концу, и все наши пользователи видят новую версию React, старый код удален, и мы постепенно удаляем gulp и устаревший css.

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