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)
                   (.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=")
                                      "")
                                       if (and (true? (:source-map-timestamp opts))
                                       (or (:source-map-url opts) (.getName sm-file))
                                       (str "?rel=" timestamp))
                                       ")")
             (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-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 报告)
...