Малоизвестный факт: Angular Dart поддерживает отложенную загрузку с 1.0.
Что для вас делает отложенная загрузка (называемая в Dart отложенной загрузкой)?
- Вы можете разбить свое приложение на небольшие зависимые части.
- Работает в любом браузере - автоматически, без полифилов
- Используйте полностью типизированный код Dart - даже ваши отложенные библиотеки напечатаны
Не волнуйтесь - вам не нужны дополнительные плагины, загрузчики, шаги сборки или зависимости любого рода. Он полностью встроен (хотя, я признаю, относительно недокументирован - мы над этим работаем).
В этом руководстве предполагается, что вы уже знакомы с Дротиком и Угловым дротиком.
Начиная
Я использую смесь IntelliJ и Visual Studio code с плагином Dart. Оба подходят для следования этому руководству - они используют сервер анализа Dart для предоставления статических предупреждений, автозаполнения и т. Д. - или вы можете использовать свой любимый текстовый редактор.
Создание нового проекта
Я мог бы начать с совершенно пустой папки, но я ленив - давайте воспользуемся рабочим сцены, чтобы автоматически сгенерировать строительные леса для нового проекта Dart. Мы получим хорошую настройку файловой структуры за секунды:
Если вы хотите скопировать и вставить использованные мной команды:
$ pub global activate stagehand
$ mkdir angular2_lazy_example
$ cd angular2_lazy_example
$ stagehand web-angular
Давайте также получим все наши зависимости:
$ pub получить
Затем я открыл angular2_lazy_example
в IntelliJ:
И для предварительного просмотра своего приложения я запускаю pub serve
:
Хорошо, но это касается отложенной загрузки…
Да да это. И это так же просто, как и описанные выше действия. Давайте добавим новый компонент ReleaseListComponent
- он загрузит список самых последних выпусков Angular Dart и отобразит их для нас.
Создание нашего нового компонента
Напишем release_list_component.dart
в нашей lib/
папке:
import 'dart:html'; import 'dart:convert'; import 'package:angular2/angular2.dart'; @Component( selector: 'release-list', templateUrl: 'release_list_component.html', styleUrls: const ['release_list_component.css'], ) class ReleaseListComponent implements OnInit { static const _apiUrl = 'https://api.github.com/repos/dart-lang/angular2/tags'; List<GithubTag> releases = const []; @override ngOnInit() async { final tags = JSON.decode(await HttpRequest.getString(_apiUrl)); releases = (tags as List<Map>) .map((t) => new GithubTag(t['name'], t['commit']['url'])) .toList(); } } class GithubTag { final String name; final String url; GithubTag(this.name, this.url); }
И давайте добавим release_list_component.html
:
<ul> <li *ngFor="let release of releases"> <a [href]="release.url">{{release.name}}</a> </li> </ul>
И release_list_component.css
:
ul { margin: 0; padding: 0; } ul li { color: #1e90ff; }
Наконец, давайте отобразим компонент. Измените app_component.dart
:
import 'package:angular2/core.dart'; import 'release_list_component.dart'; @Component( selector: 'my-app', styleUrls: const ['app_component.css'], templateUrl: 'app_component.html', directives: const [ReleaseListComponent], ) class AppComponent {}
И app_component.html
:
<h1>My First Angular 2 App</h1> <release-list></release-list>
Ничего не загружено с задержкой - пока. Давайте посмотрим на нашу временную шкалу Chrome:
Разделение списка релизов
Что, если бы мы хотели загрузить список выпусков только после начальной загрузки страницы? Легкий!
Давайте изменим наш app_component.dart
, чтобы использовать DynamicComponentLoader
, что позволяет нам асинхронно загружать компонент по его class
типу.
import 'package:angular2/core.dart'; import 'release_list_component.dart'; @Component( selector: 'my-app', styleUrls: const ['app_component.css'], templateUrl: 'app_component.html', ) class AppComponent implements OnInit { final DynamicComponentLoader _loader; final ViewContainerRef _location; AppComponent(this._loader, this._location); @override ngOnInit() async { _loader.loadNextToLocation(ReleaseListComponent, _location); } }
(Я также удалил <releases-list>
из app_component.html
)
Наконец, давайте сделаем его фактически загруженным. Это самое интересное!
import 'release_list_component.dart' deferred as release_list; @override ngOnInit() async { await release_list.loadLibrary(); _loader.loadNextToLocation( release_list.ReleaseListComponent, _location); }
Всего за несколько минут мы отложили / лениво загрузили наш код Dart, HTML-шаблон (предварительно скомпилированный в код Dart) и соответствующий CSS - все с помощью пары строк кода.
Отсюда
Вы видели самый простой пример отложенной / отложенной загрузки в Dart. Конечно, это также работает без Angular Dart для ваших собственных фреймворков и проектов.
Дайте мне знать в комментариях или где-нибудь еще, если вам нужна дополнительная информация.
Изменить: окончательный код на https://github.com/matanlurey/angular2_lazy_example