Ну не будет забывать:
— на первом месте бизнес. Про то как сделать фичу и заработать бабла
— на втором месте бизнес. Про то как нанять програмистов, чтобы они там все побыстрее запилили
— на третьем месте бизнес. Про поддержку и чтобы к IPO оно все еще работало
— на четвертом месте опять бизнес. Чтобы пользователи были довольны продуктом и конверсия перла!
— где-то тут те самые пользователи, что довольны.
— а где-то тут возможно девелоперы
— а где-то тут различные стандарты и альтернативные варианты.
Реакт может кому-то и не нравиться, может он и жирноват (не жирнее jQuery), но он отлично подходит для бизнеса, и результат его работы (обычно) предсказуем.
Webpack 4, ежели ему дать множество entry point, так и сделает. Только по умолчанию порежет все не более чем на 5 кусков.
Автоматическое создание shared chunks — это прям была фишка четвертой версии, позволившая закопать CommonChunksPlugin.
> Вставлять в R-дерево пачку элементов разом действительно выгоднее, чем по одному (в библиотеке RBush даже сделан специальный метод для этого).
А в flatbush другого метода так вообще нет. Но, прочитай алгоритм еще раз,- вставка данных производится __вообще__ один раз.
Далее как не мотай или зум меняй — только чтения.
Плюс можно использовать еще одну библиотеку, опять же от mourner — supercluster , которая сделает что-то типа иерхического z-index, отдаленно напоминащее ваше решение.
Кстати да — если вам добавить «early-z» — будет вообще летать.
Как я почти решил эту проблему (не было задачи наклонять)
1. Берем github.com/mourner/flatbush
2. Начинаем добавлять точки, только маленького размера
3. Постепенно увеличиваем размер (по сути k-nearest neightbours) — очень важно понять в каком порядке точки друг на друга накладываются, сохраняем указатель на тот маркер, который «самый главный»
4.…
5. делаем выборку по bounding box маркера, прося только один результат (такого метода в flatbush нет), получаем leaderMarkerId, и таким образом формируем список маркеров который надо показать.
Это работает за O(nlogn), где «logn», ака «глубина дерева» обычно не более 10. Самое главное — данные добавляются в RTree только один раз, далее идут чтения.
Примеряю вопросы на жену джуна, и она не ответит на 80% вопросов, особенно про try/catch — проблема знаний больше в глубь чем в ширь.
После чего хочется перевести «поработала в 2х проектах» в года, чтобы хоть какой-то базис сформировать.
Я немного накололся с swc, у которого 5000 звезд, и который чуть ли не специально ломает свой результат, что и devolution тоже сломался, по крайней мере до первого пользователя.
Не так чтобы специально, но смысл в этом есть.
Так ли думает програмист?
— читаю пачку символов нужной длины по известному смещению, если она совпадает с тем что надо — бинго!
! но тут совершенно упускается то как «сравнение» работает, что делает операцию копирования просто лишней
— иду по массиву и ищу начало последовательности. Если нахожу — начинаю смотреть что дальше. Если что-то не получается — возвращаюсь в начало и все заново.
! все хорошо, но не надо акцентироваться на «задаче», надо акцентироваться на том что надо делать. Что нужно делать — идти по строке и искать начало последовательности. Про то, что надо возвращаться назад речи и быть не может, и стоит только уточнить что есть «последовательность».
Так получается Ахо-Корасик — банально делает что сказали, и именно так и должен думать «програмист гугла».
`next.js` использует внутри модифицированный `react-loadable` и контролируют процесс разбиения приложения на чанки.
Я давно перестал следить за react-loadable(да он и не меняется), и особо не смотрел в эту часть next.js, но у них должны быть проблемы с stream rendering static CSS, описанные тут.
А насчет обьединения — prerendered-component можно запихнуть в любое приложение, и совместить с любым загрузчиком. Например с React.lazy
— работаешь два года (теперь три) на дядю
— дядя тебя подает от своего имени вне «конкурса» и каких либо дополнительных документов (которые нужны чтобы набрать достаточно баллов и пройти конкурс).
— два года и две недели — у тебя есть Permanent Residency
— без дяди будет образно говоря год, даже с хорошими баллами — очередь перегружена.
— На первой работе у меня не спрашивали резюме, и у меня его и не было
— На вторую работу я попал из-за side project (3d engine)
— На третью работу я попал из-за side project (картография)
— На четвертую работу я _думал_ что попал из-за side project (опять же картография), но нет. Хотя именно этим я там и занимался
— На пятую работу я попал из-за случайно сделанной халтурки (в исходниках было мое имя)
— И вот где-то сейчас, после 18 лет работы, начинают спрашивать и резюме, и диплом. Чисто для галочки — никому это не нужно.
Не совсем корректно освещен вопрос минификации, а точнее то что Uglify уже мертв, но раньше работал из коробоки при mode:production, как и Terser, что пришел ему на смену.
Ну и, конечно, отдельная сборка ESM/ES5 бандлов в вашем случае будет немного не возможна (долго). Могу порекомендовать devolution как легкое решение проблемы.
БЕМ _рекомендует_ использовать один уровень определения селекторов(специфичность), чтобы они друг с другом не дрались. Никаких каскадов.
К сожалению как результат получается «вот это». К счастью это очень хорошо ложиться на модель работы React(точнее state), и дает возможность отобразить компонент в любом нужном состоянии(в стори буке).
Как проработавший в Яндексе 6 лет скажу просто — Яндекс совершенно не умеет опенсорс. Ни технически, ни (особенно) с точки документации или сообщества.
Как результат слишком много технологий «заперто» в Яндексе, и особо во внешний мир не уходит. Скажу по честноку — это экономически не выгодно.
Мне через месяц про БЕМ коллегам расказывать. Расказать то раскажу — а вот ссылки на репы будет давать немного стыдно.
Разберем код, который реализует уровни переопределения, в принципе основную задачу
const cnApp = cn('App');
const cnPage = cn('Page');
const cnHeader = cn('Header');
const cnFooter = cn('Footer');
// ^ никто не гарантирует наличия этих ключей, и сигнатуры компонентов
export const App: React.SFC = () => (
<RegistryConsumer>
{registries => {
// Get registry with components
const registry = registries[cnApp()];
// ^ а почему бы именно "нужный" регист и не возвращать?
// Get the needed version of the component based on registry
const Header = registry.get(cnHeader());
const Footer = registry.get(cnFooter());
// ^ TypeScript как плакал, так и плачет.
return(
<div className={ cnPage() }>
<Header />
<Content />
<Footer />
</div>
);
}}
</RegistryConsumer>
);
Какие другие варианты?
— использование (babel|nodejs requre hooks|webpack loader|webpack resolve) для ресолва «импортов» в нужную тенхлогию.
— повесить хук на `React.createElement` который будет в начале смотреть входящий `type` в `registry`, и если он там есть — заменять на реальное значение что уйдет в реакт (так работает React-Hot-Loader)
— Использовать Proxy|геттер на registry для доступа к нужным элементам. Или просто «конечную» версию регистра, от куда можно просто по ключу прочитать что надо.
export const App: React.SFC = () => (
<BlockConsumer>
{({Header, Footer }) => ....
</BlockConsumer>
);
Осталось за кажром - как работает code splitting/bundle picking. Иметь 100500 имортов в App@mobile.tsx, и далее по дереву. Хотя (я очень надеюсь) эти файла генерятся автоматически на основе структуры директорий (скрыто завесой тайны)
— на первом месте бизнес. Про то как сделать фичу и заработать бабла
— на втором месте бизнес. Про то как нанять програмистов, чтобы они там все побыстрее запилили
— на третьем месте бизнес. Про поддержку и чтобы к IPO оно все еще работало
— на четвертом месте опять бизнес. Чтобы пользователи были довольны продуктом и конверсия перла!
— где-то тут те самые пользователи, что довольны.
— а где-то тут возможно девелоперы
— а где-то тут различные стандарты и альтернативные варианты.
Реакт может кому-то и не нравиться, может он и жирноват (не жирнее jQuery), но он отлично подходит для бизнеса, и результат его работы (обычно) предсказуем.
Автоматическое создание shared chunks — это прям была фишка четвертой версии, позволившая закопать CommonChunksPlugin.
А в flatbush другого метода так вообще нет. Но, прочитай алгоритм еще раз,- вставка данных производится __вообще__ один раз.
Далее как не мотай или зум меняй — только чтения.
Плюс можно использовать еще одну библиотеку, опять же от mourner — supercluster , которая сделает что-то типа иерхического z-index, отдаленно напоминащее ваше решение.
Кстати да — если вам добавить «early-z» — будет вообще летать.
1. Берем github.com/mourner/flatbush
2. Начинаем добавлять точки, только маленького размера
3. Постепенно увеличиваем размер (по сути k-nearest neightbours) — очень важно понять в каком порядке точки друг на друга накладываются, сохраняем указатель на тот маркер, который «самый главный»
4.…
5. делаем выборку по bounding box маркера, прося только один результат (такого метода в flatbush нет), получаем leaderMarkerId, и таким образом формируем список маркеров который надо показать.
Это работает за O(nlogn), где «logn», ака «глубина дерева» обычно не более 10. Самое главное — данные добавляются в RTree только один раз, далее идут чтения.
После чего хочется перевести «поработала в 2х проектах» в года, чтобы хоть какой-то базис сформировать.
Не так чтобы специально, но смысл в этом есть.
— читаю пачку символов нужной длины по известному смещению, если она совпадает с тем что надо — бинго!
! но тут совершенно упускается то как «сравнение» работает, что делает операцию копирования просто лишней
— иду по массиву и ищу начало последовательности. Если нахожу — начинаю смотреть что дальше. Если что-то не получается — возвращаюсь в начало и все заново.
! все хорошо, но не надо акцентироваться на «задаче», надо акцентироваться на том что надо делать. Что нужно делать — идти по строке и искать начало последовательности. Про то, что надо возвращаться назад речи и быть не может, и стоит только уточнить что есть «последовательность».
Так получается Ахо-Корасик — банально делает что сказали, и именно так и должен думать «програмист гугла».
Я давно перестал следить за react-loadable(да он и не меняется), и особо не смотрел в эту часть next.js, но у них должны быть проблемы с stream rendering static CSS, описанные тут.
А насчет обьединения — prerendered-component можно запихнуть в любое приложение, и совместить с любым загрузчиком. Например с React.lazy
— дядя тебя подает от своего имени вне «конкурса» и каких либо дополнительных документов (которые нужны чтобы набрать достаточно баллов и пройти конкурс).
— два года и две недели — у тебя есть Permanent Residency
— без дяди будет образно говоря год, даже с хорошими баллами — очередь перегружена.
— в два раза быстрее в Safary
— в два раза медленее в Хроме. Были в два раза быстрее полгода назад :)
— На вторую работу я попал из-за side project (3d engine)
— На третью работу я попал из-за side project (картография)
— На четвертую работу я _думал_ что попал из-за side project (опять же картография), но нет. Хотя именно этим я там и занимался
— На пятую работу я попал из-за случайно сделанной халтурки (в исходниках было мое имя)
— И вот где-то сейчас, после 18 лет работы, начинают спрашивать и резюме, и диплом. Чисто для галочки — никому это не нужно.
Не совсем корректно освещен вопрос минификации, а точнее то что Uglify уже мертв, но раньше работал из коробоки при
mode:production
, как и Terser, что пришел ему на смену.Ну и, конечно, отдельная сборка ESM/ES5 бандлов в вашем случае будет немного не возможна (долго). Могу порекомендовать devolution как легкое решение проблемы.
К сожалению как результат получается «вот это». К счастью это очень хорошо ложиться на модель работы React(точнее state), и дает возможность отобразить компонент в любом нужном состоянии(в стори буке).
Можно пойти еще дальше, от БЕМ к BEViS, где у элемента вообще остается только __один__ класс — github.com/bevis-ui/docs/blob/master/faq/bem-vs-bevis.md. Зачем это нужно хорошо обьясняет вот этот слайд — bevis-ui.github.io/bevis-and-bt-speech/?full#41
Как результат слишком много технологий «заперто» в Яндексе, и особо во внешний мир не уходит. Скажу по честноку — это экономически не выгодно.
Мне через месяц про БЕМ коллегам расказывать. Расказать то раскажу — а вот ссылки на репы будет давать немного стыдно.
Какие другие варианты?
— использование (babel|nodejs requre hooks|webpack loader|webpack resolve) для ресолва «импортов» в нужную тенхлогию.
— повесить хук на `React.createElement` который будет в начале смотреть входящий `type` в `registry`, и если он там есть — заменять на реальное значение что уйдет в реакт (так работает React-Hot-Loader)
— Использовать Proxy|геттер на registry для доступа к нужным элементам. Или просто «конечную» версию регистра, от куда можно просто по ключу прочитать что надо.