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}}所做的更改,它允许在使用时间戳时在 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))
                                             (!= (: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))
                                             (!= (:target opts) :nodejs))
                         (str "?rel=" timestamp)
                                  ")
                (spit
             (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)
                                                           :file    (util/ns->relpath (first (:provides opts)) (:ext opts))}}))))

9 条回答

0

由dnolen做出的评论

Node.js是否存在源映射缓存问题?时间戳功能是为了解决在Web浏览器中存在的缓存问题而创建的。

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缓存源映射的方法。

0

评论者:arichiardi

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

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