7

我使用 NTVS 在 Visual Studio(2012 专业版和 2013 社区)中创建了一个 Node JS 项目,使用Yeoman生成器创建了一个Knockout SPA 应用程序(使用生成器设置中的 typescript 选项)。

现在我需要决定调试时(按 F5)将哪个文件设置为启动文件。我想这将是 ./src/app/require.config.js 因为否则我会收到一个错误,要求未定义。

当我开始调试时,一切看起来都很好,并且会出现一个控制台窗口,并显示消息“调试器正在侦听端口 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 启动我的应用程序?

需要.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"] }
    }
};

启动.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);

但这会导致“未定义定义”错误。

4

2 回答 2

2

我认为您正在混淆服务器开发和浏览器开发。nodejs 项目旨在作为您机器上的一个进程运行,并且可以充当许多其他事物中的网络服务器。您所指的淘汰赛 SPA 应用程序旨在在浏览器环境中运行。只有 Yeoman 生成器和一些设置为淘汰模板(例如 gulp)的构建过程的一部分的 te 工具需要 nodejs,但这仅在构建时需要,而不是在运行您自己的代码时。

当您想在浏览器中调试 javascript 时,您需要找到您的主 index.html 文件并在浏览器中打开该文件 - 一些 IDE 具有在内置服务器上打开页面并直接调试它们的功能(例如 webstorm) ,其他人可能会要求您在浏览器中打开页面并附加 javascript 调试器。在Visual Studio中,您可能应该在Internet Explorer中打开它并在VS中的js代码中放置一个断点,我不确定您是否也可以直接从VS打开页面以及是否需要调整IE设置(问google,它比我清楚)

于 2015-06-24T19:23:21.737 回答
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 调试它们(据我所知)。您应该改为使用浏览器工具来检查它们的行为。

https://stackoverflow.com/a/21178111/8155

于 2015-06-22T19:42:29.407 回答