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
             (attrs-one 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))
                (:source-map-url opts)
                   attrs-one (:source-map-url opts)
                                (str "?rel=" timestamp)
                ")"))
                        {: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 添加

已查看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报告)
...