Задать вопрос
  • Как отлаживать navigator.sendBeacon?

    sompylasar
    @sompylasar
    Frontend Software Engineer
    Поскольку `navigator.sendBeacon` – всего лишь способ отправлять HTTP-запросы (причем еще и без обработки ответов), то отлаживать его проще всего, подменив HTTP-сервер, принимающий эти запросы.

    Если есть возможность изменить protocol и hostname в целевом URL – идеально: можно перенаправить запрос на localhost или любой другой домен, на котором поднять простенький HTTP-сервер на чем угодно (Node / Python), логирующий приходящие запросы в stdout или в файл.
    Ответ написан
    Комментировать
  • Настройка окружения для front end?

    sompylasar
    @sompylasar
    Frontend Software Engineer
    Зависит от того, собираетесь вы делать сайт (то есть с большим количеством доступного для поисковиков контента, верстки, дизайна, с небольшим повторным использованием компонентов и небольшим интерактивом в целом) или веб-приложение (с большим количеством интерактива, обычно за авторизацией, с большим количеством повторно используемых компонентов).

    Для веб-приложений могу порекомендовать https://github.com/facebookincubator/create-react-app с подключенным https://www.npmjs.com/package/custom-react-scripts... – этот комплект даст быстрый старт в сборку статичного React-приложения с SASS- и CSS-модулями (БЭМ-классы генерируются автоматически, стили принадлежат компонентам). Можно прикрутить его к любому бэкенду, если требуется, но он не даст необходимого для контент-нагруженного сайта: нет генерации полной разметки на сервере. Здесь перечислены некоторые альтернативы: https://github.com/facebookincubator/create-react-...

    Не сочтите за саморекламу, но недавно рассказывал о том, как думать компонентами – может, пригодится:
    1. https://www.slideshare.net/IvanBabak/think-compone...
    2. https://www.slideshare.net/IvanBabak/think-compone...
    Ответ написан
    Комментировать
  • Где и как хранить тестовые сайты?

    sompylasar
    @sompylasar
    Frontend Software Engineer
    Можете попробовать now.sh — https://zeit.co/now/
    Ответ написан
    Комментировать
  • За и против использования bootstrap?

    sompylasar
    @sompylasar
    Frontend Software Engineer
    Повторю здесь в виде ответа.

    Бутстрап может хорошо подойти для одноразовой, шаблонной работы (примерно то, чем в стиле конвеера занимаются веб-студии).

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

    Бутстрап -- это 600+ глобальных переменных. Если это на мысли не наталкивает, значит, вероятно, вы не делали больших продуктов с длительным сроком жизни.

    А стиль кодирования и методологию верстки нужно не фреймворком навязывать, а принципами, от фреймворка не зависящими (и уже под них подбирать фреймворк, если потребуется -- а зачастую разрабатывать его самостоятельно).
    Ответ написан
    Комментировать
  • Как защитить изображения от PrintScreen?

    sompylasar
    @sompylasar
    Frontend Software Engineer
    Без JS можно переключать части картинок CSS-анимацией.

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

    Насчет перехвата клавиши Print Screen -- это не сработает, существует огромный набор других способов сделать снимок экрана и веб-страницы. Вплоть до расширений браузера, которые средствами браузера рисуют всю страницу на canvas и забирают с него растр.
    Ответ написан
    Комментировать
  • Какие вы знаете русскоязычные сайты для изучения программирования?

    sompylasar
    @sompylasar
    Frontend Software Engineer
    Англоязычное сообщество разработчиков намного больше русскоязычного, и английский язык используется для унификации и обмена опытом. Огромное количество новых материалов, библиотек, инструментов выходят на английском языке, будучи разработанными русскими, немцами, испанцами, даже китайцами. Их переводы на русский язык, если кто-то и возьмется, всегда будут отставать от первоисточника, а зачастую их просто не будет, и вы многое потеряете. Учитесь, читайте статьи и обсуждения в оригинале, пробуйте общаться с другими англоязычными разработчиками (например, на GitHub, в публичных Slack- и других чатах).

    Какие ресурсы помогут в изучении английского языка для веб-разработки?
    Ответ написан
    Комментировать
  • Битовое отрицание в JS

    sompylasar
    @sompylasar
    Frontend Software Engineer
    На собеседованиях спрашивают потому, что ~~ — это быстрая альтернатива Math.floor для небольших чисел (которые влезают в int32).

    jsperf.com/math-floor-vs-math-round-vs-parseint/74

    Для выполнения Math.floor движку потребуется пройтись вверх до глобального пространства имен, чтобы найти там Math (вдруг кто определил переменную с таким именем?), получить свойство floor объекта (вдруг кто перезаписал его?), вызвать его как функцию, в которую передать параметр, затем вернуть значение.

    В случае с оператором, который в JavaScript перегрузить нельзя, накладные расходы минимальны.

    Единственное ограничение — разрядность. С современными timestamp'ами из Date#getTime, к сожалению, уже не сработает (будет переполнение).
    Ответ написан
  • Вопрос про область видимости в JS?

    sompylasar
    @sompylasar
    Frontend Software Engineer
    Пожалуйста, не путайте объявление (создание) функции и вызов функции. В вашем коде вызывается функция foo, ей передается в качестве параметра тут же созданная анонимная функция, которая может вообще не быть вызвана или хоть как-то использована внутри foo. Поэтому, как заметили ранее blo и kuzemchik, результат зависит от кода функции foo и от ее синхронности.

    В неупрощенном примере, по-видимому, вы используете Node.js, поэтому лучше воспользоваться полностью асинхронной моделью, нежели заменять функцию на синхронную, то есть в функцию getView принимать функцию, которая будет вызвана по завершении асинхронной операции и будет принимать результат завершения.

    И еще, на мой взгляд, лучше явно отличать случаи ошибки и правильного исполнения, то есть в output при неудаче класть null или undefined, а не строку с «магическим» содержанием 'not exists'.

    function getView(name, params, callback) {
    //< Дополнительный параметр должен быть function callback(error, output) 
        var filepath = ...;
        path.exists(filepath, function (exists) {
            var view = ...,
                error = null, //< Ошибки изначально нет.
                output = null; //< Результата изначально нет.
            
            if (exists) {
                output = ...; //< Записываем результат выполнения. Ошибки нет.
            }
            else {
                error = new Error('View '+ name + ' file ' + filepath + ' not found'); //< Результата нет, но есть ошибка.
                console.log(error); //< Её и логируем.
            }
            callback(error, output); //< Вызываем обработчик завершения, в который передаем ошибку (даже если ее нет, всегда первым параметром - так принято в Node.js) и следом результат.
        });
        //< Ничего не возвращаем. Результат попадет в callback, когда он станет доступным.
    }
    
    Ответ написан
    Комментировать