在生产环境中是否应该使用 Source Map?

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的各个阶段提供云产品。立即开始使用 价值 200 美元的免费积分!

这是一个合理的问题。“Source map” 是一个特殊文件,它将压缩/混淆后的资源(CSS 或 JavaScript)版本连接到原始编写的版本。假设您有一个名为 _header.scss 的文件,该文件被导入到 global.scss 中,然后编译成 global.css。最终的 CSS 文件是在浏览器中加载的,因此例如,当您在 DevTools 中检查元素时,它可能会告诉您 <nav>display: flex;,因为它在 global.css 中的第 387 行是这么说的。

page.css 的第 528 行,我们可以发现 .metaposition: relative;

但是由于最终的 CSS 文件很可能是压缩的(所有空格都被删除),DevTools 可能会告诉我们声明在第 1 行!非常不幸,对开发没有帮助。

这就是 Source Map 的作用。正如我在上面所说,Source Map 是特殊文件,它们将最终输出文件(浏览器 实际使用的)连接到您实际使用的并写入代码的源文件( 在文件系统上使用的)。

通常,Source Map 是预处理器中的一个配置选项。这是 Babel 的选项。我相信使用 Sass 时,您甚至不必在命令中传递任何标志,因为它默认生成 Source Map。

因此,这些 Source Map 是为开发人员 而设计的。它们对您和您的团队特别有用,因为它们在调试问题以及日常工作中提供了极大的帮助。我确信我每天都会使用它们。我敢说通常,它们用于本地开发。您甚至可能会将它们 .gitignore 掉,或者在部署过程中跳过它们,以便向生产环境提供和存储更少的资源。但是最近关于确保它们也部署到生产环境的讨论不断增多。

David Heinemeier Hansson:

但是 Source Map 长期以来被视为仅仅是本地开发工具。并非用于部署到生产环境的工具,尽管有些人也这么做,这样可以更容易进行实时调试。这本身就是一个部署 Source Map 的绝佳理由。[…]

此外,Rails 6 默认在生产环境中部署 Source Map,这也要感谢 Webpack。您可以关闭该功能,但我希望您不要这么做。当我们允许其他人从我们的工作中学习时,网络会变得更加美好。

查看那个问题线程,了解更多关于将 Source Map 部署到生产环境的有趣讨论。好处归结为以下两点

  1. 它可能有助于您更轻松地追踪生产环境中的错误
  2. 它有助于其他人更轻松地从您的网站中学习

这两点都非常棒。就我个人而言,我会反对为了学习目的而部署性能优化的代码。去年我写过关于这个主题的文章

我不希望我的源代码可供人阅读,不是出于保护原因,而是因为我更关心网络性能。我希望我的网站能以光速在魔法网络数据包尘埃中到达,并开出完整网站。或者,根据计算机科学认为的绝对最快的速度在计算机之间发送网站数据。我更担心网络性能问题,而不是网络教育问题。但是即使我非常担心网络教育,我认为网络不应负责提供可教性。

将 Source Map 部署到生产环境是一个不错的折衷方案。它不会影响性能(除非您打开了 DevTools 才会加载 Source Map,我认为这与真正的性能讨论无关),同时又能提供调试和学习的好处。

最近的讨论中提到的缺点归结为以下几点

  1. Source Map 需要编译时间
  2. 它允许人们,我不知道,窃取您的代码之类的

我不关心 #2(抱歉),而且 #1 对小型网站(或者我们认为的普通网站)来说通常微不足道,尽管我担心我无法代表大型网站发言。

不过我要补充一点,Source Map 甚至可以为 CSS-in-JS 工具生成,因此对于那些将样式直接注入 DOM 的工具,它们的 Source Map 也会被注入。我看到过这种情况下出现严重延迟,因此我认为如果您无法将它们从主捆绑包中分离出来,那么绝对不要 将 Source Map 部署到生产环境。否则,我强烈建议您这么做。