Pull to refresh
54
0
Корзунов Антон @kashey

javascript, webgl, maps, react, орфография(нет)

Send message
Ну не будет забывать:
— на первом месте бизнес. Про то как сделать фичу и заработать бабла
— на втором месте бизнес. Про то как нанять програмистов, чтобы они там все побыстрее запилили
— на третьем месте бизнес. Про поддержку и чтобы к IPO оно все еще работало
— на четвертом месте опять бизнес. Чтобы пользователи были довольны продуктом и конверсия перла!
— где-то тут те самые пользователи, что довольны.
— а где-то тут возможно девелоперы
— а где-то тут различные стандарты и альтернативные варианты.

Реакт может кому-то и не нравиться, может он и жирноват (не жирнее jQuery), но он отлично подходит для бизнеса, и результат его работы (обычно) предсказуем.
Webpack 4, ежели ему дать множество entry point, так и сделает. Только по умолчанию порежет все не более чем на 5 кусков.
Автоматическое создание shared chunks — это прям была фишка четвертой версии, позволившая закопать CommonChunksPlugin.
Я даже jQuery с половины проектов выпилил. К сожалению для более менее крупных приложений это немного не выход.
> Вставлять в R-дерево пачку элементов разом действительно выгоднее, чем по одному (в библиотеке RBush даже сделан специальный метод для этого).

А в flatbush другого метода так вообще нет. Но, прочитай алгоритм еще раз,- вставка данных производится __вообще__ один раз.
Далее как не мотай или зум меняй — только чтения.

Плюс можно использовать еще одну библиотеку, опять же от mournersupercluster , которая сделает что-то типа иерхического 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

const PrefetchLazy = lazy => {
   let value = PrefetchMap.get(lazy) || lazy._ctor();
   PrefetchMap.set(lazy, value);
   return value;
 );

 // using React.lazy
 const AsyncLoadedComponent = React.lazy(() => import('./deferredComponent'));

 <PrerenderedComponent
   live={PrefetchLazy(AsyncLoadedComponent)} 
 >
   <AsyncLoadedComponent />
 </PrerenderedComponent>
— работаешь два года (теперь три) на дядю
— дядя тебя подает от своего имени вне «конкурса» и каких либо дополнительных документов (которые нужны чтобы набрать достаточно баллов и пройти конкурс).
— два года и две недели — у тебя есть Permanent Residency
— без дяди будет образно говоря год, даже с хорошими баллами — очередь перегружена.
jsperf.com/arrow-vs-bind-5
— в два раза быстрее в Safary
— в два раза медленее в Хроме. Были в два раза быстрее полгода назад :)
Пишу из Австралии.
— На первой работе у меня не спрашивали резюме, и у меня его и не было
— На вторую работу я попал из-за side project (3d engine)
— На третью работу я попал из-за side project (картография)
— На четвертую работу я _думал_ что попал из-за side project (опять же картография), но нет. Хотя именно этим я там и занимался
— На пятую работу я попал из-за случайно сделанной халтурки (в исходниках было мое имя)
— И вот где-то сейчас, после 18 лет работы, начинают спрашивать и резюме, и диплом. Чисто для галочки — никому это не нужно.
So, 82 + 26 GB. But what's about the __time__? Probably this is not a quick operation.

Не совсем корректно освещен вопрос минификации, а точнее то что 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
Как проработавший в Яндексе 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, и далее по дереву. Хотя (я очень надеюсь) эти файла генерятся автоматически на основе структуры директорий (скрыто завесой тайны)

Information

Rating
Does not participate
Location
Sydney, New South Wales, Австралия
Date of birth
Registered
Activity