Xitrum学习笔记10

摘要:
如果请求的url与pathRegex不匹配,Xitrum将返回响应404.XOKgP8_如果KIpqz9yUqZ1aVzw在开发和生产环境中使用相同的文件,则脚本依赖包将自动下载。您可以使用sbtxitrum包查看target/xitrum/lib下开发项目的依赖包和jar包。0CHJg71ucpG0OlzB-y6-mQXitrum将响应标头信息中的最大年龄和过期时间设置为1年。

在磁盘上的静态文件(Static Files)

Xitrum项目路径结构

config
public
  favicon.ico
  robots.txt
  404.html
  500.html
  img
    myimage.png
  css
    mystyle.css
  js
    myscript.js
src
build.sbt

Xitrum会自动注册 public/ 下的文件和路径。它们的URL格式是:

/img/myimage.png
/css/mystyle.css
/css/mystyle.min.css

引用它们的方法,publicUrl:

<img src={publicUrl("img/myimage.png")} />

在开发环境上引用普遍版本(本例为mystyle.css),在生产环境上使用最小版本(本例为mystyle.min.css)

<img src={publicUrl("css", "mystyle.css", "mystyle.min.css")} />

把静态文件传给action,使用 respondFile

respondFile("<绝对路径>")
respondFile("<相对于当前工作路径的路径>")

要优化静态文件的使用效率,就要避免不需要的文件能被正则表达式过滤器(pathRegex)查找到。

如果请求的url不能匹配pathRegex,Xitrum返回响应404。

pathRegex在 config/xitrum.conf进行设置

index.html fallback

如果一个URL没有对应的路径(Action)存在,那么Xitrum会试着找 public/这个URL/index.tml。如果这个index.html存在,将被返回给客户端。

404和500的html文件

public/404.html和500.html是用来处理没找到和处理出错的请求的。可以通过以下方式使用自定义的处理Action

import xitrum.Action
import xitrum.annotation.{Error404, Error500}
@Error404
class My404ErrorHandlerAction extends Action {
  def execute() {
    if (isAjax)
      jsRespond("alert(" + jsEscape("Not Found") + ")")
    else
      renderInlineView("Not Found")
  }
}
@Error500
class My500ErrorHandlerAction extends Action {
  def execute() {
    if (isAjax)
      jsRespond("alert(" + jsEscape("Internal Server Error") + ")")
    else
      renderInlineView("Internal Server Error")
  }
}

响应状态码 在action被执行之前 就已经设置好了,所以不用自己再设置

使用classpath中WebJar文件中的源文件

1. WebJars

WebJars以jar包的形式包装了很多客户端web库文件(如jQuery和Bootstrap),可以利用maven、SBT、Gradle等工具在项目中添加这些库的依赖

webjars官网:http://www.webjars.org/

要使用WebJars中的静态文件,如 Underscore.js,

1)要先在build.sbt中声明

libraryDependencies += "org.webjars" % "underscorejs" % "1.6.0-3"

2)然后在 .jade 模板文件中

script(src={webJarsUrl("underscorejs/1.6.0", "underscore.js", "underscore-min.js")})

Xitrum会自动在开发环境中使用underscore.js,在生产环境中使用underscore-min.js。

结果类似于:/webjars/underscorejs/1.6.0/underscore.js?XOKgP8_KIpqz9yUqZ1aVzw

如果在开发和生产环境都使用相同的文件,则

script(src={webJarsUrl("underscorejs/1.6.0/underscore.js")})

依赖包会自动下载(一般路径是 /Users/user/.ivy2),

可以使用sbt xitrum-package然后在target/xitrum/lib下查看依赖包以及所开发项目的jar包(如xitrum-new_2.12-1.0-SNAPSHOT.jar)。

如果依赖包版本与期望不符,可以在build.sbt中设置 dependencyOverrides以替代libraryDependencies中的版本。例如已经选择使用了jQuery2但必须使用jQuery1:

dependencyOverrides += "org.webjars" % "jquery" % "1.11.3"

2. 通过WebJar在jar包中保存源文件

例如要把 myimage.png通过 WebJar保存到mylib库中相关的jar包里:

META-INF/resources/webjars/mylib/1.0/myimage.png

在使用时,<img src={webJarsUrl("mylib/1.0/myimage.png")} />

