Node.js Getting Started Series (3) Разработка и отладка, глобальные встроенные функции и переменные

Node.js
Node.js Getting Started Series (3) Разработка и отладка, глобальные встроенные функции и переменные

написать впереди

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

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

Обзор последней серии

В прошлом выпуске мы говорили о модульной концепции внутри Node.js и знании REPL, а также о развитии модуляризации фронтенда и взаимосвязи с Node.js.

Если вы читаете эту статью впервые, настоятельно рекомендуется начать чтение с первого раздела, и вы получите больше.Эта серия не имеет преувеличенных названий, но содержание имеет достаточную широту.Я считаю, что это определенно позволит вы, чтобы увидеть различные интерпретации. При этом каждая статья имеет небольшое количество слов и может быть прочитана за 5-10 минут.Если вам пока не хватает времени, вы можете нажать, чтобы подписаться или поставить лайк, и вы можете найти это цикл статей в «Динамике» в будущем.

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


Разговор о начале работы с Node.js
Серия «Начало работы с Node.js» (1) Возможности, применимые сценарии, решенные болевые точки интерфейса
Node.js, серия «Начало работы» (2), модули, REPL



У Node.js есть слоган «все есть модуль», очень похожий на слоган «все есть объект» во внешнем JavaScript.
Эта функция имеет преимущества и недостатки. Преимущество в том, что все является единой концепцией, которую легко выучить и запомнить, а недостатком в том, что эта концепция часто сбивает нас с толку. пока. При углубленном изучении эти путаницы постепенно исчезнут. Ниже приводится официальная запись в этом разделе.

Цели обучения этого раздела

Две цели:
1) Как отлаживать программу разработки?
2) Какие методы и переменные есть в Node.js

Учебный каталог для этого раздела

1. Что такое консоль Node.js? Как я могу отладить приложение с помощью консоли?

2. Глобальная область действия Node.js, а также глобальные функции и переменные, предоставляемые Node.js.

3. Соответствующие тестовые сайты интервью в этом разделе

4. Резюме этого раздела

 Следующее уведомление: механизм событий Node.js

Шестой конец текста

1. Что такое консоль Node.js? Как я могу отладить приложение с помощью консоли?

В разделе «Модули Node.js Getting Started Series (2), REPL» мы говорили о модулях Node.js, одним из которых является консольный модуль. Для тех, кто не помнит, вы можете прочитать его здесь:

Этот модуль является встроенным объектом. У него много методов. Его функция заключается в выводе информации для разработки и отладки. На самом деле он похож на встроенный объект консоли, который мы используем в клиентском JavaScript. Его можно помнить вместе при запоминании . Его можно использовать двумя способами: один — записать его в модуль и вывести при выполнении модуля, а другой — записать прямо в REPL, из файлового модуля. Имеющиеся у него методы перечислены ниже, и вы можете сравнить их при использовании.

расширять

Во втором разделе мы обсудили REPL, интерактивный интерпретатор, который предоставляет среду для отладки и запуска.В этом разделе говорится о модуле консоли, который также может предоставлять возможности отладки, так в чем же между ними разница? У нас есть два инструмента отладки?

Давайте сначала посмотрим, что они из себя представляют: В разделе 2 при демонстрации примера REPL мы видели, что REPL может выполнять выражения, получать доступ к самой последней записи, а также предоставлять некоторые основные инструкции REPL предоставляет среду выполнения. Глядя на консоль, это встроенный модуль Node.js, который можно использовать в файлах js или выводить напрямую в REPL.

Таким образом, отношения между REPL и консолью таковы: одна — рабочая среда, а другая — инструмент отладки Инструмент отладки зависит от рабочей среды.

Во-вторых, глобальная область действия Node.js, а также глобальные функции и переменные, предоставляемые Node.js.

Глобальная область Node.js

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

console.log(global)

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

Глобальные функции и переменные, предоставляемые Node.js

1) установить время ожидания и очистить время ожидания

setTimeout похож на setTimeout в клиентском JavaScript, что означает, что функция обратного вызова будет выполняться через указанное время с этого момента. Роль clearTimeout заключается в отмене вызова функции обратного вызова.
Синтаксис следующий:

setTimeout(callback, ms, [arg], [...])

