2024 Clojure发展调查!中分享您的想法。

欢迎!请参阅关于页面了解有关此功能的更多信息。

0
ClojureScript
h2. 重复步骤

给定

{code:title=deps.edn}
{:paths
 ["."]

 :deps
 {org.clojure/clojurescript {:mvn/version "1.10.339"
                             #_#_:git/url "https://github.com/clojure/clojurescript.git"
                             #_#_:sha "6eedd0a08c49f7b0d4dcb30977b2fb38c90577bd"}}}


{code:title=foo.cljs}
(ns foo
  (:require [goog.log :as glog])
  (:import goog.debug.Console))

(def logger
  (glog/getLogger "app"))

(def console (goog.debug.Console.))

(defn workaround! []
  (.setConsole goog.debug.Console js/console))


(defn -main [& args]
  (.setCapturing console true)
  (.setLevel logger goog.debug.Logger.Level.FINEST)

  (when args
    (workaround!))
  (glog/error logger "一些错误"))

(set! *main-cli-fn* -main)


当我不带优化`none`编译并运行时,记录会出现

$ clj -m cljs.main -v -O none -t node -c foo
$ node out/main.js
 [  0.002s] [app] 一些错误


当我使用`simple`(或`advanced`)优化编译并运行时,记录不会出现。

预期:在Node上,simple优化对记录出现不会有影响(就像编译浏览器一样)。

h2. 各种(FWIW)

使用simple时,`goog.debug.Console.console_`最终成了nil,因为`goog.global['console']`也是nil (https://github.com/google/closure-library/blob/master/closure/goog/debug/console.js#L169).

`println`在none和simple中都能正常工作。

当针对浏览器时,none和simple都会显示记录。

一个解决方案是将Console设置为:`(.setConsole goog.debug.Console js/console)`

2 答案

0

评论者:thheller

关于{{node}}的问题在于{{goog.global}}没有被正确赋值。

在{{goog/base.js}}中,它被赋值给{{goog.global = this;}},但在{{node}}中,{{this}}是当前的{{Module}}实例,而不是通常的{{window}}。{{module.console}}不存在,因此没有正确赋值。在开发中,节点启动程序会明确将代码以{{global}}作为{{this}}进行加载(链接:1)。在生产中不会这样做,所以“默认”的{{this}}变成了{{module}},这破坏了优化的代码。

我认为只需要始终使用这个替代方案! 就可以了,因为它不会破坏任何事情。

(链接:1) https://github.com/clojure/clojurescript/blob/master/src/main/cljs/cljs/bootstrap_nodejs.js#L114

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