首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基座不提供静态资源

基座不提供静态资源
EN

Stack Overflow用户
提问于 2021-03-20 11:57:33
回答 3查看 344关注 0票数 0

我正在努力建立基础教程应用程序提供的这里

我正在尝试添加cljs功能,并尝试设置一个统一的clojurescript和cljs环境。

我的deps.edn文件如下所示:

代码语言:javascript
复制
{:paths ["src"]
 :deps {io.pedestal/pedestal.service {:mvn/version "0.5.7"}
    io.pedestal/pedestal.route   {:mvn/version "0.5.7"}
    io.pedestal/pedestal.jetty   {:mvn/version "0.5.7"}
    org.slf4j/slf4j-simple       {:mvn/version "1.7.28"}
    org.clojure/core.async       {:mvn/version "1.3.610"}
    org.clojure/tools.namespace  {:mvn/version "1.1.0"}
    org.clojure/tools.logging    {:mvn/version "1.1.0"}
    org.clojure/data.json        {:mvn/version "1.1.0"}
    org.clojure/clojurescript    {:mvn/version "1.10.758"}
    thheller/shadow-cljs         {:mvn/version "2.11.23"}
    selmer/selmer                {:mvn/version "1.12.33"}
    hiccup/hiccup                {:mvn/version "1.0.5"}}
 :mvn/repos {"central"  {:url "https://repo.maven.apache.org/maven2/"}
         "clojars"  {:url "https://clojars.org/repo/"}}}

我的Shadow-cljs.edn文件如下所示

代码语言:javascript
复制
{:source-paths ["src/cljs"]
 :nrepl {:port 9000}
 :dependencies [[cider/cider-nrepl "0.21.0"]]
 :builds {:app {:target :browser
            :output-dir "resources/public/js"
            :modules {:main {:init-fn frontend.core/init-fn}}}}}

我的文件夹结构如下:

这个网站除了使用selmer渲染一个HTML模板来创建一个H1标签外,并没有做任何与基座教程不同的事情,比如“你好,世界!”或者“你好,名字!”在html中,我已经包含了影子cljs从clojurescript生成的main.js。

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>Hello, {{name}}</h1>
<script type="text/javascript" src="js/main.js"></script>
</body>
</html>

我的core.clj有以下路由定义

代码语言:javascript
复制
(def routes
(route/expand-routes
  #{["/hello" :get [coerce-body content-neg-intc respond-hello] :route-name :greet]
    ["/echo" :get echo]}))

(defn create-server
     []
   (http/create-server
       {::http/routes routes
        ::http/type   :jetty
        ::http/port   8800
        ::http/join?  false
        ::http/resource-path  ["resources/public" "resources/public/js" "resources/public/js/cljs-runtime"]
        ::http/secure-headers {:content-security-policy-settings {:object-src "none"}}}))

如您所见,我在资源路径中添加了“资源”文件夹。

我能够在并行终端中运行影子cljs和clj,并按以下方式承载服务器:

当我查看托管页面的铬时,我会得到以下内容。

无论我做什么,我都不能将资源中的公用文件夹添加到客户机上的html路径中。这样我就不能用页面加载main.js了。为什么会这样呢?我是个新手,既拥有clojure,也有基座,所以也许我错过了一些显而易见的东西。有人能帮我解决这个问题吗?我不知道该如何进行。在这方面,基本文件并不十分详细。

  • Abe
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-21 08:47:46

您的设置有两个问题:

  1. ::http/resource-path只接受一个元素,而不是一个向量。
  2. 正如键的名称所指示的那样,路径必须是Java意义上的资源:文件实际上是由ClassLoader加载的(资源可能在jar文件中)。

在您的情况下,您可以执行以下操作:

  1. 在您的"resources"文件中将:src添加到deps.edn文件中(由于maven中心和clojars总是包括在内,所以不需要maven repo配置);
  2. 使用"public"作为键::http/resource-path的值。

您的edn文件变成:

代码语言:javascript
复制
{:paths ["src" "resources"]
 :deps {io.pedestal/pedestal.service {:mvn/version "0.5.7"}
    io.pedestal/pedestal.route   {:mvn/version "0.5.7"}
    io.pedestal/pedestal.jetty   {:mvn/version "0.5.7"}
    org.slf4j/slf4j-simple       {:mvn/version "1.7.28"}
    org.clojure/core.async       {:mvn/version "1.3.610"}
    org.clojure/tools.namespace  {:mvn/version "1.1.0"}
    org.clojure/tools.logging    {:mvn/version "1.1.0"}
    org.clojure/data.json        {:mvn/version "1.1.0"}
    org.clojure/clojurescript    {:mvn/version "1.10.758"}
    thheller/shadow-cljs         {:mvn/version "2.11.23"}
    selmer/selmer                {:mvn/version "1.12.33"}
    hiccup/hiccup                {:mvn/version "1.0.5"}}}

您的服务器配置变成:

代码语言:javascript
复制
(defn create-server
     []
   (http/create-server
       {::http/routes routes
        ::http/type   :jetty
        ::http/port   8800
        ::http/join?  false
        ::http/resource-path  "public"
        ::http/secure-headers {:content-security-policy-settings {:object-src "none"}}}))
票数 1
EN

Stack Overflow用户

发布于 2021-03-20 12:38:52

资源。特别要注意的是,system的http/resource并不是一个文件系统位置,而是一个URL路径前缀,基座应该通过该前缀来识别它应该从类路径中赎回的东西。

票数 0
EN

Stack Overflow用户

发布于 2022-07-15 15:27:27

也许你应该检查一下你的deps.edn,确保它包括

代码语言:javascript
复制
:paths ["src" "resources"]

我遇到了与您相同的问题,直到我发现我将“路径”写错为“路径”,这将导致服务器无法定位静态资源路径。祝好运!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66721281

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档