• Как реализовать через импорт без fs?

    Судя по всему это клиентский код.
    При этом вы пытаетесь на клиенте использовать модуль файловой системы, что конечно же невозможно.

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

    Ваша задача - инпортировать *.ejs модуль так, чтобы он не исполнился, а просто лег строчкой в память.
    Если вы используете вебпак, то для этого подойдет raw-loader https://v4.webpack.js.org/loaders/raw-loader/ или более современная альтернатива, которая так де указана в этой документации.
    Ответ написан
  • Как сделать, чтобы Typescript подсказывал корректный тип в данном случае?

    import React from 'react';
    
    
    interface Item {
        title: string;
        name: string;
    }
    
    interface EmptyItem {
        isEmpty: boolean;
    }
    
    interface ComponentProps {
        items: Item[] | EmptyItem[]
    }
    
    function Component(props: ComponentProps) {return null}
    
    const comp = <Component items={[
        { title: 'undefined', name: '1', isEmpty: true }
    ]} />


    Тут ключевая проверка
    items: Item[] | EmptyItem[]
    Ответ написан
    Комментировать
  • Как зафиксировать название столбцов в таблице при скроле?

    Думаю для вашей задачи подойдет position: sticky на th элементе.

    Вот здесь можно почитать про него подробнее https://developer.mozilla.org/ru/docs/Web/CSS/position

    и проверить на соответствие вашему диапазону браузеров.
    Ответ написан
    1 комментарий
  • Что эффективнее использовать css || js?

    Вопрос достаточно абстрактный, но в большинстве случаев правильным ответом будет ""js - эффективнее.

    Что же такое эффективность:
    - дальнейшая поддержка
    - расширяемость
    - заменяемость

    Как можно заметить тут ничего нет про скорость, поскольку она не будет сильно отличаться от решения к решению.

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

    Расширяемость - у решения на CSS будут ограничения по вложенности, по работе на тач устройствах, по доступности (a11y).

    Заменяемость - вообще вам не стоит делать меню с нуля, а стоит выбрать одну из популярных библиотек компонентов. Все что вас в ней не устроит - доделать стилями. Как было написано в предыдущих пунктах у меню, как и у любых UI элементов, много скрытых требований, которые уже учтены в популярных библиотеках. И не стоит придумывать их заново.

    Для начала рассмотрите MaterialUI. Потом познакомьтесь с альтернативами. И если уж ничего не подойдет - пишите собственное меню на js.
    Ответ написан
  • Как получить fixed расположение елемента относительно окна?

    element.getBoundingClientRect()

    Кажется это то, что вы ищите, но будьте осторожны - этот метод очень тяжелый. Не стоит вызывать его в частотных событиях типа скролла.
    Ответ написан
  • Таймер с обнулением в 00.00?

    const now = Date.now();
    const day = 1000 * 60 * 60 * 24;
    let checkpoint = now - (now % day) + day;
    
    function tick() {
        const time = new Date(checkpoint - Date.now());
    
        if (time < 0) {
          time += day;
          checkpoint += day;
        }
    
        console.log(time.toTimeString().slice(0, 8));
        
    }
    
    function loop() {
        tick();
        setTimeout(loop, 1000);
    }
    
    loop();
    Ответ написан
    2 комментария
  • Есть ли АПИ для Яндекс Почты и Контактов?

    Открытого api для календаря нет.
    Для почты есть публичное api, но оно не задокументировано и используется только другими сервисами Яндекса.
    Периодически мы думаем над презентацией публичного апи, но в ближайший год подобного не произойдет.
    Ответ написан
  • Почему не работает DELETE в NodeJs?

    Если вы хотите экстрима, можете почитать про флаг --expose-gc.
    Он поможет вам чистить память в нужное время, но не рекомендован для использования в продакшн.
    Ответ написан
    Комментировать
  • Можно ли использовать уловия внутри switch/case в Javascript?

    var n = 10;
    switch (true) {
      case n < 10: console.log(1); break;
      case n === 10: console.log(2); break;
      case n > 10: console.log(3); break;
    }
    Ответ написан
    Комментировать
  • Как запускать скрипт Node.js WebSockets под разными прокси?

    Выносим адрес прокси в переменную, дальше по желанию рассчитываем эту переменную в зависимости от окружения или от переданных параметров

    var proxyAddress = process.env.PROXY_ADDRESS;
    
    // node app.js --proxy_address='...'
    var proxyAddress = process.argv[2].split('=')[1];


    Соответственно либо форкаем процесс с нужными аргументами, либо с нужным окружением:
    child_process.fork('app.js', '--proxy_address=...');
    
    child_process.fork('app.js', {
        env: {
            PROXY_ADDRESS: '...'
        }
    });
    Ответ написан
    1 комментарий
  • Что быстрее: websocket или "обычное" соединение?

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

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

    Помните что в http протоколе за вас уже позаботились о формате передачи файлов (вспоминаем про multipart/form-data, как об одном из решений), в сокетах вы будете создавать велосипед.
    Ответ написан
    Комментировать
  • Какой вариант будет работать быстрее для браузера?

    Рекомендую выбирать решение опираясь не на скорость, которая, к слову, будет примерно одинаковой, а на структуру проекта.
    Если проект большой или обещает таким быть, оцените сколько вы готовы вложить в железо. Если в этом месте будуте экономить, то не стоит возлагать функцию щаблонизации на сервер - отдавайте json.
    Как я понимаю в вашем случае речь идет о динамических данных, которые рендерятся при каждом запросе. Если же этот json статичен или допустим обновляется раз в час, то вполне можно рендерить эту страницу на сервере раз в час.
    Тут нужно только решить готовы ли вы жить с серверными инструментами шаблонизации в проекте или вам комфортнее шаблонизировать на клиенте. Другими словами многое зависит от выбранного вами фреймворка, если он вообще есть.
    Ответ написан
    Комментировать
  • Оптимизация конкретного кода JS(gulp)?

    Что вам не подходит в следующем коде (вариант можно доработать, если понять куда двигаться):
    var gulp = require('gulp');
    var haml = require('gulp-haml');
    var prettify = require('gulp-prettify');
    
    
    gulp.task('layouts', function() {
      gulp.src('./haml/layouts/*.haml')
        .pipe(haml())
        .pipe(prettify({indent_size: 2}))
        .pipe(gulp.dest('./_layouts/'));
    });
    
    gulp.task('includes', function() {
      gulp.src('./haml/includes/*.haml')
        .pipe(haml())
        .pipe(prettify({indent_size: 2}))
        .pipe(gulp.dest('./_includes/'));
    });
    
    gulp.task('posts', function() {
      gulp.src('./haml/posts/*.haml')
        .pipe(haml())
        .pipe(prettify({indent_size: 2}))
        .pipe(gulp.dest('./_posts/'));
    });
    
    gulp.task('default', ['includes', 'layouts', 'posts']);
    Ответ написан
    Комментировать
  • Какой Web-фреймворк для Node.js выбрать?

    Посмотрите в сторону loopback. https://github.com/strongloop/loopback
    Вот уж кто позволит вам на лету менять базки.
    И админка у него есть.
    Обна беда - он все-таки больше позицианирует себя как REST.
    Ответ написан
    1 комментарий
  • Сannot run in wd %s %s (wd=%s) -Что за ошибка?

    Почитайте про --unsafe-perm флаг для npm. Если в двух словах, то "Нельзя так просто взять и выполнить нпмовские подкоманды от рута"
    Ответ написан
    Комментировать
  • Балансер - NodeJS или Nginx?

    3y3
    @3y3 Автор вопроса
    Итак для истории:

    Особой разницы, с точки зрения производительности, при использовании балансера Nginx против NodeJS нет.

    Мы сравнивали нашу старую архитектуру построенную с использованием strong-cluster-control c балансировкой через NodeJS, и новую на основе luster с балансировкой на Nginx.
    В обоих случаях был поднят кластер на cpu-1 процессов (в данном случае 32-1)
    В случае luster каждый процесс слушает свой unix сокет, балансировка внутри ноды отключена. В Nginx создан апстрим на эти самые 31 сокет с балансировкой least_connect.

    luster был использован как готового решение, поддерживающее сохранение индекса воркера при его перезапуске, в основных тестах другие его возможности не использовались.

    В стрельбах с постоянной нагрузкой на реальном проекте были замечены незначительные отклонения потребления system и user CPU как в одну так и в другую сторону.
    В стрельбах на отказ стабильность повысилась на 5-10%.

    Тестируемое приложение является stateless middleware с преимущественно асинхронными операциями, период простоя в одном стеке не больше 5 мс. Приложение на данный момент не занимается рендерингом шаблонов.

    Для приложений с тяжелыми синхронными операциями (с периодом простоя в стеке больше 50мс) был получен совет использовать следующую архитектуру:
    Все так же поднимаем кластер на cpu-1, но настраиваем luster на меньшее количество групп, например по 4 воркера в каждой группе, т.е. 4 воркера будут слушать один сокет.
    Балансировку в ноде все так же отключаем. Получаем предварительную балансировку least_connect средствами Nginx и дополнительную балансировку средствами системы, которая будет делать выбор опираясь на готовность процесса к чтению из сокета.
    Ответ написан
    Комментировать
  • Как отслеживать прогресс Promise?

    Прогресс не просто так убрали из Promise, в большинстве случаев это антипаттерн.
    Нужно понимать что Promise A+ спроектированы так, чтобы инкапсулировать внутри себя всю связанную с операцией логику.
    Именно поэтому я не советую вам придумывать код, который требует методов Promise.progress, Promise.cancel или свойств Promise.isFullfilled, Promise.isRejected.

    Т.е. вы все еще можете пользоваться этими свойствами, но только не в контексте A+.
    Берите Q или любую легковесную замену, и реализуйте все что хотите через defer.
    Примером того, что вы получите в итоге может являться ответ @onqu

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

    Отменяйте промис только внутри него. Сообщайте об изменении состояния только с помощью then. Если вам нужно отслеживать прогресс загрузки чего либо, делайте это через события или каллбеки:

    function doSomethingAsync(timeout, cb) {
      var ee = new EventEmitter();
      var state = {
        progress: 0
      };
    
      (function loop() {
        if (state.progress === 22) return cb(null, state);
        if (state.progress === 'canceled') return cb(new Error('Action canceled'));
        if (state.progress * 1000 > timeout) return cb(new Error('Action timed out'));
    
        ee.emit('progress', state);
        setTimeout(loop, 1000);
      })();
    
      return ee;
    }
    
    
    function a20SecAction(actions = {}) {
      var maxActionTime = 20000;
    
      return new Promise((resolve, reject) => {
        var actionWithProgress = doSomethingAsync(maxActionTime, (err, result) =>
          (err ? reject : resolve)(err || result)
        );
    
        actionWithProgress.on('progress', actions.progress);
      });
    }
    
    a20SecAction({
      progress: (state) => console.log('state:', state.progress)
    }).then(
      (res) => console.log('state: ready'),
      (err) => console.log('state:', err)
    );


    Итак, если у вас есть действие, которое в любом случае должно завершиться, но вам нужно отслеживать прогресс (например загрузки файла), то не пытайтесь решить это на уровне промиса (A+) он вам не подойдет.
    В моем примере три этапа:
    1) Некоторая простейшая асинхронная функция оформленная в nodejs стиле, т.е. она принимает набор параметров и каллбек вида function (err, result) {}
    Это ваш минимальный строительный блок
    2) Функция обертка - более высокий уровень, на котором мы начинаем работать с промисом. Как параметры функция принимает обработчики дополнительных событий нашей операции. В данном случае у операции одно дополнительное событие progress, и два основных - fullfilled, rejected.
    3) Задаем обработчики для всех событий, основные обрабатываем в then, дополнительные через заданные параметры.
    В данном случае я оставил возможность влиять на процесс выполнения извне, внутри обработчика progress. Но лишь для демонстрации того, что это в принципе возможно. На практике лучше не допускать ситуации, когда изменение состояния асинхронной операции происходит извне:
    a20SecAction({
      progress: (state) => {
        console.log('state:', state.progress);
        if (state.progress === 7) state.progress = 'canceled';
      }
    }).then(
      (res) => console.log('state: ready'),
      (err) => console.log('state:', err)
    );


    Ну и в заключении, если у вас уже есть внешняя библиотека, которая предоставляет вам обычный промис для действия, которое может длиться 20 сек, а вам нужно иметь возможность наблюдать за прогрессом - меняйте библиотеку.
    Ответ написан
    2 комментария
  • Как в Node.JS правильно использовать callback?

    Если вы хотите оставить эту прелестную вложенность в коде, то можно так

    var images = {};
            for (var i in news.items) {
                if(typeof news.items[i].attachments !== undefined) {
                    for (var j in news.items[i].attachments)
                        if (news.items[i].attachments[j].type == 'photo') {
                            download(news.items[i].attachments[j].photo.photo_604, 'tmp/' + url.parse(news.items[i].attachments[j].photo.photo_604).pathname.split('/').pop(), function(i, j) {
                                fs.readFile('tmp/' + url.parse(news.items[i].attachments[j].photo.photo_604).pathname.split('/').pop(), function(err, data) {
                                    console.log(checksum(data, 'sha1'));
                                });
                            }.bind(i, j));
                        }
                }
            }


    Или так:
    var images = {};
    Object.keys(news.items).forEach(function(key) {
        var item = news.items[key];
        if (!Array.isArray(item.attachments)) return;
    
        item.attachments.forEach(function(attachment) {
            it (attachment.type !== 'photo') return;
    
            var loc_path = 'tmp/' + url.parse(attachment.photo.photo_604).pathname.split('/').pop();
            download(attachment.photo.photo_604, loc_path, function() {
                fs.readFile(loc_path, function(data) {
                    console.log(checksum(data, 'sha1'));
                });
            });
        });
    });


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