在 ClojureScript 中,为什么我不能导航到手动输入的 URL,但如果我单击 link 它会起作用?

In ClojureScript, why can't I navigate to a URL entered by hand, but if I click a link it works?

(注意,我使用的是 Reagent、Secretary 和 Compojure(以及其他))

我想创建一条路线 /sectest/:id,如果我将浏览器指向该路线,我会收到以下错误:

Resource interpreted as Stylesheet but transferred with MIME type text/html: "http://localhost:3449/sectest/css/site.css". asdf:1 Refused to execute script from 'http://localhost:3449/sectest/js/app.js' because its MIME type ('text/html') is not executable, and strict MIME type checking is enabled.

但是如果我在导航到该路线的浏览器中单击 link,它工作正常...

这是相关代码:

客户端:

(secretary/defroute "/sectest/:id" [id]
  (do
    (js/console.log (str "Hi " id))
    (session/put! :current-page #'my-page)))

服务器端:

(defroutes routes
  (GET "*" [] loading-page) ;this anticipates client-side routing only
  (GET "/cards" [] cards-page)
  (resources "/")
  (not-found "Not Found"))

(def app (wrap-middleware #'routes))

所以下面的 link 带我到 my-page,控制台打印 "Hi asdf" 就好了:

[:div [:a {:href "/sectest/asdf"} "SECTEST"]]

但是如果我输入 http://localhost:3449/sectest/asdf,我会得到一个错误,而且我似乎无法追踪它。我怀疑它可能与试图找到位于 /sectest 的资源的代码有关(这不应该),但我无法确认这一点或弄清楚如何使用它......我我是 clojure 的新手,如果我在某些方面非常无知,请原谅,有什么想法吗?

看看你的服务器端路由,实际上你只有一个路由:

(GET "*" [] loading-page)    

由于它处理所有后续路由,因此永远不会触发。订单事项:

(defroutes routes
  (GET "/cards" [] cards-page)
  (resources "/")
  (GET "*" [] loading-page) ;this anticipates client-side routing only
)

上面应该可以解决问题,我删除了 404 路由,因为这应该由前端路由处理。

在您的 SPA 中单击页面 link 时它当前有效的原因是它将由秘书处理。如果您手动输入 url 则您正在重新加载页面并且请求最初由 compojure 处理。

编辑:

仔细查看后,relative linkshtml template 中的 css/js 文件很可能是此处的罪魁祸首:

/sectest/js/app.js

compojure resources 路由将不匹配,默认捕获所有路由 loading-page 作为 css/js 文件提供给您的浏览器。因此错误。

对于我的开发环境,我还必须更正我的 boot cljs 任务的 :asset-path,因为 source mapping 文件存在问题。应该类似于 lein-figwheel.