2024 Cloujure 状态调查! 分享您的想法。

欢迎!有关如何工作的更多信息,请参阅 关于 页面。

0
ClojureScript
我正在使用 Node 上的 Figwheel,并注意到时间戳源映射存在一个错误。当设置编译器标志 {{: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))
                  (字符串“?rel=”时间戳)
                  ""”))
       (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-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 报告)
...