В этой функции используется более двух параметров, первые два параметра являются обязательными параметрами, а значение первого параметра является обязательным. Выполняемая функция обратного вызова, второе значение параметра — целое число, которое используется для указания, сколько миллисекунд выполнять функцию обратного вызова, Значение должно находиться в диапазоне от 1 до 2 147 483 647 (то есть 24,8 дня). Если указанное значение слишком велико, оно будет автоматически изменено на 1. Начиная с третьего параметра, это параметр, который необходимо передать в функцию обратного вызова. Функция возвращает объект таймера.
Использование такое же, как использование таймера в клиентском JavaScript.
2) функция setInterval и функция clearInterval

setInterval похож на setInterval в клиентском JavaScript, что означает, что функция обратного вызова выполняется каждый раз в указанное время. А clearInterval отменяет вызов callback-функции.
Синтаксис следующий:

setInterval(callback, ms, [arg], [...])

Значение параметра такое же, как и у setTimeout.
3) метод unref и метод ref

Как упоминалось ранее, метод setTimeout и метод setInterval возвращают объект таймера, а Node.js добавляет к двум объектам таймера методы unref и ref.

Эти два метода не существуют в клиентском JavaScript, так какой в ​​них смысл?

Проще говоря, метод unref используется для отмены выполнения callback-функции в методах setTimeout и setInterval, а ref-функция, наоборот, используется для возобновления вызова callback-функции.


Синтаксис следующий:
const timer = setInterval(callback, ms, [arg], [...]) // setTimeout、setInterval都定时器返回一个定时器对象

timer.unref() // 取消callback函数的执行

timer.ref() // 恢复callback函数的执行

Резюме метода unref и метода ref:

1) Методы unref() и ref() вызываются через объект, возвращаемый таймером, и монтируются в объекте таймера;
2) Методы unref() и ref() отменяют обратный вызов и восстанавливают обратный вызов только для отмены и восстановления функции обратного вызова в объекте таймера и не влияют на существование таймера.Чтобы очистить таймер, по-прежнему используйте clearInterval или очистить время ожидания.
3) Чрезмерное использование метода unref() отрицательно скажется на производительности программы, поэтому метод unref() вообще следует использовать с осторожностью (можно подумать, почему)
4) unref() и ref() позволяют нам контролировать, когда таймер выполняет обратный вызов и когда отменить обратный вызов в любом месте кода.

4) Глобальные методы и атрибуты, связанные с модулем требуют

Node.js следует стандарту common.js и использует метод require при введении модулей.
Синтаксис следующий:

