Задать вопрос
  • Не могу понять как это сделать?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    В браузере нет require
    Этот код или под нодой должен запускаться или собираться с помощью webpack
    Ответ написан
    Комментировать
  • Как посчитать количество функций в коде JS?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Такие задачи однозначно решаются обходом AST. Возьмите общеизвестный парсер и инструмент для обхода его дерева, например связка из @babel/parser и @babel/traverse подойдет.
    Так же можно посмотреть в какие ноды что парсится с помощью https://astexplorer.net/ - в нем несколько языков, а для js/ts на выбор есть несколько парсеров.
    Вам по сути нужно найти FunctionDeclaration содержащий в body ReturnStatement и извлечь из него Identifier соответствующий имени. А для второй части - FunctionDeclaration с ArgumentsList не нулевой длины.
    Ну и так как в условии сказано, что внутрь не заходить, то можно пройтись лишь по верхнему уровню, тогда @babel/traverse и не нужен даже
    Ответ написан
    3 комментария
  • Как написать регулярку на допуск только цифр и точек?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Выбирайте, что больше нравится:
    /^(\d|\.)*$/
    /^[.0-9]*$/
    /^[\d.]*$/


    Но я бы все же ограничил одной точкой:/^\d*\.?\d*$/
    Ответ написан
    3 комментария
  • Можно ли несколько раз проксировать объект?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Если свойства заранее известны, то проще get/set сделать.
    А Proxy перехватывает все поля без исключения. Можно разве не все хандлеры определять, вместо пропущенных будут использоваться одноименный функции из Reflect, что по сути приведет к поведению как у оригинального объекта.
    Ну и да, на один объект можно повесить любое число Proxy и о них не узнает ни оригинальный объект ни другие прокси.
    Ответ написан
    Комментировать
  • Как в VS Code проверить проект на типизацию TypeScript?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    лишь ошибки типизации которые не мешают компиляции
    Если проект компилируется - то все типы сошлись. Если проект компилируется, а ошибка все таки есть - значит типы криво описаны.
    Как проверять все файлы проекта на правильность типизации?
    Скомпилировать проект.

    Но, если допустим, изменить какой-нибудь тип (интерфейс), а файл, который на него ссылается и использует будет закрыт, то ошибку никакую не выдаст.
    И это хорошо. Если TypeScript LSP будет перепроверять весь проект на каждый чих, а не только открытые файлы, то писать что-то сложнее todo листа будет невозможно...

    Знаю, существуют ESLint, TSLint.
    Они тоже для статического анализа, но для немного другого. В VSCode они так же чекают только открытые файлы, из тех же соображений производительности.
    TSLint устарел. ESLint ставьте отсюда: https://marketplace.visualstudio.com/items?itemNam...
    Ответ написан
    Комментировать
  • Как происходит всплытие переменной?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Объявления переменных и функций всплывают на верх области видимости, у var и function (та что declaration) - это внешняя функция или модуль (если на верхнем уровне дело происходит), у let и const - блок, то есть после всплытия, внутри движка Ваш код будет выглядеть так:
    var foo; 
    function bar() {
        var foo; // эта foo перекрывает foo из внешней области видимости, и поэтому в функции используется она
        if (!foo) { 
            foo = 10; 
        } 
        console.log(foo); 
    }
    foo = 1;
    bar(); //--> 10


    Так же важно знать, что хотя let и const всплывают наверх блока, но использовать их до фактического места объявления нельзя, так будет ошибка:
    {
        console.log(x); // ReferenceError: Cannot access 'x' before initialization
        let x;
    }
    Это механизм защиты "от дурака" и называется он "мертвое всплытие". По этому всегда лучше использовать let или const, притом const предпочтительнее если переменная не меняется, так как дает больше гарантий.
    Ответ написан
    2 комментария
  • В чем превосходство Typescript?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Как бы это странно не звучало, но одно из главных преимуществ TypeScript - это ускорение разработки в несколько раз. Да, когда еще ничего нет - разработка незначительно замедлится, так как помимо логики нужно описать еще и типы. Но это только в начале. И это не только возможность писать большую часть кода с помощью автодополнения. Поддержка существующего кода занимает в десятки раз больше времени, чем его начальное написание. Стоит ли вложить несколько лишних часов на старте, чтоб сэкономить в последствии месяцы? Как по мне стоит.

    Еще одним огромным плюсом является возможность проектировать на типах. Познав дзен TypeScript'а я перестал пользоваться UML, так как типы дают мне ту же наглядность, но при этом еще и сокращают время, так как типы - это уже код. Ну и источник правды остается один. Бизнес требования выраженные в типах не дают отклонится от них при написании логики, исключая возможность неправильной трактовки задачи. Перенеся задачу в типы, я могу обсудить ее с коллегами и исправить неточности еще до написания кода, что опять же сильно экономит время.

    Ну и отвчечу на некоторые Ваши сомнения:
    TSLint в VSCode прям жутко тугой
    TSLint официально deprecated, вместо него стоит использовать плагин к eslint, заодно можете мой конфиг попробовать.

    Типы? Есть JSDOC
    JSDoc в плане типов не умеет и 10% того, что умеет TypeScript. Кроме того, никто в здравом уме не пишет JSDoc на приватную логику, а значит проверки типов там не будет. JSDoc не гарантирует корректность рефакторинга, а вот благодаря TypeScript я, опять таки, точно не забуду обновить JSDoc.

    многие библиотеки nodejs не имеют типов
    может лет 5 назад так и было, но сейчас встретить библиотеку без типов - скорее исключение. Если библиотека популярная, но не предоставляет типов, скорее всего их уже написал кто-то другой, достаточно просто установить одноименный модуль из npm скоупа types и все будет работать само.

    Поддержка браузерами скомпилированного кода? Да какбы почти весь JS имеет поддержку 95%+, тот же Babel уже забыл когда использовал.
    Вообще это не основная задача компилятора TypeScript, а опциональная возможность. И babel + preset-env с ней справляются гораздо лучше. И никто не мешает использовать их вместе. А еще думаю вопрос времени, когда кто-то напишет оптимизатор кода использующий информацию о типах из TS.

    Примерно в каждой второй есть инстансы, на которые смотришь - и чешешь репу - а как называется тип этой переменной в @types/?
    import {someObject} from 'some-library';
    
    type TypeFromValue = typeof someObject;
    const valueCopy: TypeFromValue = {
        ...someObject,
        type: 'overrides',
        with: 'type check',
    };
    и кстати, вот пример того что JSDoc типы не умеют.

    //@ts-check
    и почти везде останется бесполезный any.

    P.S. удачи такие типы на JSDoc описывать
    P.P.S. Еще прелести современного TypeScript невозможные у...
    Ответ написан
    8 комментариев
  • Почему нет разницы в производительности между fork mode и cluster mode в PM2?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Во-первых, cluster мод отличается от fork только тем, что умеет шарить слушаемые tcp порты между процессами. И там и там процессов будет ровно столько, сколько настроите, а значение по умолчанию - количество физических потоков (логических ядер) системы.
    Во-вторых, "двухядерный сервак с 2Гб оперативой" выглядит как виртуалка на большом сервере, где Вам выделили некоторые ресурсы. И ваши 2 ядра вполне могут быть логическими, но физически - 1 ядром или даже его половиной (если 4 потока на ядро), за счет гипертрединга. Вот только гипертрединг штука нацеленная на лучшую утилизацию ресурсов процессора при простоях, а вот при большой нагрузке он вполне себе может замедлить систему, особенно основанную на кооперативной многозадачности (асинхронном исполнении) как в ноде.
    Ответ написан
    1 комментарий
  • Как сделать чтобы отрабатывало событие зажатой ЛКМ и движения мыши?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Вы функцию playAudio отдаете как event listener, в нее придет единственный аргумент - объект события, откуда должен взяться data - вообще не понятно.

    Ну и вот так работать не будет:
    piano.addEventListener("mousedown", startKeyActive, playAudio);
    Ответ написан
  • Как менять динамически имя переменной?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    locations[`coord_${count}`]
    это же базовый синтаксис языка...
    Ответ написан
    Комментировать
  • Стоит ли использовать везде GraphQL?

    bingo347
    @bingo347 Куратор тега Node.js
    Crazy on performance...
    Если Вы не пишите внешнее или публичное API, то GraphQL и REST - будут крайне отвратительным выбором. Они ограничивают Вас в низкоуровневом CRUD, создавая больше проблем, чем решают, а главное затрудняют выражать Ваше API в терминах доменной области.
    Посмотрите в сторону RPC протоколов, и посмотрите как элегантно на них можно описать конкретно Ваш домен. Да и выбор тут огромен: Apache Thrift, gRPC, JSON-RPC, а так же мой любимый, но почему-то малоизвестный в русскоязычном интернете E/A/?T (расшифровывается как entity/action/optional-target)
    Ответ написан
    4 комментария
  • Как тестировать оптимизацию frontend?

    bingo347
    @bingo347
    Crazy on performance...
    796stwepspdbny_xqrwrrtvoor4.png
    Ответ написан
    Комментировать
  • Как седлать рандом с примером ниже толь с шансом на выпадение какого либо варианта (JavaScript Jquery)?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    console.log(getRandomVariant([
        {chance: 0.4, value: 'Текст1'},
        {chance: 0.2, value: 'Текст2'},
        {chance: 0.15, value: 'Текст3'},
        {chance: 0.25, value: 'Текст4'},
    ]));
    
    function getRandomVariant(variants) {
        const sortedVariants = getRandomVariant.cache.get(variants) ?? getRandomVariant.cache
              .set(variants, variants.slice().sort((a, b) => b.chance - a.chance))
              .get(variants);
        let rand = Math.random();
        for (const {chance, value} of sortedVariants) {
            if (chance > rand) return value;
            rand -= chance;
        }
    }
    getRandomVariant.cache = new WeakMap();
    Ответ написан
    Комментировать
  • Могут ли быть разными значения дочерних и родительских элементов?

    bingo347
    @bingo347 Куратор тега HTML
    Crazy on performance...
    правильно ли я понимаю, что при установлении например ширины 50% у дочернего, это будет зависеть от ширины родителя?
    правильно, проценты считаются от родителя

    если у родителя установлено 50% , то грубо говоря у дочернего получится 25% от всей "страницы"?
    если родителем родителя будет body, то да

    если например у родителя 80px то у дочернего будет от этих 80 отниматься?
    да

    и с vw/hw не понятно
    vw и vh - это проценты от ширины вьюпорта и от высоты вьюпорта соответственно, расшифровывается как ViewportWidth и ViewportHeight
    Ответ написан
    5 комментариев
  • Как изменить тип на any?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Комментировать
  • Как сформировать запрос так, чтобы limit был по определенному количеству уникальных полей?

    bingo347
    @bingo347
    Crazy on performance...
    Первое, что на ум приходит - GROUP BY, но с ним придется как-то агрегировать остальные поля.
    Еще как вариант - делать запрос на запрос с лимитом, что-то вроде:
    SELECT 
           c.id AS id, 
           c.name AS name, 
           phone.phone AS phone, 
           email.email AS email 
    FROM (SELECT id, name, phone, email FROM contacts LIMIT 6) AS c 
    LEFT JOIN phone 
           ON c.phone = phone.phone_id 
    LEFT JOIN email 
           ON c.email = email.email_id
    Ответ написан
    1 комментарий
  • Как пробросить порт из встроенной в Windows 10 Ubuntu в саму Windows?

    bingo347
    @bingo347
    Crazy on performance...
    Во-первых, современный wsl поднимает vlan и поэтому localhost (127.0.0.1) будет доступен только из Ubuntu, но не из другой системы wsl и не из винды.
    Узнать текущий IP адрес можно многими способами, в том числе:
    hostname -I
    или
    ip addr

    Во-вторых, какое отношение имеет ssh к веб серверу? Открывайте в браузере.

    По итогу:
    - приложение должно слушать не 127.0.0.1 а ip адрес vlan, проще всего слушать все адреса через 0.0.0.0
    - открывать нужно в браузере по ip адресу wsl

    Можно вот такой скрипт на powershell подготовить:
    $wslIP = wsl -- hostname -I
    $wslIP = $wslIP.Split(" ")[0]
    OpenWith "http://${wslIP}:5000/"
    Ответ написан
  • Как затипизировать React.memo, если у функционального компонента есть статические свойства?

    bingo347
    @bingo347 Куратор тега TypeScript
    Crazy on performance...
    Насколько знаю (я не эксперт реакта, могу ошибаться), memo и не пробросит статик свойства. Он по сути создает новый HOC вокруг вашего компонента. И статические свойства нужно вешать уже на эту обертку:
    import { FC, memo } from "react";
    
    interface IAppProps {
      title: string;
    }
    
    interface IStatic<T> {
      someStaticString: string;
      someStaticObj: T;
    }
    
    const someObj = {
      SOME_KEY: "SOME_VALUE"
    };
    
    const App: FC<IAppProps> & IStatic<typeof someObj> = memo((props) => {
      const { title } = props;
    
      return <>{title}</>;
    });
    
    App.someStaticString = "someStaticString";
    App.someStaticObj = someObj;
    
    export default App;
    Ответ написан