• В чем отличие EventLoop в браузере от EventLoop в Node.js?

    black1277
    @black1277
    Вольный стрелок
    Вы немного запутались. Начиная с 11-й версии Node.js, разница в поведении приведенного вами кода в браузере и ноде - была устранена. Касаемо 6 этапов или фаз, они происходят внутри движка libuv(libuv - это многоплатформенная библиотека C, которая обеспечивает поддержку асинхронного ввода-вывода на основе циклов событий).
    Разница в том, что в Node.js мы можем не дожидаться окончания всех этих фаз, а вклиниться на определенных этапах для исполнения микрозадач (при помощи setImmediate и process.nextTick), а в браузере идет взаимодействие с Web API’s (браузерные или веб API), из которого могут поступать новые события (клики, движения мыши и др.), добавляющие в очередь новые макрозадачи(если установлены обработчики этих событий). Кроме того, в браузере есть рендеринг, который не может быть выполнен пока идет выполнение задачи движком(из этого следует, что необходимо разбивать тяжелые и длительные задачи на части).
    Как я не пытался изложить точнее и короче, к моим словам можно придраться буквально к каждой фразе. Поэтому, лучше самому изучить первоисточник и пару статей на русском:
    What is the Event Loop?
    Объяснение работы EventLoop в JavaScript
    Игра по правилам: Event loop Node.js
    Как устроены цикл событий и стек вызовов в JavaScript
    Ответ написан
    1 комментарий
  • Что означает "!!~"?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Сокращалка, удобная для indexOf(), который возвращает -1 если не найдено, или индекс от 0 и больше.

    Для логики приложения часто бывает нужно узнать только, найдено или нет: т.е. -1 или иное значение. Можно просто сравнивать if (a.indexOf(b) > -1) { /* найдено! */ } но иногда хочется короче.

    Битовый оператор НЕ ~ хорош тем, что выделяет -1: только -1 с этим оператором даст 0. Прочие числа дадут какое-то ненулевое значение.

    ~(-1) === 0

    Остаётся привести значение из численного в булево. Для этого два воскл. знака — два логических НЕ.
    • для варианта «найдено» из числа от 0 и больше получилось тоже ненулевое число, и !! даст true
    • для варианта «не найдено» из -1 получится уникальный 0, и !!0 вернёт false
    Ответ написан
    4 комментария
  • Как перейти на вторую html страницу без перезагрузки?

    Dnebl
    @Dnebl
    Ответ написан
    Комментировать
  • В чем смысл использовать хуки?

    @dmitry-toster
    Были классы, были HOC

    Они и сейчас есть. Касательно HOC: в виду того, что мы не можем подключить компонент напрямую к стору, приходится делать доп.обертку mapStateToProps. Тем самым над компонентом нарастает еще один компонент который связан со складом. Потом еще одна обертка withStore, withRouter и тд. В дебаггере начинаешь уже видеть большую вложенность компонентов и по мере роста приложения это уже становится антипаттерном. Это все плохо работает с точки зрения минификации и производительности из-за больших деревьев вложенности.
    компоненты разделены на Container/Component или Умный и Глупый

    В чем проблема? Вы тоже самое можете организовать и с хуками
    И если жить с хуками только React еще можно, но когда проект не демонстрационный, а реальный, то подключено еще кучу различных библиотек, у каждой второй есть хуки, в итоге все перемешано.

    Как правило все сторонние подключаемые библиотеки уже содержат в себе хуки из коробки, а те что еще нет, будут поддерживать в следующих версиях. Тоже не вижу здесь проблем.
    Далее философия Redux, "не диспатчить actions напрямую", все через actions creator и тп и тд, сейчас нам просто предоставляется dispatch из useDispatch()

    Эта философия сохраняется и при использование хуков. Вы через useDispatch также диспатчите нужные экшены
    Раньше можно было взять компонент, передать props и быть довольным.

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

    Основные 2 причины: отказ от HOC и эмуляция методов жизненного цикла у функциональных компонентов.
    Ответ написан
    Комментировать
  • Как устранить ошибку Error: "env(safe-area-inset-right)" is not a number for `max' в Fancybox3?

    @ziqq
    Добавьте 2 миксина

    @function max($numbers...) {
      @return m#{a}x(#{$numbers});
    }
    
    @function min($numbers...) {
      @return m#{i}n(#{$numbers});
    }
    Ответ написан
    2 комментария
  • Рабочая виза в Германии без диплома программисту?

    @makaron
    Чтобы получить Blau Karte обязательно нужно иметь высшее образование, закон был изменён пару лет назад и стаж более не засчитывается. Визы для работы - Голубая карта ЕС (сайт генконсул....

    Без высшего образования можно получить рабочую визу D. Она не такая гибкая как Blaue Karte. Вы будете привязаны к работодателю все 5 лет до получения Niederlassungserlaubnis. Для работодателя процесс будет немного сложнее. Рекомендую к прочтению Иммиграция в Германию.

    Удачи!
    Ответ написан
    7 комментариев
  • Как декодировать странный текст со страницы?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Это не "странный текст", а unicode escape sequence, в которые, в соответствии со стандартом JSON, должны преобразовываться символы не входящие в диапазон ASCII. Просто преобразуйте строку, содержащую JSON, в данные Python с помощью json.loads().
    Ответ написан
    1 комментарий
  • Как отверстать такие линии не изображением?

    iamd503
    @iamd503 Куратор тега CSS
    Верстальщик
    Сталкивался с таким дизайном и дизайнерами, которые такое рисуют - больше с ними не работаем
    Ответ написан
    2 комментария
  • Как правильно настроить мультиязычный сайт для поисковых роботов Google и Яндекс?

    @granty
    1. ПС будет рать только одну версию страницы, вы же всем делаете редирект 301, включая роботов ПС. Редиректом вы не дадите ботам ПС проиндексировать языковые версии и увидеть ваши hreflang.

    2. Да, для Google в вашем(языковая версия сайта в папке) случае нужно указывать hreflang или делать привязку через sitemap.
    - Рекомендации Google Как управлять мультирегиональными и многоязычными ...
    - Google потом в Отчете "Таргетинг по странам и языкам" показывает ошибки, связанные с использованием атрибута hreflang на вашем сайте.

    - Яндекс тоже поддерживает локализацию через sitemap и через hreflang.

    И старенькие ссылки на Хабр (прочитать бегло по диагонали для общего понимания):
    - Грамотное определение языка пользователя рекомендуют не делать жесткую привязку к языку - пользователь должен выбирать сам.
    - Разбираемся с построением мультирегиональных сайтов рассказано как правильно делать многоязычные сайты и как поисковики отреагируют на это (там сказано что Яндекс не поддерживает Sitemap, уже поддерживает - ссылка выше).
    Ответ написан
    3 комментария
  • Как реализовать такую расстановку блоков на FlexBox CSS?

    sfi0zy
    @sfi0zy Куратор тега CSS
    Creative frontend developer
    С помощью чего и как можно реализовать вот такую расстановку блоков?

    На ум сразу приходит masonry.
    Ответ написан
    Комментировать
  • Могут ли контейнеры содержать классы и разметку?

    Robur
    @Robur
    Знаю больше чем это необходимо
    Компоненты в Реакте делятся на несколько основных групп (напишите где ошибаюсь):


    Ошибаетесь в том что в реакте компоненты делятся на какие-то такие группы. В реакте компоненты делятся совсем по другому - функциональные, на основе классов и так далее.

    на презентативные/контейнеры они делятся уже не "в реакте", а в вашем конкретном приложении, при условии что вы выбрали тот подход для построения который предлагается в статьях Дена Абрамова.
    Стоит отметить что это было просто его мнение на тот момент, а сейчас он пишет:
    Update from 2019: I wrote this article a long time ago and my views have since evolved. In particular, I don’t suggest splitting your components like this anymore.


    Можно выбрать и какой-то другой подход. И делить по другому. Или вообще на других принципах строить архитектуру. Или видоизменить его подход под какие-то свои конкретные нужны и так далее.

    поэтому ответ на вопрос:
    Если мы хотим чтобы шапка была серая, куда писать этот стиль?

    Зависит от того - как вы в итоге строите свое приложение.
    Поэтому ответ - как вы сами считаете правильным.
    Для меня критейрий прост - если вы решили делать вещи каким-то образом и через время, когда вам нужно что-то сделать в этом коде вы материтесь и страдаете - решение было неверным. надо делать по другому. Если же меняете то что нужно достаточно легко и без проблем - вы все сделали правильно.

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

    Если вам обязательно нужны формальные правила построения компонентов - определите для себя любые как больше нравится и им следуйте. Потом поменяете, если не зайдет.
    Ответ написан
    3 комментария
  • В чем разница между двумя способами подключения события?

    like-a-boss
    @like-a-boss
    Признайся,тебяТянетНаКодМужика,ты—программный гей
    Разница в том, что в первом случае вы можете установить всего один обработчик данного типа на элемент. Если попробуете таким образом "добавить" ещё один обработчик, то он просто перезапишет первый.

    Во втором случае обработчик добавляется (о чём, собственно, и повествует наименование метода) вне зависимости от того есть на элементе обработчик этого же типа события или нет.
    Ответ написан
    2 комментария
  • Какие технолгии здесь используются для подобного функционала?

    alams_stoyne
    @alams_stoyne
    Full Stack Developer - #PHP #CSS #JS #DB
    Для решения такой задачи я использовал konvajs
    Данные тянул из БД с помощью php сразу (смысла лишний раз делать запросы не увидел)
    Рендер и взаимодействие написаны на JS

    Как это работает
    Ответ написан
    2 комментария
  • Как верстаются блоки со сложным вырезом?

    RAX7
    @RAX7
    на SVG вырез можно сделать хоть в форме котенка
    Ответ написан
    4 комментария
  • Когда использовать useCallback, useMemo и useEffect?

    @LEXA_JA
    useEffect - это хук, который позволяет использовать сайд эффект. В классах его аналогом было использование componentDidMount, componentDidUpdate и componentWillUnmount. В нем можно делать подписки, отправлять запросы управлять анимацией и т. д.
    const [data, setData] = useState(null);
    
    useEffect(() => {
      const controller = new AbortController()
      fetchData(controller.signal).then(setData)
    
      return () => controller.abort()
    }, [fetchData, setData])


    useCallback и useMemo предназначены для оптимизации. useCallback получает на функцию и массив аргументов, и возвращает одну и туже функцию, до тех пор, пока аргументы не изменились. useMemo отличается тем, что он возвращает не саму функцию, а результат её выполнения. По большому счету они являются взаимозаменямыми.
    Таким образом, useMemo используется для сохранения результатов тяжёлых вычислений, например обработка массива.
    const data = useMemo(() => array.map(mapper).filter(predicate).reduce(reducer), [array])

    А useCallback используется, когда важна постоянность ссылок на функцию. Например, когда мы передаём ссылку в компонент, который использует React.PureComponent или React.memo, или, когда функция используется в качестве аргумента в других хуках
    const handler = useCallback(() => {
      // что-то сделать 
    }, [])
    
    useEffect(() => {
      handler(value)
      // если не использовать useCallback, эффект будет срабатывать постоянно 
    }, [handler, value])
    Ответ написан
    1 комментарий
  • Где порешать задания на асинхронщину?

    mtix
    @mtix
    Front-end developer
    Могу посоветовать хороший курс по асинхронному программированию https://habr.com/ru/post/452974/ . Пройдите и у Вас не должно остаться вопросов.
    Ответ написан
    Комментировать
  • Плавный переход между страницами сайта. Как реализовать?

    webirus
    @webirus
    Тыжверстальщик! Наверстай мне упущенное...
    https://s-sd.ru/files/ppcontent/index.html
    https://s-sd.ru/blog_studio_design/plavnaya_smena_...
    Делайте что хотите в качестве эффектов %)
    По идее, это делается 10-15 строк jquery.
    А логика у этого плагина простая, как 5 копеек.
    1. Жмем на ссылку перейти по ссылке.
    2. Страница откладывает переход, запоминая ссылку.
    3. Сначала показывает эффект, потом скрывает всю страницу.
    4. Потом уже переходит на другую страницу.
    5. А на новой странице, просто идет плавная загрузка контента.
    Ответ написан
    3 комментария
  • Почему mediatopic.post при попытке опубликовать фотографию "кидает" NOT_FOUND: not.found.photouploadinglocal?

    Vjaka
    @Vjaka
    Платформа игр (Одноклассники)
    Вероятнее всего на этапе получения URL не указывается ID группы.
    На этапе получения URL для загрузки фото в параметрах необходимо передавать ID группы, в которую будет делаться пост медиатопика ( ID альбома "картинки из тем" указывать не надо )
    Ответ написан
    Комментировать
  • Как загрузить и отправить фото в сообщения через VK API?

    Приведу пример рабочей функции для загрузки фото для товаров в ВК, возможно поможет:
    function VKaddGoodsOnMarket ($name,$description,$category_id,$price,$photourl) {
    	$vkToken = '';
    	$vkGroupID = '';
    	$vkVersionAPI = '5.60';
    	//Получаем ссылку для загрузки фото
    	$GET_getMarketUploadServer = [
    		'group_id' => $vkGroupID, 
    		'main_photo' => 1,
    		'access_token' => $vkToken,
    		'v' => $vkVersionAPI
    	];
    	$resukt_url_dp = json_decode(file_get_contents('https://api.vk.com/method/photos.getMarketUploadServer?'.http_build_query($GET_getMarketUploadServer)), TRUE);
    	//Загружаем фото КУРЛом, отправляя ПОСТ на полученю ссылку
    	$curl_file = curl_file_create($photourl,'image/jpeg','test_name.jpg');
    	$ch=curl_init();
    	curl_setopt_array($ch, array(
    	CURLOPT_RETURNTRANSFER => 1,
    	CURLOPT_URL => $resukt_url_dp['response']['upload_url'],
    	CURLOPT_POST => 1,
    	CURLOPT_POSTFIELDS => array("photo" => $curl_file)
    	));
    	//Получим массив с хешем и прочим
    	$img_attach = json_decode(curl_exec($ch), true);
    	
    	//Сохраняем фоточку отпрявляя ГЕТ запрос в ВК
    	$GET_saveMarketPhoto = [
    		'group_id' => $vkGroupID, 
    		'photo' => stripslashes($img_attach['photo']),
    		'server' => $img_attach['server'],
    		'hash' => $img_attach['hash'],
    		'crop_data' => $img_attach['crop_data'],
    		'crop_hash' => $img_attach['crop_hash'],
    		'access_token' => $vkToken,
    		'v' => $vkVersionAPI
    	];
    	$photo = json_decode(file_get_contents('https://api.vk.com/method/photos.saveMarketPhoto?'.http_build_query($GET_saveMarketPhoto)), TRUE);
    	
    	$photoGoods = $photo['response'][0]['id'];
    
    	$GET_marketadd = [
    		'owner_id' => '-'.$vkGroupID.'',
    		'name' => $name,
    		'description' => $description,
    		'category_id' => $category_id,
    		'price' => $price,
    		'main_photo_id' => $photoGoods,
    		'access_token' => $vkToken,
    		'v' => $vkVersionAPI
    	];
    	$addMarket = json_decode(file_get_contents('https://api.vk.com/method/market.add?'.http_build_query($GET_marketadd)), TRUE);
    	
    	return $addMarket;
    }
    Ответ написан
    Комментировать