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

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

0 投票
ClojureScript
The {{slate}} npm 依赖项依赖于 {{is-plain-object}} 但无法加载。使用以下命令启动 REPL


clojure -m cljs.main -co '{:npm-deps {"react" "15.5.4" "react-dom" "15.5.4" "slate" "0.33.6" "immutable" "3.8.2"} :install-deps true :repl-verbose true}' -d out -r


(注意,上面的例子中我们使用的是默认浏览器 REPL;如果指定 {{-re node}},则问题不会出现。)

然后,在 REPL 启动并运行之后


cljs.user=> (require 'slate)
load-namespace module$privateaxyx_test-me$node_modules$slate$lib$slate_es , compiled: ((module$privateaxyx_test-me$node_modules$slate$lib$slate_es)))
goog.addDependency("../node_modules/slate/lib/slate.es.js", ['module$privateaxyx_test-me$node_modules$slate$lib$slate_es'], ['module$is/plain/object', 'module$immutable', 'module$slate_dev_logger', 'module$direction', 'module$esrever', 'module$debug', 'module$lodash_isEqual', 'module$lodash_mergeWith', 'module$slate_schema_violations', 'module$lodash_pick', 'module$lodash_omit', 'module$is_empty']);

goog.require('module$privateaxyx_test-me$node_modules$slate$lib$slate_es');
null;

"Error evaluating:" (require (quote slate)) :as "goog.require('module$privateaxyx_test-me$node_modules$slate$lib$slate_es');\nnull;\n"
错误:未定义名称 ToPath 适用于模块,module$is/plain/object
     (out/goog/base.js:1357:26)
     (out/goog/base.js:1369:14)
     (out/goog/base.js:706:27)
     require (out/clojure/browser/repl.cljs:340:25)


注意,它无法加载指定通过在 {{out/node_modules/slate/lib/slate.es.js}} 中包含


goog.require("module$privateaxyx_test-me$node_modules$slate$lib$slate_es");


的 {{module$privateaxyx_test-me$node_modules$slate$lib$slate_es}}.

但是,您可以直接加载该命名空间


cljs.user=> (require 'is-plain-object)
load-namespace module$privateaxyx_test-me$node_modules$iso$index , compiled: ([module$privateaxyx_test-me$node_modules$iso$index] (module$privateaxyx_test-me$node_modules$iso$index)))
goog.addDependency("../node_modules/isobject/index.js", ['module$privateaxyx_test-me$node_modules$iso$index'], [])
goog.addDependency("../node_modules/is-plain-object/index.js", ['module$privateaxyx_test-me$node_modules$iso$index'], [])

goog.require('module$privateaxyx_test-me$node_modules$iso$index');
null;


这看起来是 Closure 无法找到模块的正确路径并仅仅发出 {{module$}} 而不是 {{module$}} 问题。

8 答案

0 投票

评论者:kommen

当前主分支产生了不同的错误。

这些错误现在已被记录。

找不到变量:module

undefined 不是一个对象(在评估 'module$Users$kommen$work$clojurescript$node_modules$slate$node_modules$debug$src$debug["default"]' 时)

TypeError:undefined 不是一个构造函数(在评估 'new module$Users$kommen$work$clojurescript$node_modules$immutable$dist$immutable.Map' 时)

Juho 建议,原始问题实际上可能是 CLJS-2746 的重复。

0 投票

评论者:mfikes

是的,CLJS-2746 确实在这个领域。也许这个ticket中描述的问题现在已经解决了,我们现在遇到了完全不同的问题。

0 投票
_评论者:mfikes_

使用当前 Closure Compiler 的主分支,通过 {{mvn -DskipTests -pl externs/pom.xml,pom-main.xml,pom-main-unshaded.xml}} 构建 unshaded JAR,并通过以下方式依赖它:

{code:title=deps.edn}
{:deps {org.clojure/clojurescript {:mvn/version "1.10.339"} com.google.javascript/closure-compiler-unshaded {:mvn/version "1.0-SNAPSHOT"}}}
        com.google.javascript/closure-compiler-unshaded {:mvn/version "1.0-SNAPSHOT"}}}


