javascript - 在浏览器中获取源映射的源位置

标签 javascript google-chrome-devtools transpiler google-developer-tools

我有 window.onerror并捕获一些异常。但问题是堆栈跟踪是在从另一种语言(ClojureScript)编译的 JS 中。所以带有行号的堆栈跟踪是编译形式。问题是:如何在浏览器中将堆栈转换为原始源?正如我们所见,浏览器已经能够在调试器中使用映射源。 (我们只使用 Chrome)

最佳答案

ClojureScript 确实支持源映射。默认情况下,ClojureScript 编译器将发出仅用于开发构建的源映射文件。根据您的描述,您的 ClojureScript 文件已经编译用于生产。
有两种方法可以解决您的问题:

  • 为生产构建生成源映射,
  • 为生产版本启用 Debug模式(推荐)。

  • 为生产构建生成源映射

    既然您要的是源映射,这里是获取它们的方法。
    如果您有权访问源代码,您也可以设置适当的编译器选项来为生产构建启用源映射:
  • 如果您使用 shadow-cljs ,您可以在 Compiler Options 中找到示例文档。
  • 如果您使用 cljsbuild ,您可以在 Source Maps 中找到示例文档。

  • 这是在生产模式下启用源映射的最小配置:
  • 对于 shadow-cljs

  • {:builds {:app {:target  :browser
                    :release {:compiler-options {:source-map true}}}}}
    
  • 对于 cljsbuild

  • {:cljsbuild {:builds [{:id       "production"
                           :compiler {:optimizations :advanced
                                      :source-map    true}}]}}
    

    为生产版本启用 Debug模式(推荐)

    ClojureScript 编译器还有一个名为 :pseudo-names 的特性。旨在解决这个特定问题。
    来自 ClojureScript documentation :

    Change your production build to use two additional (compiler) options :pseudo-names true and :pretty-print true. Now your error will show a name that corresponds to the name in the original source.



    和上面一样,下面是一个例子:
  • 对于 cljsbuild

  • {:cljsbuild {:builds [{:id       "production-debug"
                           :compiler {:optimizations :advanced
                                      :pseudo-names  true
                                      :pretty-print  true}}]}}
    
  • 对于 shadow-cljs ,可以直接运行:
  • shadow-cljs release app --debug
    

    如果您无法访问源代码,直接向维护者寻求帮助会更明智。 ClojureScript 生产构建模式生成紧凑的代码,旨在尽可能小和尽可能快,而不是由人类阅读或调试。

    关于javascript - 在浏览器中获取源映射的源位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60543802/

    相关文章:

    javascript - 如何使用 javascript 写入 "on form submit complete"?

    javascript - Typescript + Redux Toolkit,类型 'T' 的参数不可分配给类型 'WritableDraft<T>' 的参数

    javascript - 如何在Ajax中正确调用这个函数?

    javascript - 如何从扩展程序获取 Chrome DevTools 源编辑器中的光标位置?

    node.js - Node v6 是否需要 Babel 转译?

    javascript - 在 React 中从该组件外部更新该功能组件的状态(单击另一个文件中的按钮)

    javascript - 我可以以某种方式将当前运行的 javascript 函数记录到 Chrome 开发者控制台中吗?

    javascript - 在控制台中抑制 Chrome 'Failed to load resource' 消息

    typescript - tsconfig中的Paths属性不起作用

    webassembly - 将 webassembly 编译为 native 可执行文件