基座不提供静态资源
Pedestal Doesn't serve static resource
我正在尝试构建可用的 Pedestal 教程应用 here。
我正在尝试添加 cljs 功能并尝试设置统一的 clojurescript 和 clojure 环境。
我的 deps.edn 文件如下所示:
{: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文件如下
{: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 模板创建带有“Hello, World!”的 H1 标签外,该网站与 pedestal 教程没有任何不同。或“你好,名字!”。在 html 中,我包含了由 shadow-cljs 从 clojurescript 生成的 main.js。
<!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 具有以下路由定义
(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"}}}))
如您所见,我已经在资源路径中添加了资源文件夹。
我能够 运行 并行终端中的 shadow-cljs 和 clj 并按如下方式托管服务器:
当我查看托管页面的 chrome 时,我得到以下信息。
无论我做什么我都无法将资源中的public文件夹添加到客户端的html路径中。这样我就无法用页面加载 main.js 。这是为什么?我是 clojure 和 pedestal 的新手,所以也许我遗漏了一些明显的东西。有人可以帮我解决这个问题吗?我不确定如何进行。 Pedestal文档在这方面不是很详细
- 安倍
参见 http://pedestal.io/cookbook/index#_how_to_serve_static_resources。请特别注意,Pedestal 的 http/resource-path 保存的不是文件系统位置,而是 URL 路径前缀,Pedestal 应通过该路径前缀识别应从类路径中恢复的内容。
您的设置有两个问题:
- 键
::http/resource-path
采用单个元素而不是向量。
- 正如键的名称所示,路径必须是 Java 意义上的资源:文件实际上是由 ClassLoader 加载的(资源可能在 jar 文件中)。
对于您的情况,您可以执行以下操作:
将 "resources"
添加到 deps.edn 文件中的 :src
(maven repo 配置不是必需的,因为始终包含 maven central 和 clojars);
使用 "public"
作为键 ::http/resource-path
的值。
您的 edn 文件变为:
{: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"}}}
您的服务器配置变为:
(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"}}}))
我正在尝试构建可用的 Pedestal 教程应用 here。
我正在尝试添加 cljs 功能并尝试设置统一的 clojurescript 和 clojure 环境。
我的 deps.edn 文件如下所示:
{: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文件如下
{: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 模板创建带有“Hello, World!”的 H1 标签外,该网站与 pedestal 教程没有任何不同。或“你好,名字!”。在 html 中,我包含了由 shadow-cljs 从 clojurescript 生成的 main.js。
<!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 具有以下路由定义
(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"}}}))
如您所见,我已经在资源路径中添加了资源文件夹。
我能够 运行 并行终端中的 shadow-cljs 和 clj 并按如下方式托管服务器:
当我查看托管页面的 chrome 时,我得到以下信息。
无论我做什么我都无法将资源中的public文件夹添加到客户端的html路径中。这样我就无法用页面加载 main.js 。这是为什么?我是 clojure 和 pedestal 的新手,所以也许我遗漏了一些明显的东西。有人可以帮我解决这个问题吗?我不确定如何进行。 Pedestal文档在这方面不是很详细
- 安倍
参见 http://pedestal.io/cookbook/index#_how_to_serve_static_resources。请特别注意,Pedestal 的 http/resource-path 保存的不是文件系统位置,而是 URL 路径前缀,Pedestal 应通过该路径前缀识别应从类路径中恢复的内容。
您的设置有两个问题:
- 键
::http/resource-path
采用单个元素而不是向量。 - 正如键的名称所示,路径必须是 Java 意义上的资源:文件实际上是由 ClassLoader 加载的(资源可能在 jar 文件中)。
对于您的情况,您可以执行以下操作:
将
"resources"
添加到 deps.edn 文件中的:src
(maven repo 配置不是必需的,因为始终包含 maven central 和 clojars);使用
"public"
作为键::http/resource-path
的值。
您的 edn 文件变为:
{: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"}}}
您的服务器配置变为:
(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"}}}))