请在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
                (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)
                  n
                  (emits "\n//# sourceMappingURL="
                                (:source-map-url opts) (or (.getName sm-file))
                (if (and (true? (:source-map-timestamp opts))
                         (not= (:target opts) :nodejs))
                                                    (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 发布

是的,我注意到了key在一些地方被使用。如果这个方法看起来不错,我肯定会在不久的将来查看修改补丁。

0

评论由:yogthos 发布

看来添加时间戳的方法引入了一些问题。生成唯一文件名意味着有必要以某种方式清理旧文件,因为新文件将不再覆盖它们。需要跟踪这一点并不理想。也许我们可以看看是否有办法防止Node缓存源映射。

0

评论者:arichiardi

大家好,我正在探索这个问题,并阅读了以下(链接:[source-map-support配置](https://npmjs.net.cn/package/source-map-support#options) 文本:源映射选项):看起来解决方案可能与Meteor所做的方法类似,即将源映射加载到内存中,这样就不需要写入文件了。我们已经处于REPL中,所以这应该非常容易实现,当然,如果我没有遗漏任何东西的话。

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