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

欢迎!请参阅关于页面获取更多有关此工作方式的信息。

0 投票
ClojureScript

如果我把{{aws-amplify}}放入{{:npm-deps}}中,它似乎需要{{aws-sdk}},但当我把{{aws-sdk}}放入其中时,它输出了这个错误

`
编译构建:dev到"resources/public/js/main.js"从["src"]...
events.js:182

  throw er; // Unhandled 'error' event
  ^

错误:无法从文件/home/quang/dev/org-re-frame/node_modules/aws-amplify/node_modules/aws-sdk/lib/util.js找到模块"fs"

at onresolve (/home/quang/dev/org-re-frame/node_modules/@cljs-oss/module-deps/index.js:181:30)
at onResolve (/home/quang/dev/org-re-frame/node_modules/enhanced-resolve/lib/Resolver.js:70:11)
at innerCallback (/home/quang/dev/org-re-frame/node_modules/enhanced-resolve/lib/Resolver.js:143:22)
at callbackWrapper (/home/quang/dev/org-re-frame/node_modules/enhanced-resolve/lib/createInnerCallback.js:10:21)
at next (/home/quang/dev/org-re-frame/node_modules/tapable/lib/Tapable.js:249:35)
at innerCallback (/home/quang/dev/org-re-frame/node_modules/enhanced-resolve/lib/Resolver.js:143:22)
at callbackWrapper (/home/quang/dev/org-re-frame/node_modules/enhanced-resolve/lib/createInnerCallback.js:10:21)
at next (/home/quang/dev/org-re-frame/node_modules/tapable/lib/Tapable.js:249:35)
at resolver.doResolve.createInnerCallback (/home/quang/dev/org-re-frame/node_modules/enhanced-resolve/lib/DescriptionFilePlugin.js:41:24)
at callbackWrapper (/home/quang/dev/org-re-frame/node_modules/enhanced-resolve/lib/createInnerCallback.js:10:21)

`

5 个答案

0 投票
_由jffry_发表的评论

我也遇到了同样的问题。这是一个简单的复现

{code:title=deps.edn|borderStyle=solid}
{:deps {org.clojure/clojurescript {:mvn/version "1.10.238"}}}


{code:title=src/foo.cljs|borderStyle=solid}
(ns foo (:require ["aws-sdk" :as sdk]))
(defn -main [] (println "hello world"))


然后运行


$ clj -m cljs.main -co '{:install-deps true, :npm-deps {:aws-sdk "2.229.1"}}' -m foo
...
错误:无法从文件/Users/jeff/repro/node_modules/aws-sdk/lib/util.js找到模块"fs"
    在/Users/jeff/repro/node_modules/@cljs-oss/module-deps/index.js:181:30 onresolve
    在/Users/jeff/repro/node_modules/enhanced-resolve/lib/Resolver.js:70:11 onResolve
    在/Users/jeff/repro/node_modules/enhanced-resolve/lib/Resolver.js:143:22 innerCallback
    在/Users/jeff/repro/node_modules/enhanced-resolve/lib/createInnerCallback.js:10:21 callbackWrapper
    ...

0 投票
_由mfikes_发表的评论

对于这个问题,宏观图景对我来说并不完全清晰,但看起来这个库的NPM版本并不是用来直接从浏览器运行时使用的,而是需要打包为浏览器版本的构建。

根本问题是代码试图在浏览器中使用 Node 的 {{fs}} 代码,但实际上是在浏览器中。

如果您针对 Node,则可以看到代码可以编译和执行:如果您将 Jeffrey 的最小示例修改为在 {{src/foo.cljs}} 结尾添加以下内容:


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


则将在 Node 中编译和执行


$ clj -m cljs.main -co '{:install-deps true, :npm-deps {:aws-sdk "2.229.1"}}' -O simple -o main.js -t node -c foo
警告:foo 是第 1 行 /private/tmp/aws/src/foo.cljs 的单个段落命名空间
$ node main.js
hello world


对于浏览器的情况,如果您查看 {{node_modules/aws-sdk/lib/util.js}} 中的代码,您会看到它具有针对浏览器使用的条件分支,但我怀疑这是按照以下描述的方式使用的 https://github.com/aws/aws-sdk-js#in-the-browser。但如果您确实想直接从其 NPM 依赖关系使用代码,则必须像以下内容详细说明的那样使用该 NPM 依赖关系构建用于浏览器使用的 JavaScript:https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/building-sdk-for-browsers.html

如果可以确认这一点,则可以将此问题视为非问题,而只是正确使用库的问题。
0 投票
通过

留言由:djwhitt 发布

我可以确认它在浏览器中使用 AWS 推荐的浏览器构建过程有效。我希望它也可以作为一个 node dep 使用,但我认为您可能是对的,它并不是按照那种方式使用的。

0 投票
通过

留言由:dehli 发布

所以以推荐的方式添加 aws-sdk 是有效的,但是有许多 AWS 包使用 aws-sdk 作为依赖项。一个例子是 https://github.com/awslabs/aws-mobile-appsync-sdk-js/tree/master/packages/aws-appsync。这意味着这些包在 ClojureScript 中无法运行,因为它们会抛出与上述相同的错误。我已确认在常规 JavaScript 项目中 aws-sdk 已正确添加(一个示例在此:https://github.com/aws-samples/aws-mobile-appsync-events-starter-react/)。

像 Mike 说的一样,它似乎来自代码的这一行: https://github.com/aws/aws-sdk-js/blob/ebe83921863f1eb020b6a07ef471f2017cd58550/lib/util.js#L39。 process.browser 是告诉 aws-sdk 是否是浏览器环境的。

我的猜测是,如果我们将 process.browser 设置为在构建到非 Node 环境时为 true,那么这就可以解决这个问题(https://nolanlawson.com/2017/01/09/how-to-write-a-javascript-package-for-both-node-and-the-browser/)。

0 投票
通过
参考:[https://clojure.atlassian.net/browse/CLJS-2738](https://clojure.atlassian.net/browse/CLJS-2738)(由alex+import报告)
...