Статьи

Как дела, Angular?

Вступление

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

В этой статье мы узнаем о последних функциях, представленных в версиях 8 и 9, как в ядре Angular, так и в инструментах Angular: новый рендеринг Ivy, API-интерфейсы Schematic и Builder, новый инструмент построения и тестирования оркестровки Bazel, дифференциальная нагрузка и т. д. Мы также обсудим, что нас ожидает в будущем Angular. Оповещение о спойлере: речь идет об облегченном и быстром времени выполнения, быстродействующих и более быстрых приложениях и инструментах для разработчиков, а также о совместимости.

Растущие темпы усыновления

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

Несколько месяцев назад команда Angular объявила о том, что число уникальных посетителей официального сайта документации превысило 1,5 миллиона, и я уверен, что этот показатель со временем будет расти.

Полная и интегрированная структура

Почему разработчики любят использовать Angular? Одна из причин, по которой они продолжают возвращаться, заключается в том, что Angular — это фреймворк, в отличие от библиотеки, что означает, что он предлагает полный набор API и инструментов. Будь то управление маршрутами, построение и проверка форм, интернационализация (i18n), рендеринг на стороне сервера, модульное тестирование, инструменты для разработчиков с помощью Angular CLI, анимация или компоненты пользовательского интерфейса, Angular интегрирует все необходимые API строительных блоков для создания современных веб-приложений, от создания прототипа до развертывания.

Цикл выпуска

Angular принял 6-месячный цикл выпуска, основанный на стандарте  семантической версии  . Это поможет как можно быстрее вводить новые инновации и исправлять ошибки, предоставляя пользователям четкую повестку дня, чтобы они могли планировать свои обновления. Этот цикл выпуска выглядит следующим образом:

  • От 1 до 3 минорных версий для каждого основного выпуска.

  • Патч версия почти каждую неделю для исправления ошибок.

Обратите внимание, что команда также предлагает политику долгосрочной поддержки (LTS):

  • Активная поддержка в течение 6 месяцев основной версии.

  • LTS с исправлениями ошибок и исправлениями безопасности на 12 месяцев.

Если вы хотите опробовать следующую версию в любое время с ее документацией, вы можете найти ее по адресу  next.angular.io

Процедура автоматического обновления

Вы можете легко использовать Angular CLI для обновления зависимостей вашего приложения до последней версии Angular, используя следующую команду:

  ng update \@angular/cli \@angular/core

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

  ng update @angular/cli@next @angular/core@next 

Вы можете прочитать больше об этих автоматических обновлениях на  update.angular.io .

Новые возможности Angular 8

Дифференциальная нагрузка

Это была одна из основных функций, представленных в Angular 8.  Дифференциальная загрузка  — это метод, при котором браузер решает, какую версию JavaScript (ES5 или ES2015 +) загружать, анализировать и выполнять, основываясь на его (браузерных) возможностях. Фактически, большинство современных браузеров (мы называем их вечнозелеными браузерами) изначально поддерживают некоторые из новейших функций ECMAScript. Одной из функций, которые играют главную роль в дифференциальной нагрузке, являются ES-модули.

Основываясь на этом простом наблюдении, мы затем предоставляем браузеру два набора файлов JavaScript:

  • Набор файлов перенесен в ES2015, для современных браузеров.

  • Набор файлов, перенесенных в ES5, для устаревших браузеров.

Как работает дифференциальная нагрузка? Когда мы создаем наше приложение с помощью Angular CLI, оно проверяет наш   файл tsconfig.json, чтобы проверить, на какую версию JavaScript мы нацеливаемся. Если наша цель ES2015, CLI запускает две сборки: одну для ES2015 и одну для ES5. Давайте возьмем следующий  tsconfig.json  для примера:

{ 

  "compilerOptions": { 

    "module": "esnext", 

    "moduleResolution": "node", 

    "target": "es2015" 

  } 

} 

Наша цель здесь — ES2015, поэтому CLI выведет следующий index.html:


<!-- For modern browsers --> 

<script type="module" src="polyfills-es2015.js"></script> 

<script type="module" src="runtime-es2015.js"></script> 

<script type="module" src="style-es2015.js"></script> 

<script type="module" src="vendor-es2015.js"></script> 

<script type="module" src="main-es2015.js"></script> 

  

<!-- For Legacy browsers --> 

