2024 Clojure 状态调查!中分享你的想法。

欢迎!请参阅关于页面以了解更多有关如何使用此工具的信息。

0
ClojureScript
我使用 Figwheel 和 Node,并注意到了时标源映射的一个问题。当设置 {{: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

评论者:dnolen

我检查了source-map-support的实现,它确实会缓存source map。然而,这里提出的想法还不够全面。我们需要更改源代码中所有使用`:source-map-timestamp`的地方。欢迎贡献补丁。

0

评论者:yogthos

是的,我知道这个关键字在几处被使用。如果您的思路看起来不错,我肯定会在不久的将来看看制作补丁。

0

评论者:yogthos

看来添加时间戳的方法引起了一些问题。生成唯一的文件名意味着旧文件需要以某种方式清理,因为新文件将不再覆盖它们。跟踪这些文件并非理想之选。也许我们应该看看是否有不让Node缓存source map的方法。

0

评论者:arichiardi

大家好,我在探索这个问题的解决方案时,先查阅了(链接:https://npmjs.net.cn/package/source-map-support#options 文本:Source Map 选项):看起来解决方案可能与Meteor的做法类似,即将source map加载到内存中,这样就不需要写文件了。我们已经在REPL中了,所以这应该很容易实现,当然前提是我不遗漏任何东西。

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