【问题标题】:How to debug angular2 typescript files如何调试 angular2 typescript 文件
【发布时间】:2017-01-14 15:49:53
【问题描述】:

似乎使用最新的 angular2 npm 包无法调试打字稿源。现有的 answer on stackoverflowthe article on medium 已过时。我创建了a github issue,请支持。

有两个问题:

1) TypeScript 源不再被硬编码为源映射中的数据 URI,而是实际上指向 npm 中一些不存在的位置(它实际上是 angular git hub 源中的一个位置,但不是 npm 包中的某个位置):

{
   "version":3,
   "file":"application_ref.js",
   "sourceRoot":"",
   "sources":["../../../../modules/@angular/core/src/application_ref.ts"] <-------

我发现这条路径没有相关性,因为角度源是使用--inlineSources 选项编译的,因此*.map 文件包含sourcesContent 键,其中包含原始内容。所以这不再是问题了。但第二个问题仍然存在。

2) 即使我只是从 github 源中复制 modules 文件夹,还有第二个问题,即 npm 包中的 js 文件被编译成 es6 模块语法,浏览器尚不支持像 SystemJS 这样的加载器需要 traceur。例如common/index.j:

export { NgLocalization, CommonModule, NgClass, NgFor, NgIf, NgPlural, NgPluralCase, NgStyle, NgSwitch, NgSwitchCase, NgSwitchDefault, NgTemplateOutlet, AsyncPipe, DatePipe, I18nPluralPipe, I18nSelectPipe, JsonPipe, LowerCasePipe, CurrencyPipe, DecimalPipe, PercentPipe, SlicePipe, UpperCasePipe, VERSION, Version, PlatformLocation, LocationStrategy, APP_BASE_HREF, HashLocationStrategy, PathLocationStrategy, Location } from './src/common';

但我不能使用traceur,因为它很可能会破坏为js 文件创建的现有源映射,这些文件由tsc 转译。

【问题讨论】:

  • 说调试 JS 对于大多数情况来说“足够好”。你想看这个吗? i.stack.imgur.com/ZWg0g.gif 可以在 angular2 的最新版本中实现。但是你有很棒的 es-2015 源代码
  • @yurzui,谢谢,是的,我想调试 ts 文件。我需要什么最新版本?我正在使用来自 npm 的最新版本

标签: angular typescript


【解决方案1】:

UPD 我打开了issue,要求在 Angular CLI 中启用源映射支持。它还讨论了如何在今天启用源映射支持。为框架启用源映射基本上将允许调试 TypeScript 源。

Angular CLI 从使用 System.js 切换到 Webpack,我个人不喜欢 System.js,所以这里没有对 System.js 的回答。

您不能针对框架本身的 TypeScript 源进行调试,因为源映射是为编译后的 JavaScript 而不是 TypeScript 生成的。另一方面,生成的代码易于阅读,并且足以用于调试目的。好消息是您自己的代码将源映射到原始 TypeScript 源。

而且我认为没有一种简单的方法可以针对 TypeScript 源获取 Angular 的源映射,除非它们与框架一起构建。所以你现在能得到的最好的就是调试编译好的 JS。

现在开始练习。使用 Angular CLI 创建新应用:

$ ng new my-app

在某处添加断点:

// src/app/app.component.ts
export class AppComponent {
  title = 'app works!';

  constructor() {
    debugger;
  }
}

启动开发服务器:

$ ng serve

然后在浏览器中打开以下 URL:http://localhost:4200/。观察它在断点处停止并转到堆栈中的一些框架调用。

【讨论】:

  • 首先,只是对您的态度的简短通知...... - 这应该是一个评论,因为它不是答案的一部分。其次,我没有要求任何东西,我只是说 Jan Nahody 提供的答案和你的答案一样没有帮助。该问题清楚地说明了如何调试ts 源,而您正在展示如何调试js 源。
  • @Maximus 它指出,目前不可能,除非您使用正确的源映射自己重建框架,例如从 GitHub 获取源,使用 tsc 编译它们并启用源映射并替换原始 NPM 包的内容。并指出调试 JS 在大多数情况下“足够好”。但我不会再争论了。保重。
【解决方案2】:

最新的 Angular 2 使用 Webpack 代替 SystemJS。 两个系统的工作方式不同。

SystemJS 在需要时加载源。还将打字稿转换为浏览器内的 JS。 Webpack 首先从源代码构建应用程序。那更快。所有的工作都不能由您的浏览器完成。

当在这里尝试调试像 angular 这样的库时,你必须给 Webpack 一个提示。意味着你必须配置你的 webpack 文件。

不确定Angular CLI 是否支持开箱即用。另请查看Webpack 以获取调试选项。

对不起,我帮不上忙。

【讨论】:

  • angular-cli 是基于 webpack 构建的,它也没有 ts
  • 没错。 Angular 现在停止使用 systemJS 并使用 Webpack。构建和运行您的应用程序的方式是不同的。在您的浏览器完成所有工作之前。加载文件并将 ts 转换为 JS。现在所有这些工作都由系统上的 Webpack 完成。浏览器加载准备好的“创建”应用程序源。所以实现源映射的方式发生了变化。
  • 这里是Angular2如何使用/配置Webpack的官方手册。 (angular.io/docs/ts/latest/guide/webpack.html) 这是一个简单但可行的例子。
  • 谢谢,你试过自己用cli调试ts源码吗?
  • 抱歉还没有。直到现在还没有必要。但我知道您可以激活创建源映射文件。看看这里:webpack.github.io/docs/configuration.html(调试选项过滤器)。
猜你喜欢
  • 2017-03-08
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多