2024 年 Clojure 状态调查中分享您的想法!

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

0
ClojureScript
我在使用 Node 和 Figwheel,注意到一个带时间戳的源代码映射的 bug。当设置 {{:source-map-timestamp}} 编译器标志时,{{sourceMappingURL}} 将设为 {{source.js.map?timestamp}}。

这在前端浏览器中运行良好,但在从文件系统中加载文件的 Node 中会损坏。看起来一个简单的解决方案是检查 {{:target}} 是否为 {{:node}},然后输出如下内容:{{source.js.timestamp.map}} 并将其直接用作 {{sourceMappingURL}} 的值。

以下是我对 {{cljs.compiler/emit-source-map}} 本地修改,允许在节点使用时间戳时解析源映射

{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

评论来自: dnolen

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

0

评论来自: yogthos

我将 {{:source-map-timestamp}} 设置为 false 后,在 Cljs 源重新加载时,源映射变得不同步。

0

评论来自: dnolen

好的。在继续之前,需要更深入地研究 Node.js 的源映射支持。由于行为已理解,应在此处添加信息。

0

评论来自: 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 报告)
...