Могу ли я получить узел --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), но предложил бы одно из следующего:
- откройте запрос функции здесь https://github.com/nodejs/node/issues
- реализовать функцию самостоятельно и отправить пиар
- использовать 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.
Однако теперь мой взлом точки останова больше не работает, так как вы больше не можете открывать несколько окон. К сожалению, они не устранили проблему исчезающих точек останова. Так что теперь я вернулся к закрытию и повторному открытию каждый раз... Это очень раздражает, так как он даже не запоминает положение своего окна (мне нравится перемещать его, чтобы отличить его от внешнего окна отладки JS, которое я используйте одновременно полный стек...), а также тот факт, что я уже закрыл все эти вкладки исходного файла (я перестану разглагольствовать сейчас).
Это невозможно по нескольким причинам.
- Запуск Chrome (или другого "настольного" приложения) зависит от платформы. Core Node не может этого сделать, и это добавило бы ненужную сложность (например, подумайте об обнаружении места установки, работе с неустановленным Chrome и т.д.).
- Это привязало бы Node к Chrome, что нежелательно.
- 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