2024 Clojure现状调查!中分享您的想法。

欢迎!请查看关于页面以了解该工作的更多信息。

0
ClojureScript
我正在使用Figwheel和Node,并注意到了带有时间戳的源映射的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))
                         (not= (: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))
                         (not= (:target opts) :nodejs))
                  (str "?rel=" timestamp)
                  "")))
       (spit sm-file
             (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)
                                                   (util/ns->relpath (first (:provides opts)) (:ext opts))}}))))

9个答案

0
by

评论由:dnolen 制作

Node.js 有源映射缓存问题吗?时间戳功能是为了解决浏览器中的缓存问题而创建的。

0
by

评论由:yogthos 制作

我将 {{:source-map-timestamp}} 设置为 false,并在 Cljs 源代码重新加载时,源映射出现了不同步。

0
by

评论由:dnolen 制作

好的。在推进任何事之前,需要更深入地调查 Node.js 源映射支持问题。因为已理解该行为,所以应在此处添加信息。

0
by

评论由:yogthos 制作

听起来像是个计划。

0
by

评论由:dnolen 制作

OK 我查看了一下 source-map-support 的实现,它确实缓存了源映射文件。然而,这里提出的方法还不够全面。我们需要更改源代码中所有使用 :source-map-timestamp 的地方。欢迎提出补丁。

0

评论由:yogthos 制作

是的,我注意到了这个关键字在几个地方被使用。如果你们觉得这个方法可行,我肯定会尽快提交一个补丁。

0

评论由:yogthos 制作

看起来添加时间戳的方法引入了一些问题。生成唯一的文件名意味着需要以某种方式清理旧文件,因为新文件将不再覆盖它们。跟踪这一点并不理想。也许我们可以看看是否有一种方法可以防止 Node 缓存源映射文件。

0

评论者:arichiardi

大家好,我正在探索这方面的选项,并且读了(链接:https://npmjs.net.cn/package/source-map-support#options):它看起来解决方案可能类似于 Meteor 所做的,即将源映射文件加载到内存中,这样就无需写入文件。我们已经在使用 REPL,所以如果不出我所料,这应该是相当容易实现的。

0
参考: https://clojure.atlassian.net/browse/CLJS-1864(由 alex+import 报告)
...