我在使用 Node 的 Figwheel 时遇到了一个时间戳源映射的bug。当设置了{{:source-map-timestamp}}编译器标志时,{{sourceMappingURL}}被设置为{{source.js.map?timestamp}}。
这在浏览器中运行良好,但在从文件系统加载文件的 Node 中却中断了。看起来一个简单的解决方案是检查{{:target}}是否为{{:node}},并输出类似{{source.js.timestamp.map}}的内容,并将其直接用作{{sourceMappingURL}}的值。
这是一个我在本地对{{cljs.compiler/emit-source-map}}所做的更改,它允许在使用时间戳时在 Node 上解析源映射。
{code:title=emit-source-map}
(defn emit-source-map [src dest sm-data opts]
(let [timestamp (System/currentTimeMillis)
filename (str (.getPath ^File dest)
(when (and
(true? (:source-map-timestamp opts))
= (:target opts) :nodejs))
str "." timestamp)
".map")
sm-file (io/file filename)]
(if-let [smap (:source-map-asset-path opts)]
(emits "\n//# sourceMappingURL=" smap)
(string/replace (util/path sm-file)
(str (util/path (io/file (:output-dir opts))))
""
(if (and (true? (:source-map-timestamp opts))
(!= (:target opts) :nodejs))
str
(if-not (string/index-of smap "?") "?" "&")
"rel=" timestamp)
")
(emits "\n//# sourceMappingURL="
(or (:source-map-url opts) (.getName sm-file))
(if (and (true? (:source-map-timestamp opts))
(!= (:target opts) :nodejs))
(str "?rel=" timestamp)
")
(spit
(sm/encode {(url-path src) (:source-map sm-data)}
{:lines (+ (:gen-line sm-data) 2)}
:file (url-path dest)
:source-map-path (:source-map-path opts)
:source-map-timestamp (:source-map-timestamp opts)
:source-map-pretty-print (:source-map-pretty-print opts)
:relpaths {(util/path src)
:file (util/ns->relpath (first (:provides opts)) (:ext opts))}}))))