• 0
    Нет, я писал не вам, а отвечал на этот комментарий
    Как я перестал любить Angular
  • 0
    Да, конечно, для небольших скриптов, типа *.sh, это подходит. Но я имел в виду разработку более серьезных приложений. Поэтому, раз уж заикнулся о преимуществах статической типизации, то вкратце их перечислю:

    1. вы всегда уверены что написанный метод и результаты его работы используется вами правильно;
    2. ошибки класса «сравниваем несравниваемое» или «пихаем невпихуемое» исключаются на стадии компиляции;
    3. после перехода на ST (например, при переходе с JS на TS) вы с большой вероятностью обнаружите, что таких ошибок у вас дофига; и даже не ошибок, а скорее досадных опечаток, которых ваш замылившийся глаз в упор не замечает;
    4. нет необходимости заниматься лишними проверками типов самостоятельно; вообще, переход на ST — это довольно дешевый способ повысить качество кода, особенно когда кодовая база растет быстро за счет большой команды;
    5. ваш IDE станет намного дружелюбнее по отношению к вам; а если вы все еще пишете в блокноте, то это дополнительный стимул перейти на IDE;
    6. рефакторинг перестает быть нудным и кропотливым занятием, после которого частенько появляются новые баги; поправив какой-нибудь метод вы не пропустите какое-нибудь место, где он вызывается в дебрях вашего проекта — компилятор услужливо вам напомнит;
    7. читабельность кода заметно повышается.
    Как я перестал любить Angular
  • 0
    В основном в коробке идёт красивая анимированная пальце-тыкательная хромая замена стандартным контролам браузера

    Вы наверное про Angular Material 2? Но она не совсем в коробке, просто Google продвигает данную тему (Material Design) и поэтому рекомендует по-умолчанию. На самом деле UI систем много, часть из них перечислены тут angular.io/resources в разделе UI Components. Рекомендую приглядеться к Semantic UI, Clarity Design System и Prime NG.

    Я лично чаще всего использую голый bootstrap.css без bootstrap.js/jQuery (4 версия наконец-то собирается из SCSS, что делает более простой сборку с помощью Angular CLI).
    Как я перестал любить Angular
  • 0
    Похоже, вы просто не нашли времени познакомиться с TS и прочувствовать на себе преимущества статической типизацией. А если рассматривать сравнение с динамической типизацией, то выяснится, что у DT нет никаких преимуществ перед ST, кроме сомнительного «более низкий порог вхождения в ЯП».
    Как я перестал любить Angular
  • –1
    1. Это действительно очень грустно, так как Angular запущенный в dev-режиме не устанет вам напоминать об этом в консоли, а самый простой способ от этого избавиться, используя Angular CLI, запустить с этим самым ключом. Ну и dev/prod-конфиги в папке environment должны наводить на какие-то мысли. Грустно, что разработчики использующие angular, не могут в документацию.
    Я сам использую Angular с 2-rc.1 версии, когда никаким CLI еще не пахло, и уже тогда интересовался, как правильно производить prod-сборку. В официальной документации был и есть на это ответ, с полным описанием разницы между JIT и AOT.
    2. По заверению разработчиков, не будет. Все, что скоро должно устареть, будет помечаться как deprecated и выводиться соответствующие оповещения об этом при сборке.
    3. Я абсолютно не согласен с вами, что разработчики angular-а настолько плохие специалисты, что постоянно делают нам плохо. На мой взгляд, они создали наиболее удобный и универсальный фреймворк, благодаря которому fronted-разработка сильно упростилась и перестала походить на обмазывание BE-костяка скриптами и библиотеками. Да и вообще, большинство претензий как автора статьи, так и комментаторов мне абсолютно не понятны и попахивают вкусовщиной.

    Ну и npm update не переведет ваш проект с 4 на 5 версию автоматически. Предполагается, что при смене мажорной версии, любой разработчик изучает changelog и советы по переходу на новую версию, а не делает это с закрытыми глазами на проде.
    Как я перестал любить Angular
  • 0
    Про ошибки в шаблонах, которые не отображаются при JIT-компиляции. Насколько я читал, разработчики ангуляра к пятой версии хотят сделать быстрые инкрементальные сборки для AOT и выпилить JIT совсем.
    Как я перестал любить Angular
  • 0
    Навскидку:
    1. Использовать Transclusion
    2. Использовать вторичные роуты (якоря на заголовки на странице глючат, поэтом если вас перекинет не туда, сделайте поиск по странице: «Displaying multiple routes in named outlets»).
    Динамический рендеринг компонентов в Angular 2
  • +4
    Забавный опрос) Ну как можно называть маленькую библиотечку Redux фреймворком? Или React сам по себе? Или библиотеку RxJX? И т.д.
    DevConf::Frontend — 17 июня в Москве: Angular 4, React Native, выбор JS-фреймоврка для крупного проекта + Lua Meetup
  • 0
    Я там в конце сделал сноску, что в редких случаях все же допускаю их использование. Но только в тех случаях, когда реально без этого не обойтись, как правило для сессионных данных. Ну хотя бы тот же токен пользователя надо как-то хранить, а не заставлять его авторизовываться заново, если ему приспичит нажать F5.
    Дзен не позвонит
  • 0
    Очевидно, своей простотой и поддержкой браузерами по-умолчанию. Плюс, грамотное использование localStorage решает вопрос, когда пользователь в вашем SPA-приложении пытается открыть ссылку в новой вкладке.
    Дзен не позвонит
  • 0
    При создании SPA, те самые элементы, которые на серверных языках я бы реализовывал через хранение данных в сессии (тот же профиль пользователя), приходится использовать storage-ы и модели, которые получают данные из них.

    Т.е., поставленную вами задачу я бы решал следующим образом: создал отдельный компонент Layout, который будет показываться по-умолчанию на страницах и содержит компонент c шапкой, в котором отображаются данные авторизованного пользователя, которые берутся из сессии (т. е. из storage-а). Обновлять данные в шапке можно по ngDoCheck, а чтобы это никак не сказалось на производительности, в механизм нашей сессионной модели несложно добавить проверку на последнее изменение по Timestamp-у.

    Конкретно всё это безобразие можно реализовать и другими способами (от предложенного общего сервиса, до синглтона-хранилища-состояний). Но у использования того же localStorage в данном конкретном примере очевидны свои плюсы.

    Но это, опять же, если я правильно понял ваш пример. Часто годятся и «оутпуты до корня». Пример: личный кабинет пользователя — корневой компонент. При создании загружает актуальные данные о пользователе и хранит их в себе. Имеет два дочерних компонента: Presentational — лэйаут (использую в нем transclusion посредством ng-content) отрисовывающий шапку, футер, и место, куда будет помещен второй дочерний компонент с формой редактирования данных пользователя. По сути, в данной схеме будет использован всего один output — от компонента с формой редактирования до корневого личного кабинета. Который после получения новых данных о пользователе тут же отобразит их в лэйауте (в шапке, без всяких ngDoCheck). И в такой схеме я вообще не вижу необходимость какого-то глобального стейта.
    Дзен не позвонит
  • 0
    Вот у вас есть несколько несвязанных компонент, каждая из которых подтягивает копию некоторого стейта с бекенда

    Исходя из моих принципов, у меня в любой момент времени нет нескольких несвязанных компонентов, общающихся с бэком. Всегда есть только один корневой (грубо говоря, текущая страница) привязанный к текущему роуту. Если роут меняется (не путать с изменением параметра роута), то этот компонент уничтожается, и создается новый компонент согласно новому роуту. И уже он грузит свой актуальный стейт с бэка.
    Дзен не позвонит
  • 0
    Не использую общий глобальный стейт и придерживаюсь обычно следующих принципов:

    1. деление компонентов по типу Presentational и Container Components (https://medium.com/@dan_abramov/smart-and-dumb-components-7ca2f9a7c7d0)
    2. каждый «корневой» компонент (как правило, привязанный к опредленному роуту) получает свое актуальное состояние с бэка при инициализации или изменении параметров роута
    3. корневые компоненты между собой не общаются, только через бэк
    4. корневой компонент как правило является Container Component-ом и для отрисовки передает/получает свойства своего состояния через цепочки input/output дочерним Presentational Component-ам (или, если куски большие, разбивать на несколько дочерних Container Component-ов

    Как правило, если все сделать грамотно, деревья не получаются слишом многоуровневыми и никаких проблем при передачи состояния вглубь и получения изменений через output-ы лично у меня не возникает.

    Эти принципы подробно описаны в официальной документации Angular-а и, как мне показалось, являются тем самым angular way.

    В редких случаях, допускаю хранение некоторых глобальных флагов и пр. в storage-ах.
    Дзен не позвонит
  • 0
    Часто в подобных опросах такой вариант становится лидирующим и портит вид общей статистики. Именно для этого на хабре есть кнопка воздержаться.

    В данный момент: Проголосовало 152 человека. Воздержалось 150 человек. Полагаю, эти 50% пользователи как раз таки «не используют» redux.
    Дзен не позвонит
  • +1
    Знакомство с первым AngularJS у меня так и не состоялось, отпугнули как раз вот такие слухи о его сложности и неудобности. Но вот со второй версией случилась любовь с первого взгляда. Восхитило, насколько в нем все логично и просто устроено. Не считая, конечно, некоторой сложности в сетапе и сборке prod-версии (это был rc1, никакого Angular CLI еще не было в помине). Но, спасибо webpack-у за наше счастливое детство, сложности эти были легко преодолены.

    К чему эти дифирамбы? Просто на главной странице документации redux написано, что его можно использовать с чем угодно, не только с react-ом, но и с Angular 2+. Но за все время разработки на последнем, я так и не смог придумать, для чего мне мог бы пригодиться redux.
    Дзен не позвонит
  • +2
    Циклом правильную задержку не сделать, рекурсией элементарно решается
    const delay = 50, f = function _f(i) {
    	if (i > 100) return;
    	setTimeout(() => {
    		let s = '';
    		if (i % 3 === 0) s += 'Miss';
    		if (i % 5 === 0) s += 'Kiss';
    		console.log(s ? s : i);
    		_f(++i);
    	}, delay);
    };
    f(1);
    
    Почему программисты не могут программировать
  • 0
    У меня от светлых букв на темном фоне очень сильно устают глаза. Плюс, строки белых букв как бы отпечатываются на сетчатке и я их потом очень долго вижу даже когда смотрю в сторону от монитора. С белым фоном/темными буквами такой проблемы нет.
    Почему мы меняем цветовые схемы?
  • 0
    Спасибо за подаренный значок «отхабренный». Ранее, я хотя бы мог отвечать вам без ограничений по времени, а теперь даже этого удовольствия вы меня лишили.

    А скажите, товарищ сисадмин, обслуживаете ли вы какую-либо информационную систему с данными пользователей? Если да, есть ли у вас физический доступ к бэкапам этой системы? И самое главное, что происходит с носителями, на которых эти бэкапы были записаны, после того как истек срок их службы?
    Вконтакте совершил очередной прорыв. На короткое время все пользователи соцсети получили права модераторов
  • 0
    А что вам по факту не понравилось в моем комментарии? Или вы с призывом шифровать все подряд, использовать TOR, VPN, спать с учебником по информационной безопасности под подушкой и т.д.? Каким бы безопасным не было приложение, всегда есть вероятность утечки. Ну и еще один факт, которому учат на курсах по информационной безопасности: чем безопаснее приложение, тем дороже его разработка и обслуживание, а также сложнее использование. Поэтому в коммерческой разработке никто не стремится к 100%-ой безопасности, а находят какое-то промежуточное положение, удовлетворяющее затратам бизнеса и ожиданиям пользователей.

    Все что я хотел сказать на самом деле не сложнее следующего: если вы хотите, чтобы ваши приватные данные, такие как фотографии, например, оставались приватными — просто не выкладывайте их в сеть. Иначе, не удивляйтесь, если обнаружите их где-то еще.

    Спасибо за внимание, можете сходить.
    Вконтакте совершил очередной прорыв. На короткое время все пользователи соцсети получили права модераторов
  • +5
    Я раньше тоже так думал, и слепо верил в «нормальность» крупных серьезных компаний. Но в качестве иллюстрации, расскажу, то довелось поработать в одной компании, которая разрабатывала портал по заказу правительства (тут без подробностей). И где-то уже через пару недель работы мне дали доступы к базе, которая содержала личные данные реальных людей, кто хоть раз авторизовался на этом портале (ФИО, СНИЛС, номер паспорта, дата рождения, адрес регистрации, информация по детям, номера ВУ и пр. пр.). На минутку, никаких вагонов бумажек, кроме стандартного NDA при приеме на работу, я не подписывал. При желании, я мог лего слить все эти данные (чего я делать не стал), например, на флешку: комп был обычным, usb-порты не были заблокированы. Так что, верить не стоит никому.
    Вконтакте совершил очередной прорыв. На короткое время все пользователи соцсети получили права модераторов
  • +5
    Даже если отойти от модераторов и правовой стороны вопроса. Представим на минуту, что в соц. сети X есть инженер Петя, у которого есть доступ к боевой таблице БД с переписками пользователей. И вот он во время выполнения какой-то задачи или в свой обеденный перерыв делает обычный «SELECT ...» с рандомным id диалога, результатом выборки которого становится ваша переписка с вашим же знакомым. Петя пробегает глазами по переписке, ничего для себя не находит интересного, закрывает результаты выборки и продолжает заниматься своими делами. Этой вот выборкой Петя много чего нарушил, в правовом поле и не только. Но по факту, никто об этом никогда не узнает и ничего этому Пете за это не будет. Хотя тайна вашей переписки и была нарушена. Хотите приватности — общайтесь тет-а-тет. А сеть вам приватность гарантировать не может.
    Вконтакте совершил очередной прорыв. На короткое время все пользователи соцсети получили права модераторов
  • +40
    А я не понимаю всей этой шумихи насчет скрытых фото. Именно тот момент, что все так удивляются, когда узнают, что модераторам могут быть доступны для просмотра любые материалы пользователей, пусть они хоть трижды помечены как скрытые. Фото может считаться приватным только до того момента, как оно было выложено в сеть. Как только ты вложил его на любую площадку, считай его уже посмотрели: твой провайдер, фсб-шники, держатель хостинга, админы/разрабы/модераторы площадки, хакер Вася и, наконец, все пользователи того популярного развлекательного сайта, куда Вася их выложил.
    Вконтакте совершил очередной прорыв. На короткое время все пользователи соцсети получили права модераторов
  • +2
    Демо-пример явно недоработанный. Пока скроллим вниз — все нормально. Но если перейти в начало (нажать «Home» / перейти по якорю #) — то увидим лишь белый экран. И еще, при скролле вверх скроллбар дергается как ненормальный. Chrome 54.
    Про оптимизацию рендеринга — с оптимизмом
  • +3
    Вызов document.getElementById три раза вместо одного не может существенно замедлить выполнение скрипта. Дело в том, что при вызове этого метода никакой код не обходит весь DOM. Браузеры сами индексируют все элементы с id, поэтому доступ к ним получается довольно быстрым (хотя конечно не таким быстрым, как если бы вы закешировали данную выборку сами). Попробуйте сделать html файлик со следующим содержанием и загляните в консоль:
    <div id="aaa"></div>
    <script>console.log(aaa);</script>
    


    Вот на что действительно следует обратить внимание, так это на глобальные выборки не по id-селекторам, по которым коду на самом деле приходится обходить весь DOM (вроде «div.some_class»).
    Как ухудшить производительность вашего приложения — типичные ошибки разработчиков
  • +1
    1. short tags в php-шаблонах — не антипаттерн
    2. глобальных переменных в этой строчке нет, только объявленная константа
    3. синглотона тут тоже нет, есть вызов статического метода из класса-хелпера CUtil
    4. про шаблонизаторы спорно, но использование php-шаблонов уж точно не антипаттерн
    Как Битрикс чуть Новый Год не погубил
  • 0
    На мобильные браузеры я бы особо пока не надеялся. По опыту, довольно сносно WebGL работает на мобильном Хроме. На мобильном Windows 8 IE пока не умеет WebGL, обещают скоро добавить, видимо, в 10 винде. На десктопе IE11 тоже хорошо справляется. А вот FF почему-то отказывается работать в WebGL контексте как на мобильном у меня, так и на десктопе, несмотря даже на все настройки в about:config — при вызове PIXI.autoDetectRenderer в FF всегда выбирается медленный «canvas» вместо «webgl». Не знаю, может руки у меня кривые.
    Ресайз картинок в браузере. Все очень плохо
  • 0
    Вы меня опередили. Действительно, ресайз на GPU проходит заметно быстрее при довольно хорошем качестве. Рекомендую всем желающим попробовать:
    1. Подключаете PIXI.js для простоты работы и создаете сцену (var stage = new PIXI.Stage(0xffffff))
    2. Высчитываете пропорции сцены и коэффициенты масштабирования по каждой стороне
    3. Создаете текстуру с оригинальным изображением (var texture = new PIXI.Texture.fromImage('path/to/image'))
    4. Создаете спрайт с этой текстурой (var sprite = new PIXI.Sprite(texture)), выставляете коэффициенты масштабирования (sprite.scale = {x:… ,y: ...})
    5. Добавляете спрайт на сцену (stage.addChild(sprite)) и рендерите изображение (renderer = PIXI.autoDetectRenderer(newWidth, newHeight); renderer.render(stage);)

    Можно и без PIXI, конечно, просто будет заметно больше кода. Но для тестов можно и так попробовать.
    Ресайз картинок в браузере. Все очень плохо
  • 0
    А я помнится решил проблему с помощью WebGL (для большей простоты еще и с PIXI.js). Конечно, это не для всех браузеров, но в своей админке я обычно хозяйничал сам и заходил только под Хромом. Тесты производительности не делал, но проблем и подвисаний даже с огромными изображениями не было.
    Ресайз картинок в браузере. Все очень плохо
  • +3
    Реально неприятно. Было написано 0 статей, но очень много положительных комментариев, которые могли быть полезны другим читателям. От такого нововведения желания писать статьи не появилось, но и комментарии писать больше не хочется. Как плевок в лицо.
    Амнистия и обнуление
  • +11
    Напомнило случай, когда ребятам, участвовавшим в конкурсе 10k apart, не хватало тех самых 10кб для js-кода. Тогда они (вдохновившись наработками других иностранных коллег) написали небольшой скрипт, который кодировал байты js-кода в точки для png-картинки:

    image
    jquery.1.8.2.min.js — 91кб до сжатия, 34кб в виде png-файла

    Эту картинку можно легко нарисовать на canvas-е и считать js-код обратно, выполнив его eval-ом. Совместив эту идею с вашей котофускацией, можно сделать неплохой обфускатор js файлов, особенно если запутать код самого дешифратора.
    Котфускация исполняемого .net кода
  • +21
    Тоже всегда путаюсь но только не в таком примере, как добавили вы, а вот в таких интерфейсах:

    ON — это индикатор состояния («включено»), или подпись действия по нажатию («включить»)?
    С чего началось использование [x] в дизайне графических интерфейсов
  • +6
    Извините, ничего, так как ни разу не пользовался этим мобильным приложением. Если там этой ссылки нет, то лучше, наверное, обратиться об этом к ТМ, чтобы они добавили ее в грядущих версиях.
    С чего началось использование [x] в дизайне графических интерфейсов
  • +2
    Спасибо, не такой уж вы и useless :-) С дизайнером PS никак не могу согласиться, по-моему, он все же накосячил. Да даже эта фраза «X marks the spot» похоже на отмазку, я бы сказал «V (галочка) marks the spot».
    С чего началось использование [x] в дизайне графических интерфейсов
  • +2
    Я знаю, что значит крестик у русских. Вопрос был: «намеренно ли и для каких целей Sony ввела некоторую неразбериху в своих интерфейсах».
    С чего началось использование [x] в дизайне графических интерфейсов
  • 0
    То есть, только в японской PSP, ползая по интерфейсу, кружочек будет подтверждать действие, а крестик отменять? Интересно, но все равно остается нелогичным для «неяпонцев».
    С чего началось использование [x] в дизайне графических интерфейсов
  • +3
    И что? У японцев x (Batsu), тоже, по идее, означает «нет», «неправильно».
    «Batsu» in Japanese means the cross mark ( x ) you put when something is wrong.
    С чего началось использование [x] в дизайне графических интерфейсов
  • +9
    Ссылка есть в плашке под статьей, где и должна быть в интерфейсе хабра.
    С чего началось использование [x] в дизайне графических интерфейсов