All streams
Search
Write a publication
Pull to refresh
7
0
Максим Соснов @crazymax11

JavaScript разработчик

Send message

Весьма популярное заблуждение. Http2 не решает проблему, которую решает бандлинг.


Давайте представим ситуацию.
У вас есть точка входа, которая импортит класс приложения, который импортит еще модуль и так далее.
Думаю, вы без труда найдете в своем коде, например, 8 уровней импортов.


entry => application => rootComponent => component => anotherComponent => someLibrary => lodash.


Если отказаться от сборки исходников в один\несколько файлов, то возникает следующая ситуация.


  • Браузер получает ваш entry point, узнает что ему нужен application
  • Получает application, узнает, что нужен rootComponent
  • и так далее до 8 уровня

Каждый шаг для браузера — это отдельный запрос со всеми вытекающими. http2 позволяет переиспользовать соединение, однако задержка между вами и пользователем, как ни крути, останется.
Если предположить, что задержка 50мс, то только 400мс уйдет на то, чтобы спросить у вас файлы (не учитывая скачивание, парсинг и всё такое). Если пользователь, не дай бог, с мобильного интернета, то там уже совсем другие цифры.


Решение у этой проблемы есть — сразу говорить пользователю, какие файлы ему понадобятся. Вместо того, чтобы собирать один\несколько файлов, нам теперь нужно строить граф зависимостей, чтобы оптимизировать отправку. Можно и из булки сделать троллейбус, но зачем? Воркфлоу без потерь не упрощается.


Ну и бонусом, бандлинг позволяет очень хорошо оптимизировать код (минификация, дедупликация, tree shaking, лучше гзипуется, легче пересылается по сети)

Если вы динамически меняете что-нибудь во внешней зависимости
Так и думал что дело не чисто и тут есть зависимость со стейтом :)


Да, если в деве дубликаты критичны то вы правы. Все очень плохо :)


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

Вот видимо про симлинки я и упустил.
А как вы используете симлинки?
У нас есть workflow работы с симлинками во время разработки. Мы линкуем также *dep-a*, *dep-b* и там действительно будут дубликаты *not-react*, но это не важно во время разработки.
Во время сборки для выкладки нет никаких симлинков до *dep-a*, *dep-b*, они ставятся из *registry* и дубликатов *not-react* нет.

Хотя в целом проблем с симлинками достаточно.

Давайте еще раз, я видимо чего-то не понял.
Вот как я это вижу.
У вас есть пакет Main и есть его зависимости dep-a и dep-b.
И у пакета Main и у его зависимостей dep-a, dep-b есть third-party зависимость not-react.


Если этот not-react и в Main и в dep-a и в dep-b одинаковой версии, то при установке зависимостей Main с помощью yarnа not-react будет только в рутовом node_modules.
И при сборке webpack будет тянуть один и тот же not-react в Main, dep-a, dep-b => нет дублирования.
При этом ваши пакеты dep-a, dep-b разрабатывайте и тестируйте как хотите в их собственных репозиториях\папках.

Если у вас общая зависимость ваших зависимостей одной и той же версии, то какой-нибудь yarn, делая плоский список зависимостей, вынесет общую зависимость в рутовый node_modules.
И тогда у вас будет 1 версия общей зависимости в одном месте и вебпак не должен это дублировать.

Information

Rating
Does not participate
Location
Новосибирск, Новосибирская обл., Россия
Works in
Date of birth
Registered
Activity