在开发和生产环境中相应的URL是 /webjars/mylib/1.0/myimage.png?xyz123 

3. 返回在classpath中的文件

要向客户端响应返回在classpath jar包或路径中的文件内容,即使该文件没有保存在WebJars库里,使用

respondResource("相对于classpath的路径") 

示例:

respondResource("akka/actor/Actor.class")
respondResource("META-INF/resources/webjars/underscorejs/1.6.0/underscore.js")
respondResource("META-INF/resources/webjars/underscorejs/1.6.0/underscore-min.js")

客户端缓存 ETag 和 max-age

Xitrum会为磁盘上或是classpath中的静态文件自动添加 Etag。

小文件的ETag是文件内容的MD5,ETags被缓存起来供以后使用。缓存项的key是(file path,modified time)。

因为modified time在不同的server上可能不同,一个集群中的每一个web server都有它自己的本地ETag缓存。

publicUrl和webJarsUrl自动把ETag添加到它们问文件生成的URL上。如:

webJarsUrl("jquery/2.1.1/jquery.min.js")
=> /webjars/jquery/2.1.1/jquery.min.js?0CHJg71ucpG0OlzB-y6-mQ

Xitrum将响应头信息中的 max-age和Expire设置为1年。当磁盘上的文件变化时,它的修改时间就会改变,

因此由publicUrl和webJarsUrl生成的URL也会变化。相应地,它的ETag缓存也会因缓存项key的变化而改变

GZIP

Xitrum自动以gzip压缩文本响应内容,Xitrum会检查Content-Type头以确定响应内容是否为文本(text/html, xml/application)

Xitrum一直以gzip压缩静态文本文件,但是对于动态的文本响应,出于整体性能原因,它不会压缩小于1K的响应内容。

服务端缓存

为避免从磁盘上装载文件,Xitrum利用最近最少使用的算法把小的静态文件缓存到内存中。

可以通过config/xitrum.conf中的small_static_file_size_in_kb和max_cached_small_static_files进行配置

免责声明:文章转载自《Xitrum学习笔记10》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇IOS的UIPickerView 和UIDatePickerPython读写excel练习_去除excel中乱码行,并添加列下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关于在html 当中,换行的css样式总结

近在做web相关的项目,在项目当中遇到了相关的文字较长的时候出现超出页面显示的问题,所以要进行换行操作,在这里总结一下。 <style type="text/css"> /* 强制不换行 */ .nowrap{white-space:nowrap;} /* 允许单词内断句,首先会尝试挪到下一行,看...

css3部分选择器整理

整理些选择器,加深印象和理解 标签选择器 body{} 表示body标签 类选择器 .className{} 表示类名class为className的所有标签 id选择器 #idName{} 表示id为idName的所有标签 属性选择器 P[id="yt"]{} 表示所有P标签,且P标签的id属性为yt的所有标签 属性选择器 P[id^="y...

CSS3 border-image详解、应用

一、border-image的兼容性 border-image可以说是CSS3中的一员大将,将来一定会大放光彩,其应用潜力真的是非常的惊人。可惜目前支持的浏览器有限,仅Firefox3.5,chrome浏览器,Safari3+支持border-image。所以,就本文而言,IE浏览器可以回家休息了,Firefox3及其以下以及Opera浏览器也可以休息去看...

css3动画特效:上下晃动的div

<div class="container animated">上下晃动</div> /** * transform-origin 设置旋转元素的基点位置 * animation-name 设置动画名称 * animation-duration 设置动画时间 * animation-fill-...

利用CSS三角形实现的冒泡框

请用CSS实现如下图的样式,相关尺寸如图示,其中dom结构为:<div id=”demo”></div> 这是一道去年的百度笔试题。 涉及定位、三角形、伪元素。 下面是我的解答以及一些知识概述,都在程序里了。 <!DOCTYPE html> <html lang="en"> <head>...

css图片+文字浮动(文字包围效果)

css图片+文字浮动(文字包围效果): 在网页中,我们有时想实现这个效果,但是 <div id="test"> <img src="gdimages/01.jpg" alt=""/>《Web前端设计与开发-HTML+CSS+JavaScript+HTML 5+jQuery》是QST青软实训推出的“在实践中成长”系列丛书之...