В 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 г.