请分享您的想法,参与2024 年 Clojure 状态调查!

欢迎!请查看关于页面以获取更多关于如何使用本站的信息。

0
ClojureScript

如果我在 {{:npm-deps}} 中放入 {{aws-amplify}},它会似乎需要 {{aws-sdk}},但当我在那里放入 {{aws-sdk}} 时,会输出此错误

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

  throw er; // Unhandled 'error' event
  ^

错误:找不到模块 "fs",来自文件 /home/quang/dev/org-re-frame/node_modules/aws-amplify/node_modules/aws-sdk/lib/util.js

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
...
错误:找不到模块 "fs",来自文件 /Users/jeff/repro/node_modules/aws-sdk/lib/util.js
    在 /Users/jeff/repro/node_modules/@cljs-oss/module-deps/index.js:181:30的过程中
    在 /Users/jeff/repro/node_modules/enhanced-resolve/lib/Resolver.js:70:11的过程中
    在 /Users/jeff/repro/node_modules/enhanced-resolve/lib/Resolver.js:143:22的过程中
    在 /Users/jeff/repro/node_modules/enhanced-resolve/lib/createInnerCallback.js:10:21的过程中
    ...

0
_由 mfikes_ 发表的评论

关于这个问题,我的整体情况尚不完全清楚,但似乎这个库的 NPM 版本不是直接从浏览器运行时使用的,而是需要将其打包为浏览器版本才能使用。

根本问题是代码尝试从浏览器中使用 Node 的 {{fs}} 代码。

如果将 Jeffrey 的最小重现修改为目标为 Node,您会发现代码可以编译并执行:


(对 *main-cli-fn* 赋值 (-main))


然后将其添加到 {{src/foo.cljs}} 的底部,这样就可以在 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
警告:在行 1 的 /private/tmp/aws/src/foo.cljs 文件中,foo 是一个单节段的命名空间。
$ 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 推荐的浏览器构建过程中在浏览器中工作。我曾希望它也能作为一个节点依赖项使用,但我认为你可能是对的,它根本不是为了以这种方式使用。

0

评论者:dehli

以推荐的方式添加 aws-sdk 是有效的,但许多 AWS 软件包都使用 aws-sdk 作为依赖项。一个例子是 https://github.com/awslabs/aws-mobile-appsync-sdk-js/tree/master/packages/aws-appsync。这意味着这些软件包不会在 ClojureScript 中运行,因为它们会抛出与上面相同的错误。我已在一个常规 JavaScript 项目中确认了这一点(一个例子在这里: 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(报告者:alex+导入)
...