Все, что вам нужно знать о новом Node.js 8

Автор: Peter Berry
Дата создания: 13 Июль 2021
Дата обновления: 11 Май 2024
Anonim
Все, что нужно знать про Node.js
Видео: Все, что нужно знать про Node.js

Содержание

Последний крупный выпуск Node.js вносит множество значительных улучшений в сообщество JavaScript, включая обновленный движок JavaScript, npm версии 5, Google V8, API Node.js, async_hooks, анализатор URL WHATWG, более безопасные буферы и многое другое. Здесь мы расскажем вам об этих функциях и других наиболее важных аспектах этого выпуска.

Node.js 8 выпущен под кодовым названием Carbon и теперь доступен на сайте Node.js. Он будет активно работать еще 18 месяцев (без новых функций, только исправления ошибок, улучшения безопасности и обновления npm), прежде чем перейти в режим обслуживания. Как и в предыдущих выпусках, в режиме обслуживания выпуски будут получать только критические обновления безопасности и исправления ошибок.

  • 20 инструментов JavaScript, которые поразят вас

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


RisingStack помогает компаниям добиваться успеха с Node.js в течение четырех лет с помощью обучения, консультирования или развития. Одной из самых больших проблем, с которыми мы столкнулись, было добавление собственных зависимостей в проекты.

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

Этот процесс стал возможным благодаря огромной работе специалистов по сопровождению модулей, которые заставили свои модули работать с несовместимыми версиями Node.js, в основном с помощью модуля под названием NAN (Node.js Native Abstractions).

Этот процесс далек от идеала, поскольку многие компании не могли обновить свои зависимости, если они не могли быть скомпилированы, а также создавал огромную дополнительную рабочую нагрузку на разработчиков модулей. Чтобы решить эту проблему, был представлен API Node.js (или N-API).

01. Войдите в API Node.js.


API Node.js - одно из наиболее значительных улучшений Node.js 8. Он привносит в Node.js четко определенный ABI (двоичный интерфейс приложения), чтобы сделать его виртуальную машину независимой. Это означает, что собственные модули будут работать не только с разными версиями Node.js, использующими движок Google V8 JavaScript, но и с Microsoft Chakra.

На данный момент N-API находится в экспериментальном состоянии, а это означает, что могут произойти значительные изменения как в реализации, так и в API. С учетом сказанного, сопровождающим нативных модулей рекомендуется опробовать новый интерфейс и оставить отзыв.

Если вы сопровождаете модуль, вы можете выпустить версию своего модуля с N-API параллельно с версией основного модуля. Для этого официальная рекомендация - опубликовать версию вашего модуля с тегом n-api в npm.

Чтобы опубликовать версию N-API, вам необходимо:

  1. Опубликуйте версию, отличную от N-API, как обычно.
  2. Опубликуйте версию N-API:
  • Обновите версию в файле package.json, добавив тире и напи тег - так что если у вас раньше была 1.0.0, она становится 1.0.0-napi
  • Опубликовать в npm с помощью npm publish --tag n-api

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


Yarn, менеджер пакетов, созданный инженерами Facebook, был выпущен в октябре 2016 года. Он пытался устранить некоторые недостатки официального клиента npm, в основном за счет повышения производительности и детерминированности. Большинство этих нововведений также присутствует в npm 5.

02. Поприветствуйте npm 5

Как и Yarn, npm 5 представил механизм блокировки файла - всякий раз, когда вы устанавливаете новую зависимость в свой проект, она будет добавляться автоматически, а не только в package.json, но новый файл с именем пакет-lock.json также.

Вы можете спросить, в чем разница между пакет-lock.json а также npm-shrinkwrap.json, как npm-shrinkwrap всегда был в npm? Короче говоря, они по сути одинаковы, но пакет-lock.json создается автоматически.

Их цель - точно описать, какое дерево зависимостей npm должен создать для вашего пакета. Если у вас есть оба, npm-термоусадочная пленка будет иметь приоритет. По рекомендации npm вам следует использовать npm-shrinkwrap.json если вы хотите опубликовать его, ваши потребители модулей тоже будут его использовать. С другой стороны, вы должны использовать package-lock.json внутри себя - даже в репозиториях.