<script nomodule src="polyfills-es5.js"></script> 

<script nomodule src="runtime-es5.js"></script> 

<script nomodule src="style-es5.js"></script> 

<script nomodule src="vendor-es5.js"></script> 

<script nomodule src="main-es5.js"></script> 

Обратите внимание, что в Angular 8 функция дифференциальной загрузки включена по умолчанию, и вам не нужно об этом беспокоиться. Однако, если у вас возникнут какие-либо проблемы, связанные с этой функцией, вы все равно можете вернуться к цели ES5.

Команда Angular использовала эту технику на angular.io и сумела сохранить до 40 КБ файлов, загружаемых современными браузерами. Также, согласно отзывам членов сообщества, они заметили улучшения, варьирующиеся от 7-20%.

Динамический импорт

Ленивая загрузка частей приложений всегда была одной из рекомендаций для лучшего времени загрузки. Это может быть достигнуто путем настройки углового маршрутизатора с помощью следующего кода:

{ 

  path: 'home', 

  loadChildren: 'home/home.module#HomeModule' 

} 

Однако этот синтаксис специфичен для Angular и не является частью какого-либо веб-стандарта. Теперь, поскольку большинство современных браузеров изначально поддерживают модули ES, новый синтаксис отложенной загрузки использует стандарт Dynamic Imports:

{ 

  path: 'home', 

  loadChildren: () => import('home/home.module') 

                        .then(m => m.HomeModule) 

} 

Редакторы кода, такие как VSCode и WebStorm, теперь могут проверять и предоставлять вам завершение кода для путей вашего модуля.

Обратите внимание, что при обновлении через  ng update command CLI ваш старый синтаксис автоматически обновится до нового.

API Builder

Подобно API Schematics , что позволяет нам настроить сгенерированный код при использовании CLI, с помощью команд , таких как  ng newng generateng add, и  ng update, а также добавлять  новые команды , новый  Builder API  позволяет настраивать поведение сборки команды , такие как  ng buildng test, и  ng run. Таким образом, мы можем выполнять задачи, которые могут выполняться до, во время или после процесса сборки.

Некоторые облачные провайдеры уже начали создавать своих собственных сборщиков, чтобы помочь своим пользователям легко и без проблем развернуть свое приложение Angular. Например, теперь вы можете легко выполнить развертывание в  Firebase  с помощью  @ angular / fire  или в  Microsoft Azure  с помощью  @ azure / ng-deploy .

Поддержка веб-работников

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

  ng generate web-worker <existing-component-name>

Обратите внимание, что код, работающий внутри Web Worker, — это логика вашего приложения, а не среда выполнения Angular!

Узнайте больше о Web Workers и Angular из  официального руководства .

телеметрия

Версия 8 CLI добавляет новую функцию телеметрии, которая помогает команде Angular понять, как разработчики используют CLI и устранять критические проблемы. Эта функция телеметрии по умолчанию отключена, и пользователи должны  включить и включить ее  , чтобы делиться анонимными данными об использовании с командой Angular. Этот новый API позволяет пользователям также подключать свой собственный аналитический сервер и получать те же собранные данные. Информация, такая как использование ОЗУ и ЦП, размер пакетов и команды CLI, затем регистрируется. Вы можете прочитать о полном списке измерений  здесь .

Угловые элементы

Angular использует стандарт Web Components благодаря Elements. С помощью этой новой функции можно будет упаковать любой угловой компонент как  пользовательский элемент .

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

  • Серверные технологии, например ASP.NET.

  • Статические веб-страницы и веб-сайты, например, CMS.

  • Другие интерфейсные технологии, например Vue.js.

Вот быстрый пример:

import { BrowserModule } from '@angular/platform-browser'; 

import { NgModule, Injector } from '@angular/core'; 

import { createCustomElement } from '@angular/elements'; 

import { HelloComponent } from './hello.component'; 

  

@NgModule({ 

  declarations: [AppComponent], 

  imports: [BrowserModule], 

  providers: [], 

  entryComponents: [HelloComponent] 

}) 

export class AppModule { 

  constructor(injector: Injector) { 

    const element = createCustomElement( 

                             HelloComponent, { injector }); 

    customElements.define('x-hello', element); 

  } 

} 

Затем просто используйте ваш  элемент  в качестве веб-компонента:

<x-hello></x-hello> 

Bazel: новый инструмент для построения и тестирования оркестровки

