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

欢迎!请参阅关于页面获取更多有关如何使用本站的信息。

0
ClojureScript
我正在使用 Figwheel 与 Node,并注意到了时间戳源代码映射的一个错误。当 {{:source-map-timestamp}} 编译器标志被设置为 {{源映射URL}} 时,设置为 {{source.js.map?timestamp}}。

这在浏览器中运行良好,但在从文件系统加载文件的 Node 中会破坏。看起来一个简单的解决方法是检查 {{:目标}} 是否为 {{:node}},并输出类似于 {{source.js.timestamp.map}} 的东西,并将其直接用作 {{源映射URL}} 的值。

这是我本地在 {{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)
                    ""))
                  (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
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](https://clojure.atlassian.net/browse/CLJS-1864)(由 alex+import 报告)
...