В Node.js есть множество опций интерфейса командной строки, позволяющих отображать встроенную отладку и изменять работу движка JavaScript V8.

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

Доступ к параметрам интерфейса командной строки Node.js

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

$ man node
Usage: node [options] [ -e script | script.js ] [arguments]
       node debug script.js [arguments]
Options: 
 -v, --version    print Node.js version 
 -e, --eval       script evaluate script 
 -p, --print      evaluate script and print result 
 -c, --check      syntax check script without executing 
...

Как вы можете видеть в первом разделе использования, вы должны указать дополнительные параметры перед сценарием, который хотите запустить.

Возьмите следующий файл:

console.log(new Buffer(100))

Чтобы воспользоваться опцией --zero-fill-buffers, вы должны запустить приложение, используя:

$ node --zero-fill-buffers index.js

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

<Buffer 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ... >

Параметры интерфейса командной строки

Теперь, когда мы увидели, как вы указываете Node.js использовать параметры интерфейса командной строки, давайте посмотрим, какие еще параметры существуют!

--version or -v

Используя node --version, или сокращенно node -v, вы можете распечатать версию Node.js, которую вы используете.

$ node -v v6.10.0

--eval or -e

Используя параметр --eval, вы можете запускать код JavaScript прямо из вашего терминала. Модули, которые предопределены в REPL, также можно использовать, не требуя их, например модуль http или fs.

$ node -e 'console.log(3 + 2)' 
5

--print or -p

Параметр --print работает так же, как --eval, но выводит результат выражения. Чтобы добиться того же результата, что и в предыдущем примере, мы можем просто оставить console.log:

$ node -p '3 + 2' 5

--check or -c

Доступно, начиная с версии 4.2.0

Параметр --check указывает Node.js проверять синтаксис предоставленного файла, не выполняя его.

Снова возьмем следующий пример:

console.log(new Buffer(100)

Как видите, закрывающая ) отсутствует. Как только вы запустите этот файл с помощью node index.js, он выдаст следующий результат:

/Users/gergelyke/Development/risingstack/mastering-nodejs-cli/index.js:1
(function (exports, require, module, __filename, __dirname) { console.log(new Buffer(100)
^ 
SyntaxError: missing ) after argument list
 at Object.exports.runInThisContext (vm.js:76:16)
 at Module._compile (module.js:542:28)
 at Object.Module._extensions..js (module.js:579:10)
 at Module.load (module.js:487:32)
 at tryModuleLoad (module.js:446:12)
 at Function.Module._load (module.js:438:3)
 at Module.runMain (module.js:604:10)
 at run (bootstrap_node.js:394:7)

Используя опцию --check, вы можете проверить ту же проблему, не выполняя скрипт, используя node --check index.js. Результат будет аналогичным, за исключением того, что вы не получите трассировку стека, поскольку скрипт никогда не запускался:

/Users/gergelyke/Development/risingstack/mastering-nodejs-cli/index.js:1
(function (exports, require, module, __filename, __dirname) { console.log(new Buffer(100) 
^ 
SyntaxError: missing ) after argument list
 at startup (bootstrap_node.js:144:11)
 at bootstrap_node.js:509:3

Параметр --check может пригодиться, если вы хотите проверить синтаксически верный сценарий, не выполняя его.

--inspect[=host:port]

Доступно с v6.3.0

Использование node --inspect активирует инспектор на указанном хосте и порту. Если они не указаны, по умолчанию используется 127.0.0.1:9229. Инструменты отладки, прикрепленные к экземплярам Node.js, обмениваются данными через TCP-порт с использованием протокола отладки Chrome.

--inspect-brk[=host:port]

Доступно с версии 7.6.0

--inspect-brk имеет те же функции, что и параметр --inspect, но приостанавливает выполнение на первой строке пользовательского сценария.

$ node --inspect-brk index.js 
Debugger listening on port 9229.
Warning: This is an experimental feature and could change at any time.
To start debugging, open the following URL in Chrome: 
chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/86dd44ef-c865-479e-be4d-806d622a4813

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

--zero-fill-buffers

Доступно с версии 6.0.0

Node.js можно запустить с помощью параметра командной строки --zero-fill-buffers, чтобы принудительно обнулить все вновь выделенные экземпляры Buffer при создании. Причина в том, что недавно выделенные Buffer экземпляры могут содержать конфиденциальные данные.

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

Также обратите внимание, что некоторые конструкторы буферов устарели в v6.0.0:

  • new Buffer(array)
  • new Buffer(arrayBuffer[, byteOffset [, length]])
  • new Buffer(buffer)
  • new Buffer(size)
  • new Buffer(string[, encoding])

Вместо этого следует использовать Buffer.alloc(size[, fill[, encoding]]), Buffer.from(array), Buffer.from(buffer), Buffer.from(arrayBuffer[, byteOffset[, length]]) и Buffer.from(string[, encoding]).

Вы можете узнать больше о последствиях для безопасности модуля Buffer в Синхронизирующем блоге.

--prof-process

Используя --prof-process, процесс Node.js будет выводить выходные данные профилировщика v8.

Чтобы использовать его, сначала вы должны запустить свои приложения, используя:

node --prof index.js

После его запуска в ваш рабочий каталог будет помещен новый файл с префиксом isolate-.

Затем вам нужно запустить процесс Node.js с параметром --prof-process:

node --prof-process isolate-0x102001600-v8.log > output.txt

Этот файл будет содержать метрики из профилировщика V8, например, сколько времени было потрачено на слой C ++ или в части JavaScript, и сколько времени потребовалось для вызовов функций. Что-то вроде этого:

To get a full list of Node.js CLI options, check out the official documentation here.

Параметры V8

Вы можете распечатать все доступные параметры V8, используя параметр командной строки --v8-options.

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

--harmony

С флагом гармонии вы можете включить все завершенные функции гармонии.

--max_old_space_size

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

Этот параметр может пригодиться при работе в средах с нехваткой памяти.

--optimize_for_size

С помощью этой опции вы можете указать V8 оптимизировать пространство памяти под размер - даже если приложение становится медленнее.

Как и предыдущий вариант, он может быть полезен в средах с низким объемом памяти.

Переменные среды

NODE_DEBUG=module[,…]

Установка этой переменной среды позволяет основным модулям печатать отладочную информацию. Вы можете запустить предыдущий пример таким образом, чтобы получить отладочную информацию о module основном компоненте (вместо модуля вы можете использовать http, fs и т. Д. ...):

$ NODE_DEBUG=module node index.js

Результат будет примерно таким:

MODULE 7595: looking for "/Users/gergelyke/Development/risingstack/mastering-nodejs-cli/index.js" in ["/Users/gergelyke/.node_modules","/Users/gergelyke/.node_libraries","/Users/gergelyke/.nvm/versions/node/v6.10.0/lib/node"] 
MODULE 7595: load "/Users/gergelyke/Development/risingstack/mastering-nodejs-cli/index.js" for module "."

NODE_PATH=path

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

OPENSSL_CONF=file

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

Полный список поддерживаемых переменных среды см. в официальной документации по Node.js.

Как видите, CLI - действительно полезный инструмент, который становится лучше с каждой версией Node!

Если вы хотите внести свой вклад в его развитие, вы можете помочь, проверив открытые в настоящее время вопросы на странице https://github.com/nodejs/node/labels/cli!

Первоначально опубликовано на blog.risingstack.com 11 апреля 2017 г.