关于前端:在生产环境中调试-Angular-应用程序而不显示源映射

25次阅读

共计 3097 个字符,预计需要花费 8 分钟才能阅读完成。

当咱们的 [Angular](https://medium.com/angular-in…
) 应用程序部署到生产环境时,咱们常常会遇到与咱们在开发过程中编辑的不同的代码。咱们的代码在构建过程中会以各种形式进行批改和优化。

TypeScript 被 transpiled, minified 和 uglifed。生成的 JavaScript 包尽可能小,并且可能在浏览器中运行。

所有这些概念都很棒,因为它们进步了咱们应用程序的性能。然而,这也给生产零碎的故障排查带来了一些艰难。

SourceMap 是一个解决方案。

从实质上讲,源映射是一个 JSON 文件,其中蕴含将转译后的代码映射回原始源所需的所有信息。很酷!
从技术上讲,源映射只是一个蕴含以下字段的 JSON 文件:

  • version : 示意源映射标准版本
  • file : 此源映射所属的转译文件的名称
  • sourceRoot : basePath — 源绝对于这里
  • sources : 原始源文件的门路(例如 TypeScript 文件)
  • sourcesContent : 可选属性,能够蕴含您的整个源代码。当源代码在此属性中内联时,无需托管源代码即可检索。
  • names:代码中找到的办法或变量名称
  • mappings:这是整个魔术产生的中央。从技术上讲,映射属性是一个十分大的字符串,其中蕴含 Base64 VLQ(可变长度数量)值。这些值有助于找到源文件中的原始地位。

如何检索源映射?

要检索源映射,咱们须要通知浏览器它们所在的地位。咱们能够通过增加以下行在文件开端指定
sourceMappingURL:

例子:

//# sourceMappingURL=pathToSourceMaps

有了这些信息,浏览器就能够下载源映射文件并解释其内容以创立映射。

留神:浏览器仅在开发者工具关上时下载源地图。对于普通用户,没有性能影响。

除了在文件开端增加正文之外,您还能够 SourceMap 在获取 minified 的 JavaScript 文件的响应中将门路作为 HTTP 标头的值发送。

SourceMap: pathToSourceMap

第二种可能性使您能够在服务器端切换源映射,而无需更改 minified 之后的 JavaScript 文件。

开发和生产期间的源映射

开发和生产版本不同。

在开发过程中,领有残缺的源图是有意义的,因为咱们专一于工具、开发教训或 hot module 替换。

另一方面,在生产中,咱们专一于性能——应用 small bundles 疾速初始加载。

应该在生产过程中启用源映射吗?

这个问题的答案很大水平上取决于您的我的项目。如果您正在从事开源我的项目,那么必定是这样。

然而咱们大多数人在日常工作中并不从事开源我的项目。在企业我的项目中,您有充沛的理由不想公开您的源代码。

  • 咱们不想裸露易于浏览的利用程序代码给外界。
  • 更快的构建
  • 不想裸露 source map 的提供源头

上面介绍如何在生产环境启用 Source Map,然而不裸露其起源。

Angular CLI 容许咱们配置是否须要源映射。而后它将这些信息传递给底层的 Webpack。

要摸索 Angular 中的源映射,让咱们从一个由 Angular CLI 生成的全新 Angular 我的项目开始。

ng new sourceMapInspector

Component 实现很简略:

public changeTitle(): void {this.title = 'awesome app';}

模板里的生产代码:

<button (click)="changeTitle()">Change title</button>

应用 ng serve 命令。

源映射帮忙咱们在开发工具中显示咱们的原始源。

咱们当初能够关上 app.component.ts 并在 changeTitle 函数内搁置一个断点。通过单击“更改题目”按钮,咱们而后点击了咱们的断点。

如果咱们查看 main.js 文件的最初一行,咱们能够看到浏览器获取源映射的地位。

//# sourceMappingURL=main.js.map
这对开发十分有用。咱们有残缺的源映射,能够轻松调试咱们的代码。

让咱们检查一下 Angular 中的生产构建在源映射方面的行为。咱们能够应用以下命令运行 prod 构建。

ng build –prod

该 dist 文件夹当初蕴含没有 source map 的捆绑文件。让咱们切换到该 dist 文件夹并在 HTTP 服务器上运行该应用程序,以理解它在生产中的外观。

能够应用 npm 模块 http-server 作为本地 Web 服务器。
http-server 是一个简略的、零配置的命令行 http 服务器,能够装置 npm i -g http-server

因而,让咱们运行咱们的生产版本并关上开发工具来调试咱们的性能。

在生产模式下,没有起源,也没有可供点击的 Webpack 菜单项。

咱们在哪里设置断点?咱们须要手动在转换后的 JavaScript 文件中找到咱们的函数,这很麻烦。
咱们在第 7841 行设置了断点,即便咱们的应用程序只蕴含几行代码。

将源映射增加到 Angular 生产构建

angular.json 文件蕴含一个 architect 属性,容许咱们指定是否要为咱们的生产构建应用源映射。

要启用源映射,咱们须要将 sourceMap 属性更改为 true 或通过传递 –source-map 给咱们的 ng build 命令来笼罩它。

这种办法会将源映射增加到咱们的生产构建中并在生产中获取它们,以便每个人都能够拜访咱们的源。

对源映射的细粒度管制️

Angular 7.2 为咱们提供了对源映射的更细粒度管制。该 sourceMap 属性当初承受具备以下属性的对象,而不是一个简略的 boolean 值。

"sourceMap": {
  "hidden": true,
  "scripts": true,
  "styles": true
}

scripts 和 styles 属性容许咱们只为 scripts 或者 styles 生成 source map.

而 hidden 属性,顾名思义,能够生成暗藏的 source map.

源映射自身对于惯例构建或带有暗藏源映射的构建没有区别。只有生成的包在一行中有所不同——webpack 增加的用于检索源映射的正文。

让咱们看一下应用源映射生成的包。

留神最初的一行正文语句。当咱们关上开发工具时,浏览器将解释此正文并尝试获取源映射。当初让咱们看一下应用暗藏源映射生成的包。

咱们能够看到文件开端没有增加正文。因而浏览器不会尝试获取源映射。如果有一种办法能够应用一些简略的 npm 脚本来解决生产环境中的源映射呢?

上传本地源地图

咱们总是能够在本地从新生成源映射并在当前上传它们。

"sourceMap": { 
  "hidden": true, 
  "scripts": true, 
  "styles": true 
}

接下来,咱们须要创立一个 postbuild 脚本,该脚本仅删除咱们刚刚生成的源映射。

"postbuild": "rm dist/sourceMapInspector/*.map"

该 postbuild 脚本是必须的,否则咱们将提供源映射。因为短少 comment,它们不会被解析。但他们依然被提供。

为了在生产中进行调试,咱们手动上传源映射。然而咱们从哪里失去它们呢?咱们刚刚删除了它们。
答案很简略,咱们须要从新生成它们。

"build:sourcemaps": "ng build --prod --output-path=localSourceMaps"

咱们当初能够应用 Chrome 开发工具从本地文件系统上传源映射。因而,关上开发工具并右键单击您的 main[hash].js. 当初输出下面脚本生成的源映射的门路。

必须按以下形式增加门路:file///pathToFile.

更多 Jerry 的原创文章,尽在:” 汪子熙 ”:

正文完
 0