为了提升性能,JavaScript一般须要经过压缩和合并以后才能投入生产环境。若是使用CoffeeScript,还须要进行编译。java
这就意味着,编辑的代码和运行的代码不同。JavaScript的解释器的报错信息的行数是针对生成的代码的,行数与原来的代码不对应,内部变量也改了名字。因而调试的时候咱们就会感到茫然无措。json
若是转换代码的时候,咱们能记录原始代码和生成的代码行数间对应的关系,那该有多好啊。segmentfault
Source map就是干这个。app
有了它,调试的时候将直接显示原始代码,而不是生成的代码。多方便!性能
使用Google家的closure compiler:google
java -jar compiler.jar \ --js script.js \ --create_source_map ./script-min.js.map \ --source_map_format=V3 \ --js_output_file script-min.js
Source map格式简单明了:编码
{ version : 3, file: "out.js", sourceRoot : "", sources: ["foo.js", "bar.js"], names: ["src", "maps", "are", "fun"], mappings: "AAgBC,SAAQ,CAAEA" }
version
是 Source map 的版本,file
是生成的文件,sourceRoot
是原始代码所在的目录,留空表示同一目录。sources
是原始代码,names
是转换前的全部变量名和属性名。mappings
决定原始文件和生成文件是如何对应的,看上去不太直白,由于它使用了Base64 VQL编码。spa
只要在生成的代码的尾部加上指向source map文件位置的一行就能够了:调试
//@ sourceMappingURL=/path/to/script-min.js.map
若是你喜欢在代码尾部加注释,你也能够为生成的JavaScript指定一个特别的header:code
X-SourceMap: /path/to/script-min.js.map
新版的Google Chrome的Developer tools和Firefox的Firebug都支持。其中,Firefox是默认开启的。
CoffeeScript 1.6.1以上版本支持 source map。只需在编译时加上-m
参数便可。