Node.js быстро стал стандартом для создания веб-приложений и системного программного обеспечения благодаря способности использовать JavaScript на серверной стороне. Популярные фреймворки, такие как Express и такие инструменты, как Webpack, способствуют его широкому использованию. Хотя существуют такие конкуренты, как Deno и Bun, Node остается ведущей платформой серверного JavaScript.
Мультипарадигмальность JavaScript позволяет использовать различные стили программирования, но также создает такие риски, как мутация области видимости и объекта. Отсутствие оптимизации хвостовых вызовов делает большие рекурсивные итерации опасными, а однопоточная архитектура Node требует асинхронного кода для повышения эффективности. Несмотря на трудности, следование ключевым концепциям и лучшим практикам JavaScript может помочь разработчикам Node.js писать масштабируемый и эффективный код.
1. Замыкания JavaScript
Замыкание в JavaScript — это внутренняя функция, которая имеет доступ к области видимости своей внешней функции даже после того, как внешняя функция вернула управление. Замыкание делает переменные внутренней функции частными. Функциональное программирование приобрело огромную популярность, благодаря чему замыкания стали неотъемлемой частью набора разработчиков Node. Вот простой пример замыкания в JavaScript:
2. Прототипы JavaScript
Каждая функция JavaScript имеет свойство прототипа, которое используется для присоединения свойств и методов. Это свойство не является перечислимым. Он позволяет разработчику присоединять к своим объектам методы или функции-члены. JavaScript поддерживает наследование только через свойство прототипа. В случае унаследованного объекта свойство прототипа указывает на родителя объекта. Распространенный подход к присоединению методов к функции — использование прототипов, как показано здесь:
Хотя современный JavaScript имеет довольно сложную поддержку классов, он по-прежнему использует систему прототипов. Это источник значительной гибкости языка.
3. Определение частных свойств с использованием хэш-имен
В былые времена соглашение о добавлении к переменным префикса подчеркивания использовалось для обозначения того, что переменная должна была быть частной. Однако это было всего лишь предложение, а не ограничение, налагаемое платформой. Современный JavaScript предлагает частные члены и методы с хэштегами для классов:
Частные хеш-имена — это новая и очень полезная функция JavaScript! Последние версии Node и браузеры поддерживают его, а инструменты разработчика Chrome позволяют для удобства напрямую обращаться к частным переменным.
4. Определение частных свойств с помощью замыканий
Другой подход, который иногда можно встретить для обхода отсутствия частных свойств в системе прототипов JavaScript, — это использование замыкания. Современный JavaScript позволяет определять частные свойства с помощью префикса хэштега, как показано в примере выше. Однако это не работает для системы прототипов JavaScript. Кроме того, этот трюк часто можно встретить в коде, и важно понимать, что он делает.
Определение частных свойств с помощью замыканий позволяет моделировать частную переменную. Функции-члены, которым необходим доступ к частным свойствам, должны быть определены в самом объекте. Вот синтаксис для создания частных свойств с использованием замыканий:
5. Модули JavaScript
Когда-то в JavaScript не было системы модулей, и разработчики придумали хитрый трюк (называемый шаблоном модуля), чтобы создать что-то, что работало. По мере развития JavaScript он породил не одну, а две системы модулей: синтаксис CommonJS include и синтаксис ES6 require.
Node традиционно использует CommonJS, а браузеры — ES6. Однако последние версии Node (за последние несколько лет) также поддерживают ES6. Сейчас тенденция заключается в использовании модулей ES6, и когда-нибудь у нас будет только один синтаксис модуля, который можно будет использовать во всем JavaScript. ES6 выглядит так (где мы экспортируем модуль по умолчанию, а затем импортируем его):
Вы по-прежнему будете видеть CommonJS, и иногда вам придется использовать его для импорта модуля. Вот как выглядит экспорт, а затем импорт модуля по умолчанию с помощью CommonJS:
6. Обработка ошибок
Независимо от того, на каком языке или в какой среде вы находитесь, обработка ошибок важна и неизбежна. Ноут не является исключением. Существует три основных способа обработки ошибок: блоки try/catch, выдача новых ошибок и обработчики on().
Блоки с функцией try/catch — это проверенное средство обнаружения ошибок, когда что-то идет не так:
В этом случае мы регистрируем ошибку на консоли с помощью console.error. Вы можете выбрать выдачу ошибки, передав ее следующему обработчику. Обратите внимание, что это нарушает выполнение потока кода; то есть текущее выполнение останавливается и его берет на себя следующий обработчик ошибок в стеке:
Современный JavaScript предлагает довольно много полезных свойств для своих объектов Error, включая Error.stack для просмотра трассировки стека. В приведенном выше примере мы устанавливаем свойство Error.message и Error.cause с аргументами конструктора.
Другое место, где вы можете обнаружить ошибки, — это блоки асинхронного кода, где вы обрабатываете обычные результаты с помощью .then(). В этом случае вы можете использовать обработчик on(’error’) или событие onerror, в зависимости от того, как обещание возвращает ошибки. Иногда API возвращает объект ошибки в качестве второго возвращаемого значения с нормальным значением. (Если вы используете await в асинхронном вызове, вы можете обернуть его в try/catch для обработки любых ошибок.) Вот простой пример обработки асинхронной ошибки:
Несмотря ни на что, никогда не проглатывайте ошибки! Я не буду это показывать здесь, потому что кто-то может это скопировать и вставить. По сути, если вы обнаружите ошибку и ничего не предпримете, ваша программа продолжит работу без каких-либо очевидных признаков того, что что-то пошло не так. Логика будет нарушена, и вам придется размышлять, пока вы не найдете пустой блок catch. (Обратите внимание: если использовать блок finally{} без блока catch, ваши ошибки будут проглочены.)
7. Каррирование в JavaScript
Каррирование — это метод повышения гибкости функций. С помощью каррированной функции вы можете передать все аргументы, которые ожидает функция, и получить результат, или вы можете передать только подмножество аргументов и получить обратно функцию, которая ожидает оставшуюся часть аргументов. Вот простой пример карри:
Исходную каррированную функцию можно вызвать напрямую, передав каждый из параметров в отдельном наборе круглых скобок, один за другим:
Это интересный метод, который позволяет создавать фабрики функций, где внешние функции позволяют частично настроить внутреннюю. Например, вы также можете использовать приведенную выше функцию каррирования следующим образом:
В реальном использовании эта идея может помочь, когда вам нужно создать множество функций, которые различаются в зависимости от определенных параметров.
8. Методы применения, вызова и привязки JavaScript
Хотя мы не каждый день их используем, полезно понимать, что такое методы call, apply и bind. Здесь мы имеем дело с серьезной языковой гибкостью. По сути, эти методы позволяют вам указать, к чему разрешается ключевое слово this.
Во всех трех функциях первым аргументом всегда является это значение или контекст, который вы хотите передать функции.
Из трех, вызов самый простой. Это то же самое, что вызвать функцию с указанием ее контекста. Вот пример:
Обратите внимание, что apply почти то же самое, что call. Единственное отличие состоит в том, что вы передаете аргументы как массив, а не отдельно. В JavaScript легче манипулировать массивами, что открывает больше возможностей для работы с функциями. Вот пример использования apply и call:
Метод bind позволяет передавать аргументы функции, не вызывая ее. Новая функция возвращается с ограниченными аргументами, предшествующими любым дальнейшим аргументам. Вот пример:
9. Запоминание JavaScript
Мемоизация — это метод оптимизации, который ускоряет выполнение функций за счет сохранения результатов дорогостоящих операций и возврата кэшированных результатов при повторном возникновении того же набора входных данных. Объекты JavaScript ведут себя как ассоциативные массивы, что упрощает реализацию запоминания в JavaScript. Вот как преобразовать рекурсивную функцию факториала в запоминаемую функцию факториала:
10. JavaScript IIFE
Выражение функции с немедленным вызовом (IIFE) — это функция, которая выполняется сразу после создания. Он не имеет никакой связи с какими-либо событиями или асинхронным выполнением. Вы можете определить IIFE, как показано здесь:
Первая пара круглых скобок function(){...} преобразует код внутри круглых скобок в выражение. Вторая пара круглых скобок вызывает функцию, полученную из выражения. IIFE также можно описать как самовызывающую анонимную функцию. Чаще всего его используют для ограничения области действия переменной, созданной с помощью var или для инкапсуляции контекста во избежание конфликтов имен.
Также бывают ситуации, когда вам нужно вызвать функцию с помощью await, но вы не находитесь внутри асинхронного функционального блока. Иногда это происходит с файлами, которые вы хотите сделать напрямую исполняемыми, а также импортировать как модуль. Вы можете обернуть такой вызов функции в блок IIFE следующим образом:
11. Полезные функции аргументации
Хотя JavaScript не поддерживает перегрузку методов (поскольку он может обрабатывать произвольное количество аргументов в функциях), у него есть несколько мощных средств для работы с аргументами. Во-первых, вы можете определить функцию или метод со значениями по умолчанию:
Вы также можете принимать и обрабатывать все аргументы одновременно, чтобы обрабатывать любое количество переданных аргументов. При этом используется оператор rest для сбора всех аргументов в массив:
Если вам действительно нужно иметь дело с разными конфигурациями аргументов, вы всегда можете их проверить:
Также помните, что JavaScript включает встроенный массив аргументов. Каждая функция или метод автоматически предоставляет вам переменную arguments, содержащую все аргументы, переданные в вызов.
Заключение
Познакомившись с Node, вы заметите, что существует множество способов решения практически каждой проблемы. Правильный подход не всегда очевиден. Иногда существует несколько действенных подходов к конкретной ситуации. Знание множества доступных вариантов помогает.
10 обсуждаемых здесь концепций JavaScript — это основы, которые будет полезно знать каждому разработчику Node. Но они — верхушка айсберга. JavaScript — мощный и сложный язык. Чем больше вы его используете, тем лучше вы поймете, насколько огромен JavaScript на самом деле и как много вы можете с ним сделать.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3