Могу ли я получить узел --inspect для автоматического открытия Chrome

В новых версиях узла встроен инспектор узлов, который можно запустить с помощью команды node --inspect index.js, Однако это всегда обеспечивает командную строку адресом, который вы должны вставить в адресную строку. Я знаю, что это может быть не самым "безопасным", но есть ли способ устранить этот шаг копирования и вставки?

8 ответов

Решение

В Chrome 60+ есть пункт "Открыть выделенный DevTools для Node" в chrome://inspect/#devices url, (а также значок node.js в devtools во время работы узла) Открытое окно проверки будет подключаться к node.js, как только он запускается или перезапускается, поэтому нет необходимости каждый раз открывать его вручную.

Я искал ответ на ту же проблему и обнаружил два хороших инструмента:

NIM кажется более продвинутым, он может автоматически обнаруживать экземпляры узлов, что очень хорошо работает с моими текущими настройками. я использую nodemon автоматически перезапускать сервер узла при каждом изменении файла. Более того, я настраиваю Webpack с HMR (перезагрузка горячего модуля), и у меня есть полный охват /public а также /server папки. Мне потребовалось 2 недели, чтобы научиться настраивать, но теперь это начинает окупаться.

npm install -g nodemon
npm install -g ts-node // In case you use typescript

nodemon.json

{
    "verbose": false,
    "watch": ["server/**/*.ts"],
    "ext": "ts js json",
    "ignore": ["server/**/*.spec.ts"],
    "exec": "set DEBUG=app:*,-not_this & ts-node --inspect --debug-brk server/main.ts"
}

set DEBUG=app:*,-not_this используется для включения вывода из отладки Visionmedia

(!) В настоящее время существует проблема с debug() не печатать текст в Chrome Inspector, однако на данный момент хотя бы текст виден в командной строке. Я использую командную строку, чтобы увидеть операторы отладки и инспектор для расширения объектов.

редактировать

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

Еще одна проблема, с которой я столкнулся в последнее время, заключается в том, что NIM неправильно подключался В конце концов я понял, что мне нужно ввести фактический IP-адрес 127.0.0.1 в панели конфигурации NIM вместо localhost

debugOff это просто импровизированный способ временно закрыть логи, пока они мне снова не понадобятся.

// Debug
let debugOff = (...any: any[]) => { }, debug = require('debug')('vs:ServerApp');

// Workaround for debug working with node inspector in chrome
let Debug = require('debug');
Debug.log = console.log.bind(console);


/** 
 * Listen for incoming requests
 */