Но улучшения в npm 5 не остановились на добавлении файла блокировки - в новой версии все устанавливаемые вами модули также автоматически сохраняются, и они будут добавлены в оба ваших файла. package.json а также пакет-lock.json файл.

Также немного изменился способ работы скриптов npm. Во-первых, предустановленные сценарии теперь выполняются раньше всего, поэтому они могут изменить каталог node_modules до того, как CLI фактически прочитает его. Кроме того, были добавлены два новых скрипта - prepack и postpack. Оба они работают как с пакетом npm, так и с пакетом npm publish, но не с пакетом npm install.

В основе Node.js лежит движок JavaScript, который интерпретирует ваш код JavaScript, создает из него байт-код и позволяет запускать ваше приложение. В новом выпуске Node.js 8 это тоже было обновлено.

03. Обновленный движок JavaScript.

Благодаря обновленному движку V8 значительно улучшена производительность, но, что более важно, он гарантированно будет иметь двоичный интерфейс приложения с прямой совместимостью. Это означает, что Node.js сможет обновить движок V8 без основного выпуска Node.js.

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

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

Ignition, новый интерпретатор, и TurboFan, новый оптимизирующий компилятор, разрабатывались почти три с половиной года. Они являются фундаментом, на котором будут построены новые языковые функции. Они включают в себя опыт, полученный командой V8 в Google при измерении реальных приложений JavaScript.

04. Добро пожаловать, асинхронные хуки

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

Представьте, что вы пишете приложение, которое извлекает продукт из базы данных, а позже вы хотите отправить его в своем HTML-ответе:

const createNamespace = require ('continue-local-storage'). createNamespace const session = createNamespace ('my-app-session') const db = require ('./ db.js') function onRequest (options, next) {db .fetchUserById (options.id, function (error, user) {if (error) {return next (error)} session.set ('user', user) next ()})

Позже, если вы захотите получить доступ к объекту пользователя, все, что вам нужно сделать, это взять его из локального хранилища:

const getNamespace = require ('continue-local-storage'). getNamespace const session = getNamespace ('my session') const render = require ('./ render.js') function finish (response) {const user = session.get ('пользователь') render ({user: user}). pipe (response)}

Этот метод широко используется поставщиками мониторинга производительности приложений, такими как Trace by RisingStack, для сохранения контекста выполнения и сбора информации мониторинга из производственных систем.

С помощью Async Hooks аналогичная функция перемещена в ядро ​​Node.js - она ​​помогает отслеживать асинхронные запросы и обработчики на протяжении их жизненного цикла. В async_hooks модуль предоставляет API для регистрации обратных вызовов, отслеживающих время жизни асинхронных ресурсов, созданных внутри приложения Node.js.

05. Улучшенная поддержка обещаний

До Node.js 8, если вы хотели использовать основные модули в приложении, использующем Promises, вам приходилось вручную обертывать основные модули, чтобы их можно было использовать таким же образом. Выглядело это примерно так:

const fs = require ('fs') function readFilePromise (... args) {return new Promise ((resolve, reject) => {fs.readFile (... args, (err, result) => {if (err ) {return resolve (err)} resolve (result)})})} readFilePromise ('./ package.json', 'utf-8') .then ((res) => console.log (res)) .catch ((ошибка) => console.log (ошибка))

В Node.js 8 к модулю ядра утилиты добавлен новый вспомогательный метод, util.promisify. Он позволяет обернуть стандартные API-интерфейсы в стиле обратного вызова Node.js в функцию, возвращающую обещания.

Используя эту функцию, приведенный выше фрагмент упрощается и становится следующим:

const fs = require ('fs') const promisify = require ('util'). promisify readFilePromise = promisify (fs.readFile) readFilePromise ('./ package.json', 'utf-8') .then ((res) => console.log (res)) .catch ((err) => console.log (err))

06. Более безопасные буферы

До версии Node.js 8 буферы, выделенные с помощью конструктора new Buffer (Number), не инициализировали пространство памяти нулями. В результате новые экземпляры Buffer могли содержать конфиденциальную информацию, что приводило к серьезным проблемам с безопасностью - были затронуты даже популярные модули, такие как mongoose, ws или модуль запроса.

Но как мы туда попали? Когда JavaScript был перенесен из браузера на серверную часть, возникла потребность в быстрой и простой обработке данных - поэтому был добавлен класс Buffer. Буфер - это изменяемый массив двоичных данных. При использовании с конструктором, который запрашивает размер нового буфера, он просто резервирует пространство памяти, но не очищает его.

Поскольку ваш сервер может обслуживать несколько пользователей одновременно (в отличие от вашего браузера), возможно, что только что выделенное пространство памяти содержит конфиденциальную информацию от других пользователей (даже пароли!) И потенциально может быть уязвимо для злоумышленника.

Хотя это было намеренное решение повысить производительность создания нового буфера, для большинства из нас это не было предполагаемым использованием, даже если оно было задокументировано. Из-за этого, начиная с Node.js 8, буферы, выделенные с использованием нового буфера (числа) или буфера (числа), будут автоматически заполняться нулями.

07. Изменения в отладке

До Node.js 8, если вы хотели отлаживать свои приложения Node.js, одним из самых простых решений было запустить встроенный отладчик, используя отладку узла. index.js. В Node.js 8 он был удален и заменен на node-Inspector. Вы все еще можете использовать отладчик CLI, но он скоро будет удален.

С этого момента вы должны использовать узел --проверить index.js, или узел --inspect-brk index.js если вы хотите, чтобы отладчик установил точку останова на первой строке приложения. После его запуска вы получите ссылку WebSocket, которую Google Chrome может использовать для подключения своего отладчика.

Вам следует перейти на страницу chrome: // inspect в браузере Chrome, и он автоматически распознает запущенное приложение Node.js, что позволит вам подключиться. После подключения к процессу вы получите отладчик Chrome для проверки вашего запущенного приложения Node.js.

08. Представляем статические коды ошибок.

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

В Node.js 8 статические коды ошибок были присвоены большинству ошибок - это все еще незавершенная работа, но после ее завершения эти коды ошибок не изменятся, даже если сообщение об ошибке изменится. .

Например, недавно представленный WHATWG URL API бросит ERR_INVALID_URL ошибка в следующем фрагменте, поскольку параметр не является допустимым URL:

const URL = require (’url’). URL const myURL = new URL (’/ foo’)

Как видите, выпуск обновления Node.js 8 принес сообществу JavaScript множество новых и интересных улучшений. Чтобы самостоятельно начать экспериментировать со всеми этими новыми функциями, зайдите на nodejs.org, загрузите двоичный файл Node.js 8 и начните играть со своим новым набором инструментов!

Эта статья изначально появилась в сетевой журнал Выпуск 296. Купить здесь.

Новые публикации
5 типов дизайнерских клиентов и как с ними обращаться
Узнать

5 типов дизайнерских клиентов и как с ними обращаться

В моей первой статье для Creative Bloq «Как убежать от клиентов из ада» я объяснил, как отфильтровать небольшое количество клиентов, которые могут превратить вашу жизнь в кошмар, прежде чем ...
Создавайте адаптивные карты изображений SVG
Узнать

Создавайте адаптивные карты изображений SVG

Скринкаст создан Tut + Premium совместно с сетевым журналом и Creative Bloq.Карты изображений имеют очень долгую историю в Интернете и сразу же набирают популярность после того, как были представлены ...
Как диджитал разрушает барьеры в искусстве
Узнать

Как диджитал разрушает барьеры в искусстве

Мы поговорим с интерактивным художником Марпи, чтобы узнать, что входит в его популярные цифровые инсталляции, и послушаем превью его предстоящего выступления на Generate London.Во-первых, вы ищете но...