Skip to content

静态资源(Static Resources)

YANG YUE edited this page Aug 9, 2016 · 1 revision

Web应用经常需要服务静态内容,例如图片或者样式表.Ring提供了两个中间件函数来做这个事情.

一个是wrap-file.它服务来自当前文件系统一个目录的静态内容:

(use 'ring.middleware.file)
(def app
  (wrap-file your-handler "/var/www/public"))

另一个是wrap-resource.它服务来自JVM classpath下的静态内容:

(use 'ring.middleware.resource)
(def app
  (wrap-resource your-handler "public"))

如果你使用一个Clojure构建工具,像Leiningen,一个项目的non-source-file资源保存在resources目录中.目录中的文件自动的保存jar或者war文件中.

所以在上面的例子中,文件被放在resources/public目录将会被当做静态文件.

经常性的你想要结合wrap-file或者wrap-resource和其他中间件,通常是wrap-content-typewrap-not-modified:

(use 'ring.middleware.resource
     'ring.middleware.content-type
     'ring.middleware.not-modified)

(def app
  (-> your-handler
      (wrap-resource "public")
      (wrap-content-type)
      (wrap-not-modified))

wrap-content-type中间件选择一个content-type基于文件扩展.例如,一个文件叫做hello.txt将会获得一个text/plain的content-type.

wrap-not-modified中间件在响应中检查(最后定义)Last-Modified的header对应着在请求中的If-Modified-Since的header.通过确保客户端不需要下载它们已经缓存的资源,这回节省带宽.

注意这个额外的中间件需要环绕(另一种说法 紧跟)wrap-resource或者wrap-file函数.