线上调试代码,试试SourceMap?

线上调试代码,试试 SourceMap?

背景

大家有没有过在开发环境代理调试的时候,只能调试打包之后的代码,而不是调试源码?

那是因为没正确使用 sourceMap。


SourceMap

sourceMap 有什么作用?🤔

sourceMap 用于映射编译后的代码与源码,这样如果编译后的代码出错了,可以很快速的定位到源文件的位置。

举个栗子 🌰

umi 的项目在开发环境默认的 sourceMap 为 cheap-module-source-map。

我们把它关了,看看编译的资源有什么不一样的:

js 复制代码
// config.ts
devtool: false,

既然 sourceMap 可以快速定位到源码的位置,为了方便,我们在页面上执行个 console.log,看看 log 位置的源代码:

ts 复制代码
console.log('测试 SourceMap')

打印出来发现我们 log 处的源码是编译之后的。

目前不加 SourceMap 的结论 😳

不加 sourceMap,页面上的 log 信息是无法精准定位到源码的位置的。


那我们加了呢?

先试试 bigfish 默认的,我们把 config 里的 devtool 删掉。

结果发现还是定位不到源码位置,控制台提示:source map failed to load。

而且文件最后一行已经显示了 sourceMappingURL 的指定文件。

那是为什么?map 文件加载失败了。

仔细看发现它请求的位置是线上环境的 map 文件,请求了 404。

而 umi 在生产环境不会打开 sourceMap(为了防止其他人可以随意在 source 上看到自己的源码)。

奇怪的是我们在 Network 里并没发现请求的 map 文件。

查阅资料发现:

SourceMap 的加载不能从 Network 中看到,而要从 Developer Resources 看到。

打开 Developer Resources:command + shift + p 搜索 Show Developer Resources。

在 Developer Resources 中可以看到 map 文件请求失败:

vbnet 复制代码
ERROR LOADING URL http://xxx.alipay.net/static-assets/.../P_ALARMLABELMANAGEMENT_INDEX.ASYNC.JS.MAP:
HTTP ERROR: STATUS CODE 404, NET::ERR_HTTP_RESPONSE_CODE_FAILURE

用 XSwitch 转发 map 文件行不行?

那我们把这个地址通过 xswitch 代理转发到本地是不是就可以了?

试了下,遗憾的说:不行。

参考资料:zhuanlan.zhihu.com/p/674981525

原因分析:

  1. 只有在 DevTools 打开时才会加载 SourceMap(性能优化 & 用户并不需要)
  2. DevTools 也是一种扩展,而扩展是无法拦截另一个扩展的请求的(安全性问题)
  3. SourceMap 的加载不能从 Network 中看到而要从 Developer Resources 看到(这也是故意的设计)

基于以上信息,Chrome Extension 主要还是用于折腾 Content 区域,而不是希望你 Hack 浏览器。总之很遗憾,我们不能通过 XSwitch 这样的插件,把 SourceMap 文件的请求地址转发到正确的位置。


解决方案:使用不生成新 map 文件的 SourceMap 类型

目前看我们只能使用不生成新 map 文件 的 sourceMap 类型了。

因为 sourceMap 的类型有很多,以下是不会生成新 map 文件的类型对比:

类型 构建速度 调试精度 推荐环境
eval 最快 低 快速开发
eval-cheap-source-map 快 行级别 开发环境
eval-cheap-module-source-map 较快 行级别(含 Loader) 开发环境(推荐)
eval-source-map 慢 精确 精确调试
inline-source-map 慢 精确 特殊需求
false 最快 无 生产环境

AI 推荐我们开发环境用 eval-cheap-module-source-map。

配置如下:

ts 复制代码
devtool: 'eval-cheap-module-source-map',

验证结果:

✅ 使用 eval-cheap-module-source-map 确实可以定位到源码了!

控制台的 log 信息直接指向了源文件:useProtableProps.tsx:76,而不是编译后的代码。

加了 SourceMap 的结论 🤓

在线上代理的方法上使用默认的 bigfish 的 devtool 值做不到定位源码,我们使用了 eval-cheap-module-source-map,可以在开发环境定位到源码位置,方便调试。


总结 👀

建议大家设置 devtool:

  • 开发环境 :eval-cheap-module-source-map
  • 生产环境 :false(为了代码安全)
typescript 复制代码
devtool: process.env.NODE_ENV === 'development' ? 'eval-cheap-module-source-map' : false,

又可以开心地 ✍️ 代码了!

相关推荐
子兮曰4 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰4 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万4 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝4 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋4 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁4 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95274 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大4 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师4 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学5 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端