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

欢迎!请查看关于页面了解更多关于这里的工作方式的信息。

0
ClojureScript

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

`
编译build :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"
    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
警告:foo是行1处的一个单段命名空间/private/tmp/aws/src/foo.cljs
$ 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推荐的浏览器构建过程在浏览器中工作。我曾希望它也能作为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](https://clojure.atlassian.net/browse/CLJS-2738)(由 alex+import 报告)
...