Задать вопрос

Как настроить асинхронный роутинг Angular2+Webpack?

Недавно начал работать с webpacko-м. И все не могу научить его принимать мой асинхронный роутинг. В стандартной сборке есть рабочий пример :

@RouteConfig([
  { path: '/',      name: 'Index', component: Home, useAsDefault: true },
  { path: '/home',  name: 'Home',  component: Home },
  // Async load a component using Webpack's require with es6-promise-loader and webpack `require`
  { path: '/about', name: 'About', loader: () => require('es6-promise!./about/about')('About') },
])


about.ts
import {Component} from 'angular2/core';

console.log('`About` component loaded asynchronously');

@Component({
  selector: 'about',
  template: `<h1>Bla-bla-bla</h1>`
})
export class About {
  constructor() {

  }

  ngOnInit() {
    console.log('hello `About` component');
  }

}


Даже просто меня названия, т.е имя класса, оно не хочет работать. Так же не понимаю смысла:

require('es6-promise!./about/about')('About') Оно же не вызывает друг друга, аргументы никуда не подставляются, что же это за чудо такое?
Буду рад вашей помощи! Как оказалось, для нормальной работы с Angular 2, webpack нужно некисло настроить...почти через каждое действия какая проблема вылазит.
  • Вопрос задан
  • 946 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
require('es6-promise!./about/about')('About')

что же это за чудо такое?

Попробуем разобраться. Заходим на документацию к вебпаку тык.

Т.е. эта конструкция require('es6-promise!./about/about') является вызовом загрузки модуля с помощью переопределенного лоадера, а не просто лоадера, который прописан в webpack.config.js этой сборки
loaders: [
  // See: https://github.com/s-panferov/awesome-typescript-loader
  {test: /\.ts$/, loader: 'awesome-typescript-loader', exclude: [/\.(spec|e2e)\.ts$/]},


Идем в исходники es6-promise-loader, который как раз у нас является одной из devDependencies сборки. Там можно маленько посмеяться над комментариями).
Смотрим, что тут, ага - это pitch лоадер, который делает обертку es6-promise. А внутри метод из вебпака ensure, который позволяет отделять chunk и загружать его динамически. В итоге получается примерно такой модуль (пути я порезал маленько)

974ad11097cf4346b2934995b84f22e8.jpg

Т.е. require('es6-promise!./about/about') грубо говоря превращается в функцию с параметром namespace. И вобщем когда придет время сдерживать своё обещание и возвращать модуль, то сработает следующее выражение
require("......app\\about\\about.ts")[namespace]
Require вернет нам как раз наш exports объект, который мы возвращаем в about.ts
export class About {
Смотрим на практике
967e7cf5f014470a9c5e7cb028e6093e.jpg
А к свойству объекта мы уж по namespace сможем легко обратиться. Именно поэтому там 'About'.

Если напишете about, то не видать вам
ngOnInit() {
  console.log('hello `About` component');
}
из компонента
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы