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

欢迎!请查看关于页面以获取更多关于此功能的信息。

0

如果我将{{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
_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
...
错误:从文件/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
    在创建内部回调的用户/    ...

0
_Comment made by: mfikes_

关于这个问题,我并没有完全搞清楚,但看起来该库的NPM版本不是为了直接从浏览器运行时使用,而是需要构建成适用于浏览器的包。

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

如果你将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
警告: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 是否为浏览器环境的

我的猜测是,如果我们构建非 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 报告)
...