We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
source-map是用来映射源文件和构建输出文件的位置的一个方案(方法)。
源文件 <-- source-map <-- 输出文件
不论是压缩代码工具如uglifyjs还是打包构建工具,都希望输出体积更小的文件。这对用户来说是友好的,节省流量。但是对于开发者来说,就不太友好,因为输出文件与源文件不一样,错误堆栈的行和列都是对不上的。于是source-map应时而生。
uglifyjs
source-map刚开始是Google的一款优化JS代码的闭包编译器(Closure Compiler)的产物。详情可以看:What is the Closure Compiler?。
source-map文件里最重要的字段是mappings,它是基于VQL编码(可变长度的编码)和Base64编码,用分号分割每一个组(每一个组对应输出文件的一行),每一组里面由逗号分割成一个个段,每个段表示一个字符串(不包括JS里的关键字:const、require等)的信息,每个段分为五个域:
很多工具都支持source-map,比如uglify-js、webpack。通过source-map,我们可以把线上的错误堆栈还原到源代码的位置。
uglify-js
webpack
再继续往下说之前,我想来先介绍一下,前端一般是怎么收集错误堆栈的:
window.onerror = function(message, source, lineno, colno, error) { ... }
在onerror函数里把message, source, lineno, colno, error传到一个收集错误堆栈的应用里,其中最重要的是source和lineno、colno:source是构建输出的文件,lineno是行号,colno是列号。
message, source, lineno, colno, error
其次,再来谈谈source-map一般是怎么创建的。前端最流行的打包构建工具webpack可以在构建过程中帮助我们生成,只需要在配置文件webpack.config.js里的导出对象加上一个devtool字段,并赋值hidden-source-map便可:devtool: 'hidden-source-map'。那么只要我们构建输出文件的时候就会多一个xxx.js.map文件,部署应用的时候,推荐把xxx.js.map文件一起部署上去。
webpack.config.js
devtool: 'hidden-source-map'
devtool还有其它选项,不过我认为比较适合上线使用的是hidden-source-map,它不会为输出文件添加引用注释,也就不会向浏览器开发工具暴露你的source map,也会保留sourcesContent(源代码内容),这样就可以轻易还原源代码了。详情:devtool
接下来还要介绍一个npm库,Source Map,它提供了Node版本和Web版本的接口,通过SourceMapConsumer.prototype.originalPositionFor(generatedPosition)这个接口我们就可以得到源代码的路径和行列号了。
SourceMapConsumer.prototype.originalPositionFor(generatedPosition)
为了保护源代码,建议在网关屏蔽source-map请求,仅让内网访问。
下面是我写的一个开源的用于根据错误堆栈查看源代码的web app。
sourcemap-watch
Closure Compiler GlobalEventHandlers.onerror sourcemap学习笔记 source map原理分析&vlq
The text was updated successfully, but these errors were encountered:
No branches or pull requests
source-map简介
source-map是用来映射源文件和构建输出文件的位置的一个方案(方法)。
不论是压缩代码工具如
uglifyjs
还是打包构建工具,都希望输出体积更小的文件。这对用户来说是友好的,节省流量。但是对于开发者来说,就不太友好,因为输出文件与源文件不一样,错误堆栈的行和列都是对不上的。于是source-map应时而生。source-map刚开始是Google的一款优化JS代码的闭包编译器(Closure Compiler)的产物。详情可以看:What is the Closure Compiler?。
source-map文件里最重要的字段是mappings,它是基于VQL编码(可变长度的编码)和Base64编码,用分号分割每一个组(每一个组对应输出文件的一行),每一组里面由逗号分割成一个个段,每个段表示一个字符串(不包括JS里的关键字:const、require等)的信息,每个段分为五个域:
生产环境应用
很多工具都支持source-map,比如
uglify-js
、webpack
。通过source-map,我们可以把线上的错误堆栈还原到源代码的位置。再继续往下说之前,我想来先介绍一下,前端一般是怎么收集错误堆栈的:
在onerror函数里把
message, source, lineno, colno, error
传到一个收集错误堆栈的应用里,其中最重要的是source和lineno、colno:source是构建输出的文件,lineno是行号,colno是列号。其次,再来谈谈source-map一般是怎么创建的。前端最流行的打包构建工具webpack可以在构建过程中帮助我们生成,只需要在配置文件
webpack.config.js
里的导出对象加上一个devtool字段,并赋值hidden-source-map便可:devtool: 'hidden-source-map'
。那么只要我们构建输出文件的时候就会多一个xxx.js.map文件,部署应用的时候,推荐把xxx.js.map文件一起部署上去。接下来还要介绍一个npm库,Source Map,它提供了Node版本和Web版本的接口,通过
SourceMapConsumer.prototype.originalPositionFor(generatedPosition)
这个接口我们就可以得到源代码的路径和行列号了。为了保护源代码,建议在网关屏蔽source-map请求,仅让内网访问。
下面是我写的一个开源的用于根据错误堆栈查看源代码的web app。
sourcemap-watch
参考
Closure Compiler
GlobalEventHandlers.onerror
sourcemap学习笔记
source map原理分析&vlq
The text was updated successfully, but these errors were encountered: