💻 Node.js модули и пакеты формата ECMA и CommonJS, использование package.json и node_modules

Поделиться
HTML-код
  • Опубликовано: 14 сен 2021
  • Github автора: github.com/tshemsedinov
    Оглавление курса: github.com/HowProgrammingWork...
    Канал курса в телеграме: t.me/HowProgrammingWorks
    Примеры кода: github.com/HowProgrammingWork...

Комментарии • 28

  • @serhiibaranovskyi9131
    @serhiibaranovskyi9131 2 года назад +7

    Timur Shemsedinov, спасибо за материал

  • @ApelsinovIvan
    @ApelsinovIvan 2 года назад +12

    Они с ума посходили, все так запутать с этим модулем module, спасибо, что разбираете все это так глубоко

    • @TimurShemsedinov
      @TimurShemsedinov  2 года назад +6

      Для меня тоже было удивительно вот такое поведение кеша, прям на лекции разобрался )))

  • @timashoff
    @timashoff 11 месяцев назад +1

    как всегда, спасибо!

  • @dmytrohaponov5517
    @dmytrohaponov5517 2 года назад +6

    1:00 подгрузка пакетов package
    5:40 загрузка пакетов
    9:00 подгрузка файлов нового формата .mjs
    10:47 импорт ecma скрипт модулей с .js файлов
    13:20 export пакетов
    22:30 сравнение cache-й модулей

  • @TimurSevimli
    @TimurSevimli Год назад +1

    Кстати сделал маленькие эксперименты и можно использовать import и так же require через .js файла для модулей которые находятся в node_modules. Важно что бы было package.json и там было прописано "type": "module" если хотите использовать import. Причем даже если этот модуль использует внутр себя require и module.exports то все равно можно его импортировать с ключевым словом import без всяких await - then. А так же спокойно использовать require если убрать type module из package.json

  • @maksimsergeevich5939
    @maksimsergeevich5939 2 года назад +1

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

  • @user-ww1gw2cx9v
    @user-ww1gw2cx9v 6 месяцев назад

    По этому моменту: ruclips.net/video/31sX_3IbXs4/видео.html
    при динамическом импорте - const m1 = await import('module') получаем объект типа (класса) Module - [Module: null prototype]
    при классическом импорте - import m3 from 'module' - получаем функциональный объект типа Module - [Function: Module]
    т.е. два вида импорта возвращают объекты разных типов ( например мы можем сделать вызов m3(), но при таком вызове m1() получим ошибку )
    И, соответственно, m1 !== m3

  • @khisamovelnar5640
    @khisamovelnar5640 2 года назад +3

    ruclips.net/video/31sX_3IbXs4/видео.html
    Спасибо за материал!
    Кажется тут оговорка небольшая, видимо имелся ввиду ecmascript модуль.

    • @TimurShemsedinov
      @TimurShemsedinov  2 года назад +1

      Да, тут не мудрено запутаться)

  • @serhiibaranovskyi9131
    @serhiibaranovskyi9131 2 года назад +3

    Timur Shemsedinov, какое приемущество для вас у nodejs перед другими серверными языками ?

    • @TimurShemsedinov
      @TimurShemsedinov  2 года назад +1

      Перед какими конкретно? Потому, что есть и лучше по отдельным параметрам, но нужно смотреть по совокупности, это 4 часа можно рассказывать. Посмотрите мои доклады и интервью обзорные github.com/HowProgrammingWorks/Index/blob/master/Courses/Talks.md

    • @serhiibaranovskyi9131
      @serhiibaranovskyi9131 2 года назад +1

      Как вариант перед golang

    • @TimurShemsedinov
      @TimurShemsedinov  2 года назад +7

      @@serhiibaranovskyi9131 у go лучше встроенные механизмы параллельного программирования, а node.js они тоже есть, и даже можно сделать аналоги горутин, но для этого нужно приложить много усилий и этого мало кто умеет. Я в технологическом стеке Метархия сделал. Но в остальном прочем js гораздо более выигрышный язык, чем go, потому, что все его знают. Это как если взять на работу чувака, говорящего на английском и не очень хорошо программирующего или взять чувака, говорящего только на языке хадза (одном из семейства койсанских языков), но за то программирующего как Бог. Есть другой путь, можно сделать для js такую библиотеку, чтобы даже начинающие могли писать параллельное программирование, не задумываясь об этом, даже не зная этого и все магически для них разруливалось.

  • @dmytroyurchenko200
    @dmytroyurchenko200 Год назад

    а как удалить кэш именно в модулях типа ЕКМАскрипт? Причем как в динамик так и директив типе?
    комплит пас резолв в туже копилку

  • @sstelss
    @sstelss 2 года назад +2

    еще интересная особенность, что commonjs свободно импортируется в module, а вот наоборот нет

  • @Arimanecro
    @Arimanecro 2 года назад +5

    Тимур спасибо за Ваш труд.
    Смотрю ваши ролики и повышаю квалификацию :)
    После просмотра видео про worker threads и sandbox, у меня возникло Три вопроса:
    1) как в worker threads запустить сервер на одном порту (например 8000) в нескольких воркерах? Стандартный код :
    const numCPUs = 4;
    for(let i=1; numCPUs >= i; i++) const worker = new Worker('./server.mjs');
    первый воркер запустит сервер на 8000, а остальные три выдадут ошибку:
    Error: listen EADDRINUSE: address already in use :::8000
    Попадалась инфа, что это возможно связано с виндой(у меня винда)...на линуксе типа работает. Так ли это?
    2) Вы говорили про песочницы следующее: "у одного пользователя может произойти ошибка, которая может убить процесс, в результате чего все пользователи отключатся и получат ошибку. Вот чтобы этого избежать нужно исполнять код в изолированном контексте, что и делает vm"
    Можете привести пример такой ошибки с которой не справились бы process.on('uncaughtException') и process.on('unhandledRejection'). Если они справляются и не дают убить процесс, то зачем использовать песочницу?
    3) Почему в лекции Graceful Shutdown , Вы не засовываете сервер в песочницу в воркере?
    Заранее спасибо.

    • @TimurShemsedinov
      @TimurShemsedinov  2 года назад +2

      1. Нужно на разных портах подымать воркеры, от винды это не зависит.
      2. Когда случается unhandledRejection или uncaughtException то состояние приложения портится, и нужно или перезапустить процесс или поток или песочницу, но нельзя просто игнорировать эти ошибки, потому, что так будут утечки памяти, а часто и неправильное поведение или уязвимости от того, что вы не позаботились о консистентности памяти.
      3. Потому, что невозможно все в одной лекции сделать и я делю по темам.
      Примеры всего этого можно найти в github.com/HowProgrammingWorks/NodejsStarterKit и еще посмотрите вебинары 2020 и 2021 года мои на JavaScript FwDays github.com/HowProgrammingWorks/Index/blob/master/Courses/Talks.md

    • @Arimanecro
      @Arimanecro 2 года назад +1

      @@TimurShemsedinov спасибо за столь быстрый ответ.
      1) да, приходило такое решение. Например http сервер работает на 8000, а остальные на 8001, 8002 и т.д, но раздача портов другим воркерам бессмысленна, так как общение между воркерами происходит в main thread через событие 'message' и метод postMessage(), а не через порты. Но главная проблема так и осталась, что сервер обрабатывается одним ядром, да, мы синхронные задачи должны отдавать на обработку воркерам, тем самым не блокируя event loop, но разве это нормально, что одно ядро берет всю нагрузку на прием соединений?
      2) "перезапустить песочницу" -- можете подсказать, как это сделать? в документации не нашел никакого метода...
      3) " нельзя просто игнорировать эти ошибки, потому, что так будут утечки памяти" -- можете пояснить в двух словах, что начинает "жрать" память? Отработанный код до ошибки не очищается или что?
      4) "посмотрите вебинары 2020 и 2021 " -- я пересмотрел за полтора месяца абсолютно все ваши видео, включая текущее 👍

    • @TimurShemsedinov
      @TimurShemsedinov  2 года назад +4

      ​@@Arimanecro 1. Каждый поток может работать на одном ядре, если вы откроете по порту на поток и по поктоку на ядро и распределите пользователей по ним, то будут использоваться все ядра.
      2. Новую создать и потерять ссылку на старую, песочницу не должны держать ни события ни ссылки, ни замыкания, т.е. ее нужно так использовать, чтобы она не пришла с зацепление с другим кодом и тогда она удалится сборщиком мусора, как обычный объект.
      3. Я это во многих лекциях объяснял, пересмотрите про утечки памяти и про грефсфул шатдаун, в двух словах - брошенное исключение прерывает работу алгоритма где-то посередине, а значит, что все соединения с БД, структуры памяти, кеши, запросы к внешним API и файловые дескрипторы остаются или приходят в неконсистентное и неожидаемое состояние. Продолжать работать такому процессу нельзя.

    • @Arimanecro
      @Arimanecro 2 года назад

      ​@@TimurShemsedinov 1) эмм...я наверное не совсем ясно выразился. Я имел в виду следующее, когда пользователь заходит на сайт, он же автоматом попадает по умолчанию на http порт 80. Этот порт слушает один уоркер. Например зашло 9999 пользователей и десятитысячного я хочу перекинуть на второго уоркера у которого сервер на 81 порту. Как мне это сделать? По-любому первый уоркер принимает все запросы по умолчанию и берет на себя всю нагрузку, даже если он каким-то образом перекинет соединение другому.
      Вот с этим непонятка: а) как один уоркер может перекинуть соединение другому? есть ли в этом смысл, если уоркер на 80 порту, все равно принимает все соединения по умолчанию и нагрузка никуда не уходит б) как решить проблему по умолчанию с 80 портом? Я ещё не разбираюсь в том, что происходит за пределами ноды, но логика подсказывает, что где-то можно прописать (в том же nginx) нужные порты и веб-сервер будет сам заниматься балансировкой и не надо ничего вручную делать. Я прав? 🙄 в) и что сделать в коде с api запросами на сервер, если сервера на разных портах, а в коде опять же тот же fetch будет слать по умолчанию запрос на 80 порт? или балансировщик за пределами ноды будет перенаправлять на другой порт и никаких ошибок не будет?
      Вообщем вот такая каша в голове 🥺
      2) ко мне все никак не приходит понимание выгоды песочницы...если в песочнице происходит ошибка, то я по любому ее ловлю через process uncaught exception. И что дальше делать? Создать внутри uncaught exception обработчик, который будет принимать в ошибке ссылку на объект песочницы и убивать, например, через присвоение null и потом создать новую песочницу? Получается из "мертвой" песочницы запускать новую?Если это долго объяснять, то может имеется ссылка на код в вашем репозитории, где показан процесс уничтожения и пересоздания песочницы?

    • @TimurShemsedinov
      @TimurShemsedinov  2 года назад +1

      @@Arimanecro раундробином раскидывается нагрузка почти равномерно, балансирока на 80 порту редиректами и fetch тоже может ходить на какой нужно порт. Все это в том же стартер ките есть и в лекциях по ноде

  • @KopoLPedov
    @KopoLPedov 2 года назад +1

    сколько еще этих библиотек модулей нужно слепить, чтобы уже придти к какой-то одной, ужас

    • @lord8360
      @lord8360 2 года назад

      Согласен 😁😁😁