然后你可以 {{(require 'slate)}} 而不会出现错误。(对我来说不清楚 Closure 是否正确加载了所有代码;到此为止,我不清楚如何使用 Slate,且导出的对象似乎为空。)
0 投票
_评论者:jumblemuddle_

这可能与无关的问题无关,但是如果 npm 模块使用 `process.env.NODE_ENV`,似乎会出现问题。

{code:|title=使用 `closure-compiler-unshaded` 快照启动 REPL}
clj -Sdeps '{:deps {org.clojure/clojurescript {:mvn/version "1.10.339"} com.google.javascript/closure-compiler-unshaded {:mvn/version "1.0-SNAPSHOT"}}}' -m cljs.main -co '{:npm-deps {"emotion" "9.2.4"} :install-deps true :repl-verbose true}' -d out -r


ClojureScript 1.10.339
cljs.user=> (require '[emotion])
load-namespace module$home$garrett$tmp$node-modules$emotion$dist$index-es , compiled: ([module$home$garrett$t...
goog.addDependency("../node_modules/@emotion/unitless/dist/index.es.js", ['module$home$garrettбоtmp$node_modules$$emotion$$unitless$$dist$$index_es', 'module$$emotion$$unitless', 'module$$emotion$$unitless$$dist$$index_es'], []);
goog.addDependency("../node_modules/@emotion$$hash$$dist$$index.es.js", ['module$home$garrett$tmp$node_modules$$emotion$$hash$dist$$index_es', 'module$$emotion$$hash', 'module$$emotion$$hash$$dist$$index_es'], []);
goog.addDependency("../node_modules/@emotion$$stylis$$dist$$index.es.js", ['module$home$garrett$$tmp$node_modules$$emotion$$stylis$$dist$$index_es', 'module$$emotion$$stylis', 'module$$emotion$$stylis$$dist$$index_es'], []);
goog.addDependency("../node_modules$$stylis$$rule$$sheet/index.js", ['module$home$garrett$$tmp$node_modules$$stylis$$rule$$sheet$$index', 'module$$stylis$$rule$$sheet', 'module$$stylis$$rule$$sheet$$index'], []);
goog.addDependency("../node_modules/create-emotion$$dist$$index.es.js", ['module$home$garrett$$tmp$node_modules$$create_emotion$$dist$$index_es', 'module$create_emotion', 'module$create_emotion$$dist$$index_es'], ['module$$emotion$$memoize', 'module$$emotion$$unitless', 'module$$emotion$$hash', 'module$$emotion$$stylis', 'module$$stylis$$rule$$sheet']);
goog.addDependency("../node_modules/@emotion$$memoize$$dist$$index.es.js", ['module$home$garrett$$tmp$node_modules$$emotion$$memoize$$dist$$index_es', 'module$$emotion$$memoize', 'module$$emotion$$memoize$$dist$$index_es'], []);
goog.addDependency("../node_modules/emotion$$dist$$index.es.js", ['module$home$garrett$$tmp$node_modules$$emotion$$dist$$index_es', 'module$emotion', 'module$emotion$$dist$$index_es'], ['module$create_emotion']);

goog.require('module$home$garrett$$tmp$node_modules$$emotion$$dist$$index_es');
null;

{code:title=浏览器控制台错误}
index.es.js:11 未捕获的ReferenceError: process 未定义
    在 index.es.js:11
(匿名函数) @ index.es.js:11
index.es.js:5 未捕获的TypeError: module$home$garrett$tmp$node_modules$create_emotion$dist$index_es.default 不是一个函数
    在 index.es.js:5
0 投票
通过
_评论者:jumblemuddle_

关于 `slate`,浏览器控制台也存在错误。
{code:title=REPL}
clj -Sdeps '{:deps {org.clojure/clojurescript {:mvn/version "1.10.339"} com.google.javascript/closure-compiler-unshaded {:mvn/version "1.0-SNAPSHOT"}}}' -m cljs.main -co '{:npm-deps {"react" "15.5.4" "react-dom" "15.5.4" "slate" "0.33.6" "immutable" "3.8.2"} :install-deps true}' -d out -r
ClojureScript 1.10.339
cljs.user=> (require '[slate])

cljs.user=> slate
#js {}
cljs.user=>


{code:|title=浏览器控制台错误}
browser.js:15 未捕获的TypeError: (0 , module$home$garrett$$tmp$node_modules$slate$$node_modules$debug$$src$$browser.default.load) 不是一个函数
    在 browser.js:15
(匿名函数) @ browser.js:15
isBuffer.js:6 未捕获的ReferenceError: module 未定义
    在 isBuffer.js:6
(匿名函数) @ isBuffer.js:6
_nodeUtil.js:5 未捕获的ReferenceError: module 未定义
    在 _nodeUtil.js:5
(匿名函数) @ _nodeUtil.js:5
_cloneBuffer.js:6 未捕获的ReferenceError: module 未定义
    在 _cloneBuffer.js:6
(匿名函数) @ _cloneBuffer.js:6
slate.es.js:37 未捕获的TypeError: module$home$garrett$$tmp$node_modules$immutable$$dist$$immutable.Map 不是一个构造函数
    在 slate.es.js:37
0 投票
通过

评论者:mfikes

是的,有一个问题(严格来说,可能是不同的一个问题,因为在这个工单中提到的问题最终在迁移到新的 Closure 版本时会被解决),问题似乎在于 {{slate}} 模块树内的 {{debug}} 模块与顶层 {{debug}} 模块之间存在一些混淆。

0 投票

评论者:mfikes

Map 构造函数出现问题,原因是托管对象涉及默认字段

`
cljs.user=> (let [Map (.-Map (.-default js/module$privateames$node_modules$immutable$dist$immutable))] (Map.))

对象[Map$$module$private_merge$node_modules$immutable$dist$immutable Map {}]

`

0 投票
...