2024 State of 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: 模块未找到: "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
_Comment made by: 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: 模块未找到: "fs" 来自文件 /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
_Comment made by: 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
警告:在行1 /private/tmp/aws/src/foo.cljs中,foo是单个代码段命名空间
执行命令:$ node main.js
你好,世界


对于浏览器的情况,如果你查看{{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项目中,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它是否在浏览器环境中。

我认为,如果我们将在构建非Node环境时将process.browser设置为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+import 提交)
...