Задать вопрос
  • Как отключить синхронизацию темы оформления в VS Code?

    bingo347
    @bingo347
    Crazy on performance...
    settingsSync.ignoredExtensions
    В нем массив id расширений, которые не нужно синхронизировать, пропишите там id обоих тем
    Ответ написан
  • Как прописать тип для клонированного объекта, чьи значения были изменены рекурсивно?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Можно добавить такой тип:
    type RulersMap<R extends Record<string, unknown>> = {
      [K in keyof R]: R[K] extends number
        ? `${R[K]}px`
        : R[K] extends Record<string, unknown>
          ? RulersMap<R[K]>
          : R[K];
    };
    и привести результат к типу RulersMap<typeof rulers>
    Проблема в том, что у либы map-obj не очень то хорошо типы для deep варианта написаны, хотя можно свои написать при желании.
    Ответ написан
    Комментировать
  • Как изменить значение обьекта на имя?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Object.keys(object[key]) = newobject[key];
    Вот на этой строчке у Вас ошибка, в JS нельзя присвоить что-то любому выражению, только переменной или полю объекта.
    Ответ написан
    Комментировать
  • Почему в объекте Response нет самого ответа?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Промис возвращаемый fetch() не ждет завершения всего запроса, он резолвится когда получены все заголовки.
    На этом месте их можно обработать и решить что делать дальше, например читать json, текст или бинарные данные из тела, или вообще не обрабатывать тело и прервать запрос.
    Так же можно читать тело ответа в виде потока, как уже указал в своем ответе Надим Закиров

    Второй промис из response.text() и response.json() нужен чтоб дождаться считывания всего тела ответа, притом response.json() еще и позволяет браузеру парсить json из ответа потоково прямо во время скачивания, опять же не блокируя поток js/ui.
    Ответ написан
    5 комментариев
  • Как выглядел Си до K&R?

    bingo347
    @bingo347
    Crazy on performance...
    Книга по языку не является стандартом языка.
    Первым стандартом для C является ANSI C (C89), до него язык был не стандартизирован и сильно зависел от конкретного компилятора (хотя кое-где, особенно в embedded, это и сейчас можно встретить).
    Ответ написан
    1 комментарий
  • Как преобразовать curl с параметром --data в fetch с методом get?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Если данные передаются в url в виде GET параметров:
    const url = new URL('http://127.0.0.1:8000/api/feed/posts/');
    url.searchParams.append('page', 1);
    
    fetch(url, {
      headers: {
        Authorization: 'Token a96a3545bb566272f0fdfb405a0cccb7173da660',
      },
    });
    Ответ написан
    Комментировать
  • Как переписать промис через async/await?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Код на then ждет промис из wait, а код на await нет
    await wait(2);
    Ответ написан
  • Почему сообщения в консоль выводятся не по порядку массива?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Promise.all(arr.map(p => {
        const link = `http://195.112.117.82:5080/photo?tov_code_internet=${encodeURIComponent(p)}`;
        return new Promise(resolve => {
            $.get(link, resolve);
        });
    })).then(dataArr => {
        for (const data of dataArr) {
            const $obj = $(data);
    
            const content = $obj[19].innerHTML;
            const title =   $obj[7].innerText;
    
            // по хорошему регулярки надо вынести наверх,
            // чтобы они компилировались 1 раз
            const text = content
                .replace(/[\n\r]/g, ' ')
                .replace (/\s{2,}/g, ' ');
    
            console.log(text + " " + title);
        }
    }).catch(err => {
        console.error(err);
    });
    Ответ написан
    Комментировать
  • Как из строки получить данные в виде массива?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    1. Нужно распарсить документ, например с помощью https://www.npmjs.com/package/parse5
    2. Вытащить из html текст нужного скрипта.
    3. Запустить этот скрипт в новом контексте, подсунув ему в глобальный объект функцию под именем sms_row_insert
    https://nodejs.org/dist/latest-v16.x/docs/api/vm.h...
    4. В подставленную функцию 2 аргументом придут нужные данные, их можно собрать в массив и обработать после выполнения скрипта либо обрабатывать на каждый вызов функции.
    Ответ написан
  • Почему не могу запушить изменения на страницу в гитхабе?

    bingo347
    @bingo347
    Crazy on performance...
    А Вы читать ошибку пробовали? Там же все расписано...
    Нужно сделать git pull перед git push, чтобы получить изменения, которых у Вас нет локально.
    Ответ написан
    4 комментария
  • Как испольовать npm link?

    bingo347
    @bingo347
    Crazy on performance...
    https://docs.npmjs.com/cli/v7/commands/npm-link#sy...
    Пример в самом начале.
    Суть в том, что npm link нужно использовать 2 раза, сначала в папке линкуемого пакета без параметров, потом в папке куда линкуем с именем линкуемого пакета из его package.json

    Но вообще это инструмент для отладки, а для Ваших целей лучше просто отдать webpack абсолютный путь до файла с лоадером, который проще всего получить через require.resolve
    Ответ написан
    1 комментарий
  • Как решить проблему с WebSockets?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вы на каждый запрос по http, который обрабатывается Вашим middleware делаете подписку на websocket connection, тем самым плодите обработчики.
    У Вас вебсокет вообще никак не связан с http и сидит на отдельном порту.

    При желании, кстати можно переиспользовать инстанс http сервера и для express и для websocket, тогда они на одном порту будут.
    Ответ написан
    3 комментария
  • Почему TypeScript не видит объект google?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Поставьте https://www.npmjs.com/package/googleapis через npm/yarn/etc.
    Пропишите "googleapis" в массив types в tsconfig.json
    Ответ написан
    Комментировать
  • Зачем нужна перегрузка функций?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Перегрузки нужны в следующих случаях:
    1. Когда от типа некоторого аргумента зависит тип возвращаемого значения;
    2. Когда от типа некоторого аргумента зависят типы последующих аргументов;
    3. Комбинация из 1 и 2 вариантов.

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

    На самом деле в примере с SumOrConcat вполне можно задать типы аргументам:
    type SumOrConcat = {
      (a: number, b: number): number
      (a: string, b: number): string
    }
    
    const result: SumOrConcat = (a: number | string, b: number): any => {
      if (typeof a === 'number') {
        return a + b
      }
    
      return `${a} ${b}`
    }
    Но надежнее все же так:
    type SumOrConcat = {
      (a: number, b: number): number
      (a: string, b: number): string
    }
    
    const result = ((a: number | string, b: number): number | string => {
      if (typeof a === 'number') {
        return a + b
      }
    
      return `${a} ${b}`
    }) as SumOrConcat;
    Ну и надо отметить, что синтаксис самих перегрузок таких проблем не имеет, хотя стрелочную функцию с ним не опишешь
    function sumOrConcat(a: number, b: number): number;
    function sumOrConcat(a: string, b: number): string;
    function sumOrConcat(a: number | string, b: number): number | string {
      if (typeof a === 'number') {
        return a + b
      }
    
      return `${a} ${b}`
    }
    
    const result = sumOrConcat;


    Так же, очень часто можно обойтись без перегрузки используя дженерики. Сам такой код будет выглядеть сложнее, но пользоваться им будет проще. Пример.
    Ответ написан
    1 комментарий
  • Почему ошибка Uncaught TypeError: Failed to construct 'URL': Invalid URL?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    const network = "http://localhost:8899";для solana-test-validator
    Или URL реальной сети, в которой крутится нужная программа, если продакшен
    Ответ написан
    Комментировать
  • Можно ли реализовать такое с помощью js?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Можно.

    Вариант 1: зашить html код блока строкой в JS и вставлять через DOM операции в страницу, например через insertAdjacentHTML.

    Вариант 2: использовать шаблонизаторы, такие как handlebarsjs, по сути то же, что и вариант 1, но еще и позволит просто подставлять данные в HTML.

    Вариант 3: использовать UI фреймворк или библиотеку, такие как svelte, vue или react.

    Ну и маленький совет, если у Вас будет отдельный скрипт, который чисто выводит Ваш header на страницу, то подключать его можно прямо в месте расположения header, но подключать его нужно с атрибутом async, что бы он не мешал загрузке остальной страницы. И вставлять HTML код в этом случае можно относительно тега script, получить который можно через document.currentScript
    Ответ написан
    Комментировать
  • Что делает runtimeChunk: 'single'?

    bingo347
    @bingo347
    Crazy on performance...
    У webpack есть некоторый runtime код, который позволяет ему эмулировать модули внутри бандла и подгружать чанки. По умолчанию этот код расположен в чанке, который содержит entry point модуль (модуль, с которого запускается вся Ваша js программа).
    Но так же у Вас может быть несколько entry point, каждый по сути соберется в свой бандл. Иногда есть необходимость, чтоб несколько таких бандлов работали на одной странице. И в каждом будет вшит рантайм код webpack. Мало того, что это дублирование кода, он будет конфликтовать между собой при подгрузке чанков если Вы не переопределите имя глобальной переменной webpack, чтоб оно было разным для каждого такого бандла.
    Для решения этих проблем и используется runtimeChunk: 'single', который выносит весь runtime код webpack в отдельный чанк и позволяет переиспользовать его для всех бандлов.
    Ответ написан
    Комментировать
  • Запутался в изучении JavaScript. С чего начать?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Ни одна книжка или видео курс не позволит Вам освоить язык программирования. Хорошие книжки или видео курсы помогут усвоить хорошие практики, но только когда Вы уже что-то умеете. Притом без базовых знаний невозможно отличить хорошие книгу/курс от полностью отвратительных.

    Придумайте проект, который был бы полезен лично Вам или кому-то из близких/друзей/знакомых, и который Вам было бы интересно сделать. И просто начните его делать, гугля каждый раз, когда не знаете как сделать ту или иную вещь, а если не получается ничего нагуглить, то можно задать вопрос здесь. В начале Вы будете гуглить на каждый чих, это нормально. Но чем ближе Ваш проект будет к рабочему состоянию, тем реже Вам придется гуглить. Кроме того, если сразу делать такой проект фиксируя все изменения в git и выкладывая на githab, это сильно Вас выделит при поиске первой работы среди тысяч других новичков, но с проектами с курсов под копирку.
    Ответ написан
  • Как правильно собрать проект на nodeJs?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Бэк так же можно собирать сборщиками, у того же webpack есть пресет настроек под ноду.
    Насчет оптимизации, тот же terser.js, который включается при production билде по умолчанию, помимо сжатия делает ряд оптимизаций кода. Но для ноды работающей длительное время они могут оказаться менее значимыми, так как JIT v8 так же делает свои оптимизации, и многократно запускаемые функции наверняка будут им оптимизированы. Однако при возможности прогнать код через дополнительную оптимизацию, лучше это сделать.
    Насчет ejs, шаблоны нужно компилировать в js. В случае ноды это можно делать как при сборке, так и на старте приложения. Главное чтоб не происходило компиляции во время обработки запроса.
    Оптимизация картинок и css должна происходить при сборке клиентского кода, к ноде они вообще никакого отношения не имеют. Нода вообще не должна о них знать, максимум пути после сборки, чтобы вставить их в шаблон, хотя и это по хорошему решается сборкой. Отдаваться статика должна Nginx или аналогами.
    Ответ написан
    Комментировать
  • Как написать простейший webpack loader?

    bingo347
    @bingo347
    Crazy on performance...
    Первое, что нужно здесь понять, то что лоадер работает в compile-time, а Ваш js код где require - в run-time.
    Лоадер получает на вход исходный текст файла (или текст выданный предыдущим лоадером) и выдает свой текст на выход. Последний лоадер (в цепочке лоадеров webpack он стоит первым) должен выдавать валидный js.
    Ваш лоадер конечно может сгенерировать в выходном файле функцию, но на процесс компиляции она уже повлиять особо не сможет.
    Ответ написан
    Комментировать