const foo = require('../foo.js) // 接收一个字符串形式的路径名作为参数

Один и тот же модуль будет кешироваться в памяти после первой загрузки, после чего многократное обращение к одному и тому же модулю приведет к тому же самому модулю, что не приведет к многократному выполнению кода в модуле.
Здесь будет проблема: если модуль вводится в нескольких местах, то после первого введения он будет считываться непосредственно из памяти позже, поэтому, когда мы модифицируем содержимое модуля, код импортируемого модуля не будет обновляется, но каждый раз, когда я хочу использовать новейшее содержимое модуля, что мне делать?
Мы поговорим о решении позже в объяснении require.cache. Здесь мы представим require в первую очередь.
Если параметр, переданный в require, представляет собой неоднозначное имя файла, не содержащее тип файла, что происходит с выходными данными в это время?
const foo = require('foo') // 只传一个字符串形式名称,不指定文件类型

Параметр, переданный в require, представляет собой неоднозначное имя файла.Node.js не сообщает об ошибке напрямую, но имеет набор правил поиска, которые резюмируются следующим образом:

  1. Сначала загрузите файл, приоритет: .js > .json > .node
  2. Загрузить папку без файлов:
      *Сначала проверьте, есть ли файл package.json, и если да, загрузите файл, указанный атрибутом main в package.json.
      * Нет package.json, загрузите файл index.js в этот каталог
Расширение:

Front-end проект React, построенный с помощью cli-скаффолдинга, также опустил суффикс имени файла .js при представлении компонентов, но соответствующий файл все же можно найти.Принцип поиска такой же, как здесь.Заинтересованные партнеры могут изучить его. .

Используйте функцию require.resolve для запроса полного имени модуля.
В Node.js вы можете использовать функцию require.resolve для запроса полного абсолютного пути к файлу модуля. имя файла, код выглядит следующим образом:

require.resolve('./testModule.js');

При выполнении в REPL выходным результатом является абсолютный путь к диску, на котором находится модуль.
Использование этого метода для поиска пользовательских модулей выводит полный абсолютный путь имя файла, так что же произойдет, если вы используете этот метод во встроенном модуле? Ответ: прямое выходное имя

Уведомление:

Метод require.resolve() не будет импортировать модуль, не говоря уже о выполнении методов в модуле, а просто найдет полный абсолютный путь к модулю.

Используйте объект require.cache для просмотра кэшированных модулей.

Говоря о require, я упомянул, что один и тот же модуль будет кэшироваться в памяти после его первой загрузки, после чего при многократном обращении к одному и тому же модулю будет получен один и тот же модуль, что не приведет к многократному выполнению кода в модуль. Вы можете просмотреть список текущих кэшированных модулей через require.cache. Синтаксис следующий, введенный в REPL:

console.log(require.cache)

для просмотра всех кэшированных модулей. Если мы хотим просмотреть именованный модуль, мы можем использовать следующий синтаксис:

console.log(require.cache[require.resolve('./testModule.js')])

Проблема, оставшаяся с фронта: поскольку модуль будет кэшироваться после того, как он будет введен, измененный модуль не будет немедленно обновлен в импортированном файле.Как решить эту проблему?

Вот решение:

Если мы можем удалить кэшированный модуль, где нам нужен последний модуль, а затем повторно импортировать модуль, можем ли мы гарантировать, что импортированный модуль является последним?

Этот метод включает в себя две операции: удалить модуль, импортировать модуль, импортировать модуль с запросом, а затем удалить модуль?

К счастью, Node.js предоставляет ключевое слово delete для удаления кэшированных модулей. Синтаксис следующий:

const testModule1 =require( './testModule.js') // 初始引入模块,模块会被缓存在内存中

delete require.cache[require.resolve('./testModule.js')]  // 删除缓存中模块

const testModule2 = require( './testModule.js') // 再次重新加载模块

расширять:

В реальном проекте, когда требуется последний модуль, этот механизм может быть инкапсулирован в метод. Передавая параметр пути к модулю и вызывая метод в указанном месте, можно гарантировать использование последнего измененного модуля.

Глобальные переменные, связанные с модулями файловой системы

В Node.js определены две переменные, связанные с файловым модулем: одна — __filename, а другая — __dirname.

__filename используется для получения полного абсолютного имени файла текущего модуля. Синтаксис следующий:

console.log(__filename)

__dirname используется для получения полного абсолютного пути к каталогу, в котором находится текущий файл модуля. Синтаксис следующий:

console.log(__dirname)
Запутать:

Как упоминалось ранее, метод require.resolve() может получить полный абсолютный путь к каталогу, в котором находится текущий файл модуля, __filename здесь также может добиться того же эффекта, так в чем же между ними разница? Подытожено следующим образом

1) require.resolve() — это метод, смонтированный на требуемом объекте, а __filename — это глобальная переменная, одна из которых — метод, а другая — переменная с разными свойствами;
2) Когда используется require.resolve(), необходимо передавать параметры, а __filename не нужно передавать параметры, он напрямую представляет путь, одному нужно передавать параметры, другому не нужны параметры и методы использования разные;
3) require.resolve() может найти любой указанный модуль, потому что имя модуля может быть передано, а __filename представляет только абсолютный путь к текущему модулю.В этом отношении, очевидно, require.resolve() сильнее, чем __filename;
4) В реальных проектах путь обычно меняется на основе __filename, а затем переключается на другие пути к файлам, что более удобно и лаконично, чем require.resolve().

3. Соответствующие тестовые сайты интервью в этом разделе

1) Используете Node.js для разработки, какие методы отладки у вас есть?
2) Какая связь между REPL и консолью?
3) Как вы выбрали require.resolve() и __filename?
4) Какие проблемы принесет модульность интерфейса?
5) Если при введении модуля суффикс файла не указан, каковы правила поиска Node.js?

4. Резюме этого раздела

Основное содержание этого раздела — две вещи: консольный модуль и встроенные методы и переменные в глобальной области видимости.

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

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

Пять, следующее уведомление: механизм событий Node.js

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

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

В-шестых, конец статьи

Пишите только понятные, понятные и ценные технические статьи;

Прочитав его, вы почувствуете себя вознагражденным, поставьте лайк + подписаться, и платформа порекомендует вам более качественные тематические статьи;

Напоследок выложу серию статей «Изучаем Webpack с нуля», если вам тоже интересно, то прошу обратить внимание на чтение.