• Как испольовать 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.
    Ваш лоадер конечно может сгенерировать в выходном файле функцию, но на процесс компиляции она уже повлиять особо не сможет.
    Ответ написан
    Комментировать
  • Верно ли это утверждение?

    bingo347
    @bingo347
    Crazy on performance...
    Тут можно с разных сторон смотреть.

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

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

    Увлекаюсь программированием
    если действительно увлекаетесь, то есть Вам по кайфу сам процесс разработки, то можете не переживать, навыки они приобретаются и развиваются, а когда работа приносит удовольствие, то необходимые для нее навыки развивать в разы проще.
    Ответ написан
    2 комментария
  • Как дождаться загрузки iframe который формируется javascript?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Ответ написан
    Комментировать
  • Возможно ли при ресайзе менять высоту обоих блоков с помощью CSS?

    bingo347
    @bingo347 Куратор тега HTML
    Crazy on performance...
    Добавьте к .wrapper
    display: flex;
    flex-flow: column nowrap;
    Ответ написан
    Комментировать
  • Как в строке удалить ненужный символ и при этом сократить саму строку?

    bingo347
    @bingo347
    Crazy on performance...
    ss = (char*)calloc(n, sizeof(char*)); // выделяем память под строку
    Здесь Вы выделяете гораздо больше байт, чем Вам нужно, sizeof(char*) будет равен 8 на 64 битных архитектурах, когда sizeof(char) - 1. Но при этом стоит не забывать про место под '\0' в конце строки.

    gets(ss);
    printf("Введите свое слово (не забываем про длину строки): ");
    scanf("%s", ss);
    ss = (char*)realloc(i, sizeof(char*));
    gets(ss);
    Почитайте, что делает функция gets. Опять же проблема с размерами символа. Ну и у realloc несколько другая сигнатура. И вообще realloc достаточно недешевая операция, не за чем ее делать в цикле много раз над одним указателем, достаточно 1 раз в конце.

    if (ss[i] != NULL) // проверка на нулевой указатель
    Проверку на NULL нужно делать сразу после аллокации памяти. А вот в цикле ее делать незачем.

    ss[j] = ss[j++];// здесь я заменял тот символ на следующий, тем самым перекидывая его в конец
    Операция j++ меняет j.

    for (int i = 0; i < sizeof(ss); i++)// ну а тут пытался поменять размер
    Операция sizeof(ss) даст размер char*, то есть размер указателя, что соответствует 8 на 64 битных архитектурах. Для вычисления длины строки (терминированной символом '\0') есть функция strlen. А в данном случае вообще можно посчитать количество удаленных символов и из него вычислить длину результирующей строки, что будет дешевле.

    Ну и по самому алгоритму. Все можно сделать за 1 проход, подсчетом удаляемых символов и перемещением текущего символа на количество удаленных символов назад.
    Ответ написан
    Комментировать
  • Как читать дженерики в TypeScript?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Данная функция принимает аргумент constructor любого типа T, который является подтипом типа { new (...args: any[]): {} }

    В свою очередь { new (...args: any[]): {} } - это абсолютно тоже самое, что и new (...args: any[]) => {}. Это сигнатура конструктора, с любым количеством любых элементов и инстанциирующий значение с типом {}.

    Ну и тип {} - это множество всех не нулевых значений (не только объектов), то есть по сути это как тип any, но без null | undefined и с не сломанной вариантностью. Здесь его безболезненно можно заменить на тип unknown, в отличии от тех же аргументов, где из-за контрвариантности аргументов функций (и конструкторов) предикаты на типах ломаются и без any нормально не сделать.

    В целом, под такой дженерик подойдет абсолютно любой конструктор
    Ответ написан
    2 комментария
  • Почему webpack не импортирует node_modules?

    bingo347
    @bingo347
    Crazy on performance...
    Все он импортирует, просто Вы не понимаете как работают модули:
    https://developer.mozilla.org/ru/docs/Web/JavaScri...
    Ответ написан
  • Как убрать такое выделение символов в vscode?

    bingo347
    @bingo347
    Crazy on performance...
    https://code.visualstudio.com/updates/v1_63#_unico...

    Фича вообще полезная, но стоит добавить кириллицу в editor.unicodeHighlight.allowedCharacters
    Ответ написан
    Комментировать
  • В чем моя ошибка stepik?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    произведение элементов массива
    let p = 1;
    // в цикле:
    p *= arr[i];


    кратных 3
    n % 3 === 0

    оканчивающихся на 5
    n % 10 === 5

    если таких элементов нет
    в общем случае делается введением флага:
    let hasElements = false;
    
    if (/* ... */) {
      hasElements = true;
    }
    Но конкретно в этом случае, так как 1 гарантированно не попадает под условия, а все остальные числа изменят произведение, можно проще p !== 1

    Вам осталось дело за малым, объединить эти кусочки знаний в единый алгоритм
    Ответ написан
    Комментировать
  • Что значат эти строки в коде на typescript?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    styled.li<{ menu?: any }>`

    Во-первых, к template string literal (``) можно применить функцию-тэг, она будет вызвана с массивом фиксированных строк и интерполируемыми значениями (`${/* вот этими */ value}`).
    Во-вторых, в TS функция может быть дженериком (принимать тип в качестве параметра), при вызове функции в дженерик можно передать конкретный тип (например { menu?: any }) или не передавать (тогда дженерик выведется автоматически из аргументов)
    В-третьих, так как тегирование template string literal по своей сути вызов функции, то и в него можно явно передавать дженерики.

    ${({ menu }) =>
        menu &&
        css
    А тут в качестве интерполируемого значения передается стрелочная функция, в которой деструктурирован первый аргумент. В данном случае это нормально, так как функция-тег получит данную функцию "как есть", без приведения к строке.
    Ответ написан
    1 комментарий
  • Почему определение инкапсуляции дают неправильно?

    bingo347
    @bingo347
    Crazy on performance...
    Цель инкапсуляции это объединение объектов
    кто Вам такое сказал?
    Само слово инкапсуляция происходит от латинского "in capsula", что можно перевести как "закрытый в коробке".
    Цель инкапсуляции - это сокрытие сложности. Не информации, не данных, не кода, а именно сложности.

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