в чем преимущество использования нескольких модулей в Angular2 помимо простоты проектирования?

Поможет ли это сократить время загрузки? (например, загрузив только текущий модуль на клиентское устройство?)

я так понимаю что...

  • Это увеличит количество запросов между сервером и клиентом?
  • Это увеличит сложность вашего кода (поскольку вам нужно позаботиться о
  • импортировать и экспортировать модули, а также проявлять особую осторожность при маршрутизации)

person YASH DAVE    schedule 10.01.2017    source источник


Ответы (2)


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

{
  path: 'admin',
  loadChildren: 'app/admin/admin.module#AdminModule',
},

См. также https://angular.io/docs/ts/latest/guide/router.html#!#asynchronous-routing

обновить

Хотя отложенная загрузка не уменьшает время загрузки, когда все требуется на стартовой странице, что, ИМХО, не имеет места почти в 100% приложений Angular2, она сокращает время начальной загрузки и откладывает время загрузки до момента, когда модуль собственно требуется. Angular также поддерживает функцию предварительной загрузки для загрузки лениво загруженных модулей до того, как они потребуются, но по-прежнему не загружает их при начальной загрузке.

  • #P5#

Количество запросов будет больше, но объем данных, загруженных с первым запросом, будет меньше. Основная идея состоит в том, чтобы сократить время, пока пользователь не отобразит первый экран. Если приложение состоит из частей, некоторые из которых используются интенсивно, а другие редко, то обычно рекомендуется не загружать редко используемые части до тех пор, пока они не будут фактически использованы — что означает «ленивый» или «по требованию» — только когда это действительно необходимо.

  • #P7#

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

  • #P9#

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