public listen(): void {
    debug('Start server');
    debugOff('Server port:', SERVER.port); // This would be usually too verbose

Для этого существует отдельная утилита, которая называется inspect-process, но встроенной поддержки нет.

Насколько я могу видеть, код (C++), который запускает инспектор и выводит это сообщение отладки, находится здесь:

https://github.com/nodejs/node/blob/master/src/inspector_socket_server.cc

В частности, функции, InspectorSocketServer::Start, PrintDebuggerReadyMessage

Я не вижу никакой функции для автоматического открытия браузера в этом коде (на момент написания v7.4), но предложил бы одно из следующего:

  1. откройте запрос функции здесь https://github.com/nodejs/node/issues
  2. реализовать функцию самостоятельно и отправить пиар
  3. использовать inspect-process

Да!! Используйте плагин Node.js V8 --inspector Manager (NiM) Chrome, он автоматически открывает Chrome при запуске node --inspect-brk app

На заметку - отладка с помощью Visual Studio Code стала легкой задачей

Для пользователей OSX установите удивительный Chrome-Cli с brew install chrome-cli,

Поместите это в свой ~/.bashrc:

node-inspect() {
  local TAB_ID=`chrome-cli open 'chrome://inspect/#devices' -n | head -n 1 | awk '{ print $2 }'`
  sleep 0.5
  chrome-cli execute "document.getElementById('node-frontend').click()" -t $TAB_ID && chrome-cli close -t $TAB_ID
  node --inspect-brk $@
}

Теперь вы можете сделать: node-inspect ./server --foo --bar

Теперь в современном Chrome (у меня есть v64, я не знаю о более низких версиях), набрав

chrome.send('open-node-frontend')

в консоли chrome откройте окно, которое автоматически подключается к процессу nodejs
(также доступно через chrome://inspect )

Вы также можете запускать и закрывать инспектор программно
(см. документ https://nodejs.org/dist/latest/docs/api/inspector.html).

Или используя kill -USR1 $PID где $PID Ваш процесс узла PID
(но я не знаю, как это остановить, и невозможно указать хост и порт, он будет использовать localhost:9229 )

Хотя это не дает конкретного ответа на вопрос, это делает вопрос менее актуальным - после подключения вам не нужно повторно подключаться.

Я перепробовал все предложения здесь и другие посты, например, но я обнаружил, что отладка во вкладке никогда не будет переподключаться после того, как наблюдение супервизора сгенерирует новый GUID - адрес на вкладке устарел.

Однако я нашел новую ссылку в стандартной панели разработчика Chrome (58), которая открывает новое "безголовое" окно, которое магическим образом восстанавливается независимо от того, как приложение перестраивается / перезапускается.

Под Threads > Main вы должны увидеть "Доступен экземпляр узла. Connect". введите описание изображения здесь

Я считаю, что новое окно менее пригодно для использования, так как я предпочел бы вкладку, но автоматическое переподключение настолько надежно, что я буду жить с этим!

Единственный недостаток, который я обнаружил, - когда он подключается заново, он очищает все точки останова.

ОБНОВЛЕНИЕ: я нашел, что можно обойти проблему исчезновения точек останова при перезагрузке, если вы откроете несколько окон отладки, используя ссылку "Подключиться" в Chrome Debug > Sources > Threads > Main. Большинство из них будут пустыми и в них даже не будет перечислено ни одного источника, но тот, который правильно подключен, в конечном итоге сохранит свои закладки. Я не знаю, почему этот хак работает - я обнаружил это по ошибке.

Также в этой статье Hackernoon обсуждается проблема, и в качестве решения рекомендуется инструмент NIM, а также общее улучшение управления инспектором (также предложено в ответе Адрианом Моисой).

Обновление (08/2017)

Похоже, что Chrome v60 изменил DevTools для Node, переместив ссылку, которую я описал, в маленькую зеленую иконку в верхней левой навигационной панели инструментов JS dev. Значок узла Devtool

Однако теперь мой взлом точки останова больше не работает, так как вы больше не можете открывать несколько окон. К сожалению, они не устранили проблему исчезающих точек останова. Так что теперь я вернулся к закрытию и повторному открытию каждый раз... Это очень раздражает, так как он даже не запоминает положение своего окна (мне нравится перемещать его, чтобы отличить его от внешнего окна отладки JS, которое я используйте одновременно полный стек...), а также тот факт, что я уже закрыл все эти вкладки исходного файла (я перестану разглагольствовать сейчас).

Это невозможно по нескольким причинам.

  1. Запуск Chrome (или другого "настольного" приложения) зависит от платформы. Core Node не может этого сделать, и это добавило бы ненужную сложность (например, подумайте об обнаружении места установки, работе с неустановленным Chrome и т.д.).
  2. Это привязало бы Node к Chrome, что нежелательно.
  3. Chrome не позволяет передавать URL-адрес devtools из командной строки.
npm install express
npm install esm
npm install open
npm install --save-dev node-key-sender

package.json

{
  "name": "open-browser",
  "version": "1.0.0",
  "description": "browser",
  "main": "server.js",
  "type": "module",
  "scripts": {
    "esm": "node -r esm server.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1",
    "esm": "^3.2.25",
    "open": "^7.0.0",
  },
  "devDependencies": {
    "node-key-sender": "^1.0.11"
  }
}

server.js

import express from 'express'
import http from 'http'
import open from 'open'
import keysender from 'node-key-sender'

const webApp = express()
const webServer = http.createServer(webApp)

webServer.listen(3000, function(){
  console.log('> Server listening on port:',3000)
  open('http://localhost:3000')
  keysender.sendCombination(['control', 'shift', 'i'])
})

браузер должен быть уже открыт, затем запустите

node -r esm server.js
Другие вопросы по тегам