Compojure静态资源只能在dev中工作,而不能在prod中工作

时间:2018-07-02 16:58:07

标签: tomcat clojure war compojure

我正在使用Compojure 1.6.0构建一个Web应用程序。对于第三方JS库,我使用npm安装它们,这会将它们放在名为node_modules(不可自定义)的文件夹中。为了服务他们,我这样做:

(route/files "/node_modules" {:root "node_modules/"})

在开发中效果很好。为了进行生产,我部署了uberwar,因此在进行战争之前,我只是将这些文件复制到公共资源中:

# deploy.sh
cp -r node_modules/ resources/public/node_modules/
lein ring uberwar

一切正常。

现在,我想将URI路径更改为说/static/而不是/node_modules/。我尝试将路由更改为:

(route/files "/static" {:root "node_modules/"})

,然后更新所有指向这些URI的HTML引用。这在开发(lein ring server-headless)中按预期方式工作,但是在生产(部署的warfile)中却失败了。在route/not-found下的任何路径都将调用我的/static/处理程序。

有什么作用?为什么URI路径仅在一个环境中与此有关?

1 个答案:

答案 0 :(得分:0)

我使用的是wrap-defaults(对于任何非平凡的网页来说似乎都是强制性的),默认情况下会添加route/resources。那是开发人员的禁忌之选,但导致产品按名称查找node_modules

这确实不是问题,但确实掩盖了实际问题。当我更改route/files调用时,它更改了dev的行为,但是在prod中没有使用。

我不知道什么是正确的解决方案,但是现在我要在:static中禁用wrap-defaults,并向{{ 1}}和route/files我自己,所以我对此拥有完全的控制权。