person Günter Zöchbauer    schedule 10.01.2017
comment
Это правда. Но в реальных бизнес-приложениях эта угловая функция не очень сильно влияет на производительность загрузки (помимо начального экрана), поскольку типичный модуль с компонентами приложения обычно ссылается почти на полный набор функций приложения (сервисы данных, ...). В будущем Angular должен поддерживать ленивую загрузку на более тонком уровне детализации. - person Karl; 10.01.2017
comment
@Карл, понятия не имею, что ты имеешь в виду. Вы можете сделать модули максимально детализированными (отдельный компонент, директива или сервис). - person Günter Zöchbauer; 10.01.2017
comment
@Günther: я полагаю, что директива (в ссылочном модуле) загружается, когда загружается компонент, запускаемый loadChildren? - person Karl; 10.01.2017
comment
Конечно, но зачем на него ссылаться, если он не используется. Если он используется, его нужно загрузить, нет? - person Günter Zöchbauer; 10.01.2017
comment
Я это и имел в виду, они нужны по замыслу и поэтому загружаются. например в типичном приложении CRUD (вставка, удаление,...) являются частью дизайна, но вы никогда не знаете, запускает ли пользователь все функции. все они загружены, но, возможно, никогда не использовались. Прямо сейчас вы не можете контролировать, загружаются они или нет, за исключением того, что каждая функция связана с маршрутом, что нецелесообразно. - person Karl; 10.01.2017
comment
Понятия не имею, почему вы думаете, что они все загружены. Они загружаются, если загружается модуль, ссылающийся на них. - person Günter Zöchbauer; 10.01.2017
comment
Ty @GünterZöchbauer за ответ. Таким образом, изначально он загружает все компоненты rootModule и вызывает дочерний модуль только тогда, когда это необходимо, верно? - person YASH DAVE; 10.01.2017
comment
@Karl, мой вопрос был специфичен для Angular2, и я думаю, что вы говорите об Angular 1. (PS: Извините, если я ошибаюсь, поскольку я новичок в этом мире Angular. ':)) - person YASH DAVE; 10.01.2017
comment
@YASHDAVE с начальной загрузкой AppModule и всех модулей, перечисленных в imports: [...] are loaded. Когда пользователь переходит к маршруту, который использует loadChildren для отложенной загрузки модуля, загружаются этот модуль и все модули, перечисленные в imports: [...] этого модуля (которые еще не были загружены ранее). Вы можете использовать функцию preLoad, тогда лениво загруженные модули загружаются в фоновом режиме после начальной загрузки, чтобы быть доступными, когда пользователь переходит к такому маршруту. - person Günter Zöchbauer; 10.01.2017
comment
@GünterZöchbauer Таким образом, ленивая загрузка полезна только для больших приложений, которые имеют как минимум 2 уровня в дереве модулей (таким образом, дочерние модули будут загружаться только тогда, когда клиент вызывает их родительский модуль, верно?) Спасибо за все усилия для решение моих запросов, а также спасибо за ссылку на асинхронную маршрутизацию. Это решило почти все мои вопросы. - person YASH DAVE; 10.01.2017
comment
Я бы сказал, что чем больше приложение, тем больше вероятность того, что ленивая загрузка принесет пользу - как уже упоминалось, это также зависит от структуры приложения и шаблонов использования. Вы должны иметь возможность разделить ваше приложение так, чтобы одна часть загружалась немедленно, а одна или несколько других частей загружались по запросу, где часть представляет собой набор модулей. Хорошим примером является модуль администратора, который обычно не используется большинством пользователей, только когда администратор входит в систему, маршрут для перехода к этому модулю отображается вообще и, следовательно, может использоваться только администраторами. - person Günter Zöchbauer; 10.01.2017
comment
Почему все пользователи должны ждать загрузки этого модуля, когда им даже не разрешено его использовать. - person Günter Zöchbauer; 10.01.2017
comment
@YASHDAVE: я имел в виду Angular 2. Гюнтер решает мою проблему в обновлении своего ответа. Типичное бизнес-приложение имеет базовый уровень, используемый другими бизнес-компонентами. В Angular вы можете перенести загрузку этого слоя с начального экрана на (первый загруженный) бизнес-компонент. Вы не можете контролировать загрузку отдельных модулей, компонентов и т. д. внутри этого бизнес-компонента. - person Karl; 10.01.2017
comment
о, извини @Karl, я неправильно прочитал твой 1-й комментарий, спасибо за помощь. - person YASH DAVE; 10.01.2017

Я не думаю, что это угловой конкретный вопрос. Существует множество ответов, почему вы должны использовать модули, если вы ищете их в Google, например, посмотрите здесь: модули

Теперь краткие ответы на ваш вопрос:

  • это не поможет сократить время загрузки
  • это увеличит количество запросов
  • это на самом деле поможет уменьшить сложность кода, отделив несвязанные функции и не загрязняя глобальные пространства имен.
person Amid    schedule 10.01.2017
comment
Конечно, это уменьшит время загрузки. Если на стартовой странице не отображаются части вашего приложения, что имеет место в 99,9% приложений, это сокращает время первоначальной загрузки. - person Günter Zöchbauer; 10.01.2017
comment
Давайте будем точны - в вопросе автор не указал "начальное время загрузки". Если мы говорим о "времени загрузки" приложения в целом - оно не уменьшится и (по крайней мере пока) скорее всего будет увеличено. - person Amid; 10.01.2017
comment
Это может быть, но это может быть ошибкой в ​​вопросе и, безусловно, ошибкой в ​​​​вашем ответе. Если несколько модулей не загружены из-за того, что пользователь никогда не переходил по этим маршрутам, то время загрузки определенно будет намного меньше. Только когда все или почти все модули фактически используются, время загрузки будет суммироваться со временем загрузки (или больше), которое вы получаете без ленивой загрузки. - person Günter Zöchbauer; 10.01.2017
comment
Пока вопрос сформулирован так, как он есть, я не считаю свой ответ неправильным. Но в любом случае я думаю, что автору будет полезно знать различия. - person Amid; 10.01.2017
comment
И как второстепенный побочный момент. Если мы говорим о больших приложениях, которые состоят из сотен модулей, многие из них загружаются сразу (скажем, это главная страница в стиле дашборда с множеством надстроек) при запуске, и, что важно, само приложение работает в сеть 2G с большой задержкой и сотнями одновременных клиентов. Такие случаи распространены в корпоративных средах, и там время загрузки может, к сожалению, ухудшиться до неприемлемого уровня. - person Amid; 10.01.2017
comment
Возможно, но это не поможет сократить время загрузки — безусловное утверждение, которое просто не соответствует действительности. - person Günter Zöchbauer; 10.01.2017
comment
На самом деле это поможет сократить время загрузки, устранив задержки сотен мелких запросов. - person Amid; 10.01.2017
comment
Это просто звучит так, будто детализация модулей не подходит для приложения, о котором вы говорите. Это звучит так, как будто вы лениво загружаете каждый модуль, что, конечно, не имеет смысла. Обычно это связано с маршрутизацией, когда пользователь переходит на маршрут при первой загрузке одного модуля со всеми его зависимостями одновременно. Только если пользователь выполняет сотни переходов, выполняются сотни небольших запросов, если каждый такой маршрут реализуется лениво загруженным модулем. - person Günter Zöchbauer; 10.01.2017
comment
Я думаю, что мы отошли от темы, углубившись в конкретные варианты использования, которые являются вопросом решений разработчиков/архитектуры, которые слишком широки, чтобы обсуждать их здесь. - person Amid; 10.01.2017
comment
Ленивая загрузка относится к архитектуре. Мне не имеет смысла говорить о ленивой загрузке и исключении темы архитектуры. Но я думаю, что понял свою точку зрения и согласен, что мы можем закончить дискуссию. - person Günter Zöchbauer; 10.01.2017