Node.js Flashcards
Отличия Node от браузера
Браузер:
Интерактивные веб-приложения
DOM, Window…
Нужно поддерживать старые версии браузеров
ES модули
Node:
Серверные приложения
API файловой системы, сети, криптографии…
Единная версия Node на сервере
CommonJS + ES модули
REPL
Read Eval Print Loop
Режим для отладки
Для входа в него пишем “node”
Модуль FS
Модуль файловой системы, возвращает буффер
readFileSync(path) - синхронно читает файл
Зачем нужны модули?
Изоляция
Организация файловой системы
Переиспользование
История модулей
1) IIFE
(const a = 2; APP.number = a)()
Работает только в браузере
2) require
module.exports = {a, b}
const {a,b} = require(some.js)
Работает только в Node, а в бразуере используется только для сборки. Webpack на самом деле собирает тоже всё на Node
3) ES модули
export
import
Отличия CommonJS от ES модулей
CommonJS Модули:
1) Require в пишем любом месте
2) Можно использовать в условиях
3) Загружает весь модуль, даже если импортируем небольшую часть
4) Синхронная загрузка модуля, может заблокировать поток
ES Модули:
1) Импорты всегда должны быть на верхнем уровне
2) Нельзя использовать в условиях (кроме асинхронных)
3) Выборочно загружает части их модуля
4) Асинхронная загрузка модуля
Как использовать ES модули в Node?
1) Работать с .mjs файлами
2) В package.json писать type: “module”
3) Передать node аргумент –input-type=module
Глобальные переменные
global - рутовый объект
console
performance
Buffer
AbortController
queueMicrotask
WebAssembly
setTimeout
setInterval
setImmediate
clearTimeout
clearInterval
clearImmediate
URL
URLSearchParams
MessageChannel
MessageEvent
MessagePort
Event
EventTarget
TextDecoder
TextEncoder
Модульные переменные
__dirname
__filename
exports - это алиас для module.exports
module
require()
Отличия Event Emitter от Event Target
Event Emitter (предпочтительнее для использования)
Берется из модуля events
Несколько lisener на 1 событие
Полностью эмулирует Event Emitter из браузера
Обработка ошибок через error
Встроенные события add / remove listeners
Event Target
Глобальная переменная
Только 1 listener на событие
Частично эмулирует API браузера
Нет обработки через error
Нет событий добавления и удаления обработчиков
Какие методы есть в Event Emitter
addListener - подписаться
on - подписаться
removeListener - отписаться
off - отписаться
prependListener - добавит листенер в начало очереди эмиттера, и его событие выполнится раньше всех (по дефлоту выполняется в порядке очереди добавления)
prependOnceListener - то же самое что и prependListener, но после выполнения удаляет листенер из эмиттера
removeAllListeners - отписаться от всех листенеров
emit - выполнить событие
once - после первого выполнения событие будет удалено из эмиттера
setMaxListeners - устанавливает максммальное количество листенеров для эмиттера, по дефолту их 10
listenerCount - узнать сколько листенеров находится на одном ивенте
listeners - показывает какие именно функции висят на событии
eventNames - показывает именна событий, которые сейчас повешены на эмиттер
Какие методы есть в Event Target
addEventListener - повесить обработчик
dispatchEvent - выполнить событие, но в качестве аргумента должен быть new Event(“name”), а не просто строка
С10K проблема
В мультитредовых серверах, например на Java, раньше 1 поток (1 поток обслуживал 1 запрос на сервер) примерно занимал 1мб, 10000 потоков - 10 ГБ памяти
Эта проблема была раньше, сейчас же трудности с обработкой например миллиона запросов, так как на это на сервере должно быть 1 ТБ оперативной памяти
Сколько потоков в Node.js?
1 поток и огромный thread pool
Non blocking I/O
Главный поток не блокируется вводом и выводом
Сервер будет продолжать обслуживать запросы
Мы работаем с асинхронным кодом