Я уже писал в блоге о проекте Theseus , способе отладки клиентского и серверного JavaScript, но я так и не удосужился протестировать его. Сегодня в блоге Brackets обсуждалась последняя версия 0.4 и как она работает в Brackets. Я столкнулся с несколькими проблемами (часть моего недоразумения и часть простых проблем), поэтому я решил поделиться некоторыми советами и примерами того, как работает Тесей. Я благодарю Томаса Либера и Джоэла Брандта за помощь!
В двух словах, Тесей может помочь вам увидеть, какие методы вызываются, какие аргументы передаются им, и проверять трассировки стека для вашего кода. Это поддерживается для «обычного» кода на стороне клиента, Node.js на сервере и обоих вместе.
Давайте рассмотрим простой пример, приложение на стороне клиента. Если вы посмотрите видео в записи блога, на которую я ссылался выше, вы заметите, что рассказчик говорит, что он «включает Тесея», и все просто работает. Я не совсем понял это. Я установил расширение Theseus (помните, что вы можете сделать это очень легко с помощью диспетчера расширений Brackets), но единственное меню, которое я заметил, было Debug / Debug Brackets with Theseus. Меня не интересовали отладки скобок, просто мой обычный код.
Оказывается, это было в меню Файл и уже включено:
Итак, учитывая простую HTML-страницу (и да, Тесей будет работать с JavaScript, встроенным в HTML-страницу, что приятно!), Вы можете щелкнуть значок Live Development, и вам будет хорошо идти.
Рассмотрим следующий код. Это простой пример элемента управления HTML5 Datalist, привязанного к данным на стороне сервера ( запись в блоге ).
<!doctype html>
<html>
<head>
<title>Example 2</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script>
$(document).ready(function() {
if(document.createElement("datalist").options) {
$("#search").on("input", function(e) {
var val = $(this).val();
if(val === "") return;
//You could use this to limit results
//if(val.length < 3) return;
console.log(val);
$.get("artservice.cfc?method=getart&returnformat=json", {term:val}, function(res) {
console.log('got stuff');
alert('hi');
var dataList = $("#searchresults");
dataList.empty();
if(res.DATA.length) {
for(var i=0, len=res.DATA.length; i<len; i++) {
var opt = $("<option></option>").attr("value", res.DATA[i][0]);
dataList.append(opt);
}
}
},"json");
});
}
})
</script>
</head>
<body>
<p>
<input type="text" name="search" id="search" placeholder="Type Something" list="searchresults" autocomplete="off">
<datalist id="searchresults"></datalist>
</p>
</body>
</html>
Подключив Brackets к моему браузеру и немного набрав, я сразу вижу, как Тесей работает!
Но смотри … это сломано. Об этом сообщает документ. Сообщается о входных звонках. Но мои Ajax-звонки не стреляют. WTF. Глупое программное обеспечение с открытым исходным кодом.
Тогда мне пришло в голову … подождите … это событие Ajax запускается правильно? Оказывается, мой сервер приложений был мертв. Обратите внимание, что в моем коде jQuery нет обработчика ошибок? Да, это был тест. Если вы заметили это, вы прошли. Я переписал свой код:
$.get("artservice.cfc?method=getart&returnformat=json", {term:val}, function(res) {
console.log('got stuff');
var dataList = $("#searchresults");
dataList.empty();
if(res.DATA.length) {
for(var i=0, len=res.DATA.length; i<len; i++) {
var opt = $("<option></option>").attr("value", res.DATA[i][0]);
dataList.append(opt);
}
}
},"json").done(function() {
console.log("done");
}).fail(function(e) {
console.log("freaking fail");
});
А теперь проверь это …
Итак, моя следующая проблема заключалась в том, как использовать это с Node. Хотя это задокументировано на странице Theseus GitHub, если вы только что прочитали блог Bracket, вы можете пропустить это. Вам необходимо установить node-theseus через NPM, а затем запустить приложение в командной строке с помощью node-theseus. Затем вы можете столкнуться с этой ошибкой:
[node-theseus] caught uncaught exception
Error: listen EADDRINUSE
at errnoException (net.js:901:11)
at Server._listen2 (net.js:1039:14)
at listen (net.js:1061:10)
at Server.listen (net.js:1127:5)
at Object.exports.listen (/usr/local/lib/node_modules/node-theseus/node_modules/websocket.io/lib/websocket.io.js:62:10)
at Object.exports.listen (/usr/local/lib/node_modules/node-theseus/node-theseus.js:88:14)
at Object. (/usr/local/lib/node_modules/node-theseus/bin/node-theseus:92:14)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
[node-theseus] caught process.exit(), not exiting
Express server listening on port 3000
Заметили ошибку EADDRINUSE? Это не имело смысла для меня, так как Экспресс запустился, и мое приложение было доступно. Оказалось, что Тесей использовал порт 8888 в фоновом режиме, и этот порт использовался чем-то другим на моей машине. Убийство, которое исправило все.
На этом этапе вы все еще хотите подключить Brackets к Chrome — вы можете забыть об этом. И вы можете — я все еще копаюсь в этом — нужно переключить опцию «прокси» в меню «Файл скобок», как показано выше. Но это должно работать отлично. Одна вещь, которая сбила меня с толку на секунду, заключалась в следующем: у меня есть это в моем app.js:
app.get (‘/’, rout.index);
app.get (‘/ data’, rout.data);
Я заметил, что Тесей этого не заметил. Оказывается, это было замечено в файле rout.index.js, что имеет смысл. Вот где настоящий код. Вот снимок экрана из этого файла:
Вот и ты. В общем, чертовски увлекательно. Я определенно рекомендую проверить это, и если у вас возникли проблемы, как у меня, воспользуйтесь theusus Discuss Google Group для помощи.



