• Как можно автоматически перезапускать nodejs сервер после сбоя?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    forever, pm2, impress, но нельзя злоупотреблять этим, нужно стараться так писать, чтобы сбои не были нормальным режимом и процессы жили месяцами.
    Ответ написан
    2 комментария
  • Что можно написать на Node.js?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js

    Часто применяется для:

    1. Локальные приложения и утилиты командной строки
    • Сборщики и трансляторы
    • Пакетная обработка и сценарии отложенной обработки
    • Скрипты, CLI (интерфейсы командной строки)
    • Генерация документации, отложенное формирование отчетов
    • Сценарии тестирования для других систем

    2. Серверы
    • Серверы веб-приложений и SPA
    • Серверы и API для мобильных приложений
    • Любые другие веб-API (RPC, JSON, REST)
    • Серверы сообщений и трансляция событий (чаты, игры, интерактив)
    • Заплаты на уже готовые системы, написанные на других языках, для реализации вебсокетов, SSE, лонг-пулинга и т.д., т.е. для затыкания дыр, для решения проблем в узких местах уже работающих систем.

    3. Клиенты
    • Оконные приложения (nw.js, node-webkit)
    • Кравлеры, парсеры и сбор данных

    4. Железо
    • Программирование микроконтроллеров (arduino, espruino, tessel)
    • Промышленная автоматизация

    Редко применяется (но подходит) для:
    • CMS, публикация контента (просто ниша уже занята и в этой задаче нода не дает чего-то принципиально нового или сверх соблазнительного).
    • Массовая электронная коммерция и торговля (не применяется для массовых движков магазинов, но используется отдельными крупными компаниями для торговых и платежных задач в качестве дополнительного средства к уже имеющемуся ПО, по сути закрывает узкие места).

    И плохо подходит:
    • Вычисления и моделирование, со скоростью математических операций нода и JS, как не типизированный язык, не дают хороших показателей
    • Научные приложения (по тем же причинам)
    Ответ написан
    10 комментариев
  • Какой open source проект на node.js выбрать как эталон для архитектуры и стиля?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    До этого поделайте лабы на nodeschool.io и у меня на https://github.com/HowProgrammingWorks
    Потом изучайте исходный код ноды для вникания в стиль: https://github.com/nodejs/node/tree/master/lib и уж потом проект.
    Ответ написан
    2 комментария
  • Как разбить большой файл в node.js на несколько поменьше?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Этот вопрос более общий, чем Ваш случай с node.js и даже более общий, чем JavaScript вообще. Хорошо разделить свой код на части, выделить абстракции, дать им названия и объединить их в одно целое - это одна из главных задач программиста на любом языке.

    Я сначала отвечу на частный вопрос по Node.js и JavaScript, а потом объясню эту тему глубже. Для Node.js есть require, при помощи которого можно импортировать из других модулей. Это реализация Dependency Lookup, т.е. мы имеем несколько модулей и каждый из них знает, от каких он зависит и может запросить менеджер зависимостей дать ссылку на то, что экспортирует другой модуль (в данном случае файл). Например, мы можем сделать require('./matrix.js') или require('./lib/matrix.js') и таким образом получим ссылку на то, что экспортирует matrix.js через module.exports = { ... };. Пример кода с импортом: names.js

    В этот самый module.exports мы отдаем ссылку на функцию ил на объект или массив, который содержит все, что мы хотим экспортировать (можно экспортировать и скалярное значение, но это практически не нужно). В подавляющем большинстве случаев экспортируют объект (используя его как справочник экспортируемых идентификаторов), чуть реже одну функцию (иногда фабрику или функцию обертку) или конструктор прототипа (или класса). Пример кода с экспортом: lib/submodule2.js

    Но можно импортировать зависимости целыми массивами, например тут: main.js Если посмотреть чуть шире ноды, на JavaScript, то есть способ импорта/экспорта через ключевые слова import и export. Примеры: import.mjs и export.mjs

    Документацию модно почитать тут:
    1. Модули для Node.js через require/module.exports: https://nodejs.org/api/modules.html
    2. Модули для Node.js через import/export: https://nodejs.org/api/esm.html
    3. Модули для JavaScript через import/export: https://developer.mozilla.org/en-US/docs/Web/JavaS... и https://developer.mozilla.org/en-US/docs/Web/JavaS...

    Но это все техническая реализация, гораздо важнее то, как мы разбиваем наш код на модули или абстракции. Тут нужно ввести понятие связывание и классифицировать методы связывания (частей кода):
    1. Через общие данные (самое жесткое связывание)
    2. Через вызовы (обычно между модулями с экспортом и импортом)
    3. Через события (самое легкое, между слабосвязанными программными компонентами)

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

    Вызовы - это гораздо более безопасный способ взаимодействия программных компонентов, поэтому мы используем его для интерфейса между модулями и между классами и прототипами. Мы экспортируем/импортируем коллекции функций (API) или коллекции классов, что предполагает, что все взаимодействие между ними будет через вызовы (даже обращение к свойствам может быть перехвачено геттерами и сеттерами). Об этом способе связывания модулей я уже выше много сказал.

    Наименее жесткий способ связывания - через события. Тут один программный компонент (модуль, класс, прототип, функтор) может подписаться на события другого или вызывать события у себя или в другого не ожидая, что там есть подписчики. Конечно тут могут быть проблемы с контрактами событий, т.е. именами и форматами данных, они все указаны не жестко и тут может быть много ошибок. Это очень гибкий способ, но он таит в себе потенциальные проблемы совместимости. Так что, где можно обойтись вызовами, то лучше не использовать события.

    Есть еще один средний способ между вызовами и событиями, это callback (и listener). При помощи него события и сделаны, практически, в метод .on(name, callback) (или его аналоги) передается функция callback в качестве аргумента. На этом способе построено асинхронное программирование, в том числе такие способы связывания, как асинхронная последовательная композиция и асинхронная параллельная композиция функций, чеининг и промисы.
    Ответ написан
    1 комментарий
  • Как переделать приложение под использование нескольких конфигов?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    1. Что вы понимаете под "использование рекурсивно"?
    2. Конфиги можно подгружать через require, readFile,
    3. Блюберд промисы уже давно не нужны, промисы в ноде есть нативные
    4. Зачем тут тайпскрипт в зависимостях, если приложение на js?
    5. Зачем в зависимостях библиотека для случайных чисел, если есть Math.random?
    6. Экспресс это фрактал говнокода и не должен быть использован ни где
    7. Везде по коду куча захордкоженных вещей, это ужасно
    8. В функциях изменяются значения аргументов, это ближайший путь к путанице
    9. Вот тут пример сервера с конфигами: https://github.com/HowProgrammingWorks/NodejsStarterKit
    Ответ написан
    Комментировать
  • Очень доступным языком о Long-Polling?

    planc
    @planc
    поковыряй пример https://socket.io/

    long polling используется, если клиент не может использовать websocket

    фишка в том, что вместо постоянного флуда новыми соединениями

    - есть что новое ?
    - нету !
    - есть что новое ?
    - нету !
    - есть что новое ?
    - { 'user': 'вася', 'message': 'привет'}
    - есть что новое ?
    - нету !

    происходит:
    - есть что новое
    ...
    ...
    ...
    ...
    - { 'user': 'вася', 'message': 'привет'}
    - есть что новое ?
    ...
    Ответ написан
    5 комментариев
  • Как запретить vim'у разбивать строки?

    uvelichitel
    @uvelichitel
    habrahabr.ru/users/uvelichitel
    :set nocompatible
    :set nowrap
    :set formatoptions-=t
    " Или чтобы оставить мягкое/визуальное форматирование 
    :set textwidth=0 wrapmargin=0
    Ответ написан
    Комментировать
  • Как настроить роутинг в .htaccess, сохранив 301 редирект?

    попробуйте настроить 301 редирект в одну строчку через конструкцию "Redirect", а также поменять местами очередность правил в .htaccess (может быть так что одно правило перекрывает другое)
    Ответ написан
    Комментировать
  • Как сделать подчеркивание в css другим цветом?

    @ElijahTr
    Если нужно соответствие макету (непрерывная линия) - использовать border-bottom.
    Если нужно просто подчеркивание текста - использовать text-decoration: underline.
    Но в последнем случае иметь в виду что некоторые браузеры используют text-decoration-skip: ink по умолчанию - линия будет прерываться для элементов выходящих за базовую линию. (Например под буквами "p" на верхней строке).
    Ответ написан
    Комментировать
  • Есть ли плавный скролл между якорями на чистом JS?

    AleksandrB
    @AleksandrB
    Совсем недавно вывел "Hello world"
    var linkNav = document.querySelectorAll('[href^="#"]'), //выбираем все ссылки к якорю на странице
        V = 1;  // скорость, может иметь дробное значение через точку (чем меньше значение - тем больше скорость)
    for (var i = 0; i < linkNav.length; i++) {
        linkNav[i].addEventListener('click', function(e) { //по клику на ссылку
            e.preventDefault(); //отменяем стандартное поведение
            var w = window.pageYOffset,  // производим прокрутка прокрутка
                hash = this.href.replace(/[^#]*(.*)/, '$1');  // к id элемента, к которому нужно перейти
            t = document.querySelector(hash).getBoundingClientRect().top,  // отступ от окна браузера до id
                start = null;
            requestAnimationFrame(step);  // подробнее про функцию анимации [developer.mozilla.org]
            function step(time) {
                if (start === null) start = time;
                var progress = time - start,
                    r = (t < 0 ? Math.max(w - progress/V, w + t) : Math.min(w + progress/V, w + t));
                window.scrollTo(0,r);
                if (r != w + t) {
                    requestAnimationFrame(step)
                } else {
                    location.hash = hash  // URL с хэшем
                }
            }
        }, false);
    }

    <a id="scroll" href="#one">⇩</a> <!-- ссылка, по клику на которую осуществляется прокрутка к якорю -->
    <a id="one" name="one"></a> <!-- якорь, расположенный в произвольном месте страницы -->

    Если вы об этом
    Ответ написан
    3 комментария
  • Как сделать такой анимированный скролл на js?

    iiiBird
    @iiiBird
    Пока ты спишь - твой конкурент совершенствуется
    Ответ написан
    Комментировать
  • Зачем connected-react-router, если есть window.history?

    @t800zippygod
    Если тебе просто нужно получить данные о странице - можно воспользоваться и таким методом. Если же ты хочешь использовать эти данные для динамического изменения адреса страниц и тд - то предпочтительнее пользоваться библиотекой.
    Смысл в том, что React - это по сути одна большая абстракция, построенная над домом. Если начать вылезать из абстракции на более низкие уровни - то она начнет протекать. Таким же образом можно и события вешать на addEventListener, но React не рекомендует это делать, так как для обрабатывания событий там имеется готовый инсрументарий
    Ответ написан
    Комментировать
  • Как заполнить пропуски в массиве?

    0xD34F
    @0xD34F Куратор тега JavaScript
    arr.reduce((acc, n) => {
      const { x, y } = acc[acc.length - 1] || {};
      for (let i = 1; n.x - x - i >= 1; i++) {
        acc.push({ x: `${+x + i}`, y });
      }
    
      acc.push({ ...n });
    
      return acc;
    }, [])
    Ответ написан
    Комментировать
  • Как лучше хранить контент в БД: HTML vs MarkDown?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Поскольку из поиска люди попадают в пост по заголовку, то отбросим несущественные заморочки автора с его текущим проектом и ответим на вопрос, который он вынес в заголовок:

    Однозначно MarkDown.

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

    Маркдаун легко читается, прекрасно редактируется, быстро корнвертируется.
    Тут даже вопроса нет, что применять - окаменелое экскремент мамонта или новенький айфончик.
    Ответ написан
    Комментировать
  • Как прописать 301 редирект с www в .htaccess?

    @dodo512
    RewriteEngine On
    RewriteCond %{ENV:HTTPS} !on    [OR]
    RewriteCond %{HTTP_HOST} ^www\. [NC]
    RewriteRule ^.*$ https://site.ru/$0 [L,R=301]
    Ответ написан
    Комментировать
  • Как расширить или переписать свойство интерфейса компонента сторонней библиотеки?

    @forspamonly2
    пофиксить тайпинг и отправить пуллреквест в DefinitelyTyped.

    потому что сам react-scroll событие передаёт.
    Ответ написан
    Комментировать
  • Как расширить или переписать свойство интерфейса компонента сторонней библиотеки?

    @shsv382
    Можно обернуть его в div, а на него навесить обработчик onClick, поменяв
    const goal = event.currentTarget.getAttribute('data-ymgoal');

    на
    const goal = event.currentTarget.firstElementChild.getAttribute('data-ymgoal');
    Ответ написан
    2 комментария
  • Как правильно вынести настройки nodejs сервера в отдельный файл?

    MarcusAurelius
    @MarcusAurelius Куратор тега Node.js
    автор Impress Application Server для Node.js
    Правильного способа тут нет, есть много разных, все - не правильные. Предлагаю два из неправильных способов, на выбор:

    Конфиг в JS файлах через require:

    Файл config.js:
    module.exports = {
      host: 'hostname',
      port: 80
    };

    Файл server.js:
    // Подключение конфига
    var config = require('./config.js');
    // Использование конфига
    console.dir(config);


    Конфиг в JSON файлах через require:

    Файл config.json:
    {
      "host": "hostname",
      "port": 80
    }

    Файл server.js:
    // Подключение конфига
    var config = require('./config.json');
    // Использование конфига
    console.dir(config);
    Ответ написан
    Комментировать
  • Как реализовать запись в state из props в функциональном компоненте?

    @paoluccio
    Можно попробовать синхронизировать локальный стэйт с данными из редакса. Структура, приблизительно, будет следующей:
    const Form = props => {
      const [localData, setLocalData] = useState();
    
      useEffect(() => {
        setLocalData(props.reduxData);
      }, [props.reduxData]);
    
      return (
        // ...
      );
    };


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