В настоящее время CLI использует webpack и ng-packagr для создания наших приложений и библиотеки (и это скоро не изменится). Однако эти инструменты могут показывать некоторые проблемы с производительностью при попытке создания очень больших приложений. Начиная с версии 8, CLI интегрировал новый инструмент экспериментальной сборки под названием  Bazel .

Вкратце, Bazel — это инструмент для построения и тестирования оркестровки, созданный Google, который более десяти лет использовался внутри компании для создания более 86 ТБ данных в гигантском моно-хранилище Google до того, как они открыли его в 2015 году. Вот некоторые из Преимущества Bazel:

  • Он поддерживает бэкэнд, интерфейс и мобильные технологии.

  • Он может выполнять задачи параллельно, локально и на машинах распределенной фермы.

  • Он поддерживает инкрементные сборки и кэширование.

  • Узнайте о  других преимуществах .

В контексте Angular интеграция Bazel (в рамках  инициативы ABC ) призвана дать инструментам сборки и тестирования Angular значительное повышение производительности.

Базель уже помогла команде Angular сократить сборку Angular с 1 часа до почти семи минут!

Вы можете начать экспериментировать сегодня с Bazel в CLI с помощью следующей команды, если вы запускаете новое приложение:

npm install -g @angular/bazel 

ng new my-app --collection=@angular/bazel 

Если вы хотите добавить Bazel в существующее приложение CLI, используйте следующее:

ng add @angular/bazel 

Обратите внимание, что, поскольку вы используете CLI, все конфигурации будут автоматически управляться CLI. Таким образом, теоретически вам даже не нужно узнавать о Базеле. Тем не менее, Bazel — это увлекательная технология, и я настоятельно рекомендую потратить некоторое время и изучить ее, если вам нужно использовать ее с другими технологиями!

Плющ: новый рендерер

В прошлом году команда Angular Framework начала работу над новой реализацией рендерера и компилятора шаблонов под названием Ivy. Основными целями этого полного переписывания являются:

  • Уменьшите размер создаваемых пакетов.

  • Сократите время компиляции.

  • Обеспечить лучшую отладку.

  • Улучшение статической проверки типов внутри шаблонов HTML (благодаря языковой службе TypeScript).

Чтобы иметь наименьший возможный размер, все общедоступные API теперь могут быть  расшатаны по дереву : хуки жизненного цикла, каналы, запросы, DI и т. Д. Кроме того, следует отметить, что с Ivy все будет компилироваться в  режиме AOT .

В Angular версии 9 Ivy будет включен по умолчанию. Однако, если вы используете Angular версии 8, вы уже можете поэкспериментировать с Ivy, используя следующую команду:

ng new shiny-ivy-app --enable-ivy 

Для существующих приложений вы можете вручную обновить следующие файлы:

  1. Включите Ivy в вашем файле tsconfig.json:
{ 

  "compilerOptions": { ... }, 

  "angularCompilerOptions": { 

    "enableIvy": true 

  } 

} 
  1. Включите режим AOT в вашем основном файле angular.json:
{ 

  "projects": { 

    "my-app": { 

      "architect": { 

        "build": { 

          "options": { 

            ... 

            "aot": true, 

          } 

        } 

      } 

    } 

  } 

} 

Будущее Angular

Отказ от ответственности: следующие мнения основаны на некоторых гипотетических идеях и взглядах, которыми  Миско Хевери поделился на NgConf 2019. *

С новым рендерером Ivy и тем, как внутреннее ядро ​​Angular было переработано, это откроет целый мир новых технологий для оптимизации еще большего числа приложений Angular. Мы можем представить, что  NgModule стали необязательными и загружаем компоненты напрямую (при условии, что Zone.js больше не потребуется!). Другое возможное решение, которое можно исследовать, — это рендеринг на стороне сервера, позволяющий приложениям Angular полностью рендерить серверную часть с состоянием и распространять и возобновлять это состояние из браузера вместо того, чтобы заново создавать состояние показа на клиенте! С помощью этих методов можно было бы значительно увеличить время взаимодействия и, таким образом, очень быстро загружать приложения Angular.

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

Оставайтесь в курсе.

Эта статья была первоначально опубликована в нашем отчете о тенденциях JavaScript. Чтобы прочитать больше подобных статей, загрузите отчет сегодня!

Читать сегодня