我使用NTVS在Visual Studio(2012专业版和2013社区版)中创建了一个Node JS项目,并使用Yeoman生成器创建Knockout SPA app(使用中的typescript选项)发电机设置)。
现在我需要在调试时决定将哪个文件设置为启动文件(点击F5)。我想这将是./src/app/require.config.js,因为否则我会收到一个未定义的错误。
当我开始调试时,一切看起来都很好,并出现一个控制台窗口,其中显示消息" Debugger正在侦听端口5858"。但是当我启动localhost:5858时,没有服务器/网站。
我可以在另一个端口的服务器上启动应用程序但是没有命中断点,甚至在启动文件中也没有。
所以我的问题是: - 我应该将什么设置为启动文件? - 如何使用NTVS在Visual Studio中调试我的应用程序?
修改
我确定当我添加一个新的空NTVS项目时,它会创建一个server.js文件:
var http = require('http');
var port = process.env.port || 1337;
http.createServer(function (req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello World\n');
}).listen(port);
将其设置为启动文件会导致此文件的工作调试。
我怎样才能通过require.config.js加载require并使用startup.ts启动我的应用程序?
require.config.js
// require.js looks for the following global when initializing
var require = {
baseUrl: ".",
paths: {
"bootstrap": "bower_modules/components-bootstrap/js/bootstrap.min",
"crossroads": "bower_modules/crossroads/dist/crossroads.min",
"hasher": "bower_modules/hasher/dist/js/hasher.min",
"jquery": "bower_modules/jquery/dist/jquery",
"knockout": "bower_modules/knockout/dist/knockout",
"knockout-projections": "bower_modules/knockout-projections/dist/knockout-projections",
"signals": "bower_modules/js-signals/dist/signals.min",
"text": "bower_modules/requirejs-text/text"
},
shim: {
"bootstrap": { deps: ["jquery"] }
}
};
startup.ts
import $ = require("jquery");
import ko = require("knockout");
import bootstrap = require("bootstrap");
import router = require("./router");
// Components can be packaged as AMD modules, such as the following:
ko.components.register('nav-bar', { require: 'components/nav-bar/nav-bar' });
ko.components.register('home-page', { require: 'components/home-page/home' });
// ... or for template-only components, you can just point to a .html file directly:
ko.components.register('about-page', {
template: { require: 'text!components/about-page/about.html' }
});
ko.components.register('grid-page', { require: 'components/grid-page/grid-page' });
// [Scaffolded component registrations will be inserted here. To retain this feature, don't remove this comment.]
// Start the application
ko.applyBindings({ route: router.currentRoute });
修改2
经过进一步调查,我可以使用server.js文件作为包含
的启动文件启动我的应用程序var http = require('http');
var app = require('./src/app/startup.js');
var port = process.env.port || 1337;
http.createServer(app).listen(port);
但这会导致'定义未定义'错误。
答案 0 :(得分:2)
我认为你正在混淆服务器开发和浏览器开发。 nodejs项目旨在作为您计算机上的进程运行,并且可以充当许多其他事物中的Web服务器。您所指的淘汰SPA应用程序旨在在浏览器环境中运行。只有Yeoman生成器和一些te工具设置为淘汰模板(例如gulp)的构建过程的一部分需要nodejs,但这只在构建时需要,而不是在运行自己的代码时。
当您想在浏览器中调试javascript时,您需要找到主index.html文件并在浏览器中打开它 - 某些IDE具有在内置服务器上打开页面并直接调试它们的功能(webstorm)例如),其他人可能会要求您在浏览器中打开页面并附加一个javascript调试器。在Visual Studio中,您可能应该在Internet Explorer中打开它并在VS中的js代码中放置断点,我不确定您是否也可以直接从VS打开页面并且如果您需要调整IE设置(请参阅Google ,它比我知道的更好)
答案 1 :(得分:1)
好的,经过一番研究后,我认为你要做的事情是错误的。
您正在尝试将jquery加载到节点环境中。 Node是一个无浏览器的执行环境。没有窗户。没有文件。来自jquery文件顶部的注释:
// For CommonJS and CommonJS-like environments where a proper `window`
// is present, execute the factory and get jQuery.
// For environments that do not have a `window` with a `document`
// (such as Node.js), expose a factory as module.exports.
// This accentuates the need for the creation of a real `window`.
// e.g. var jQuery = require("jquery")(window);
// See ticket #14549 for more info.
我相信您要做的是将服务器中的html返回给浏览器。该HTML应引用jquery,bootstrap和knockout - 用于文档的客户端javascript文件 - 通过脚本标记。
另请注意:由于jquery和其他人在浏览器中运行,您将无法使用visual studio对其进行调试(据我所知)。您应该使用浏览器工具来检查它们的行为。