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
  ^

Error: module not found: "fs" from file /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
...
Error: module not found: "fs" from file /Users/jeff/repro/node_modules/aws-sdk/lib/util.js
    at onresolve (/Users/jeff/repro/node_modules/@cljs-oss/module-deps/index.js:181:30)
    at onResolve (/Users/jeff/repro/node_modules/enhanced-resolve/lib/Resolver.js:70:11)
    at innerCallback (/Users/jeff/repro/node_modules/enhanced-resolve/lib/Resolver.js:143:22)
    at callbackWrapper (/Users/jeff/repro/node_modules/enhanced-resolve/lib/createInnerCallback.js:10:21)
    ...

0
_由mfikes_发表的评论

这个问题的整体情况对我来说并不是很清楚,但它似乎表明库的NPM版本并不是打算直接从浏览器运行时使用的,而是需要将其构建成适用于浏览器的版本。

根本问题是代码试图从浏览器使用Node的fs代码。

如果您针对Node修改Jeffrey的最小示例以添加


(set! *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
WARNING: 在路径/private/tmp/aws/src/foo.cljs的第1行,foo是一个单段的命名空间
$ node main.js
hello world


对于浏览器的情况,如果您查看{{node_modules/aws-sdk/lib/util.js}}中的代码,您会发现它为浏览器使用具有条件分支,但我怀疑这应该是按照下面描述的方式使用:[https://github.com/aws/aws-sdk-js#in-the-browser](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](https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/building-sdk-for-browsers.html)

如果可以得到确认,那么这个问题就可以作为一个非问题来处理,只需要正确使用库即可。
0
答:

评论者:djwhitt

我可以确认,在 AWS 推荐的浏览器构建过程中,它在浏览器中工作。我原以为它也可以作为一个 Node 依赖项使用,但我想你可能是对的,它并不打算这样使用。

0
答:

评论者:dehli

所以以推荐方式添加 awssdk 是可行的,但是有很多 AWS 包将 awssdk 作为一个依赖项引入。一个例子是[https://github.com/awslabs/aws-mobile-appsync-sdk-js/tree/master/packages/aws-appsync](https://github.com/awslabs/aws-mobile-appsync-sdk-js/tree/master/packages/aws-appsync)。这意味着这些包在 ClojureScript 中不会运行,因为它们会抛出与上面相同的错误。我已经在常规 JavaScript 项目中确认了 awssdk 的添加是正确的(一个例子在这里:[https://github.com/aws-samples/aws-mobile-appsync-events-starter-react/](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](https://github.com/aws/aws-sdk-js/blob/ebe83921863f1eb020b6a07ef471f2017cd58550/lib/util.js#L39)。process.browser 是用来确定 aws-sdk 是否在浏览器环境中的。

我的猜测是,如果在非 Node 环境构建时将 process.browser 设置为 true,那么就会解决这个问题([https://nolanlawson.com/2017/01/09/how-to-write-a-javascript-package-for-both-node-and-the-browser/](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+import 报告)
...