ctressa和linecitats

轮子造了就写文章以免遗忘咯。

ctressa

ctressa是前一段时间对测试较为入迷。

所以阅读了一些断言库,断言框架的代码。

本质上断言框架例如 mocha,ava 这些,最初的实现大抵都是一个任务执行器。

每一个断言都是一段任务,执行测试就是执行这个任务队列。

mocha ava diff

mocha在全局引入了方法,原生不支持并发,以串行方式运行测试,在node和浏览器中简单使用。
ava利用导入,尽可能不影响全局变量,支持并发异步,测试文件作为单独的进程。有效隔离测试文件。

断言框架在如今也是很多的。具体选择还是需要看个人需求。

而断言库选择也不一,例如expect/chai/should/assert等等
他们之间大抵是测试语句风格不同

expect 不侵入原型链,与浏览器更好的兼容性
should = !以上

阅读了断言库较前的实现。
一句断言,例如expect(test).toBeA(‘number’)

可以分为左值待测试,右值是期待值。中间的谓词代表两者的关系。

should.js会在Object.prototype绑定should使得用法

var test = {name: 'zwkang'}

test.should.eql(test)

中间的谓词比较是断言库的核心吧。

那这样一来,JS是支持了中文变量的。是不是意味着我们可以使用中文方式制作一个断言库。

中华语言博大精深。中间的连接词相对来说太多使用方式了。

一句话能有几种表达方式是常事。所以选择一种折中的表达方式,合理的表达断言。

ctressa 可以这么表达。

希望({}).是.对象;
希望(true).为真值;

note:

  1. mocha会捕获showDiff 再确定是否拿期待值与待测试值做彻底比较。 line 41
  2. ctressa 模拟node.0.x实现Error
  3. 在原有英文结构中,对字段做中文的alias赋值。

linecitats

是一个类似now.sh 的server工具。

它可以允许我们在命令行对资源文件夹建立目录。

流程并不复杂

  1. 初始化配置 例如文件夹位置等
  2. 启动服务器
  3. 压缩文件中间件
  4. 文件的缓存

实际上一个服务器提供资源到客户端,中间可能存在很多的资源服务器例如cdn,缓存服务器等等。

1. 初始化配置

初始化配置很简单,最简单肯定是直接传入文件夹。

初始化

2. 启动服务器

我们这里其实可以直接用http模块。

但是koa在对我们的response body,header做操作会更舒服。

所以这里可以基于koa做服务器的启动。当然express之类的都是没问题的。

3. 压缩文件中间件

文件的压缩 压缩文件

deflate/gzip是是两种比较常见的压缩方案。

常见的压缩协商方案:

浏览器通过请求头部的 Accept-Encoding 告知浏览器,它支持的压缩方案

服务器收到了浏览器的请求,选择一种或多种压缩方案。压缩资源返回浏览器,并且报文头部 Content-Encoding 表明压缩方案。

使用vary字段,让中间缓存服务器可以对不同的 Accept-Encoding 资源做缓存。不然的话,每次请求都是一致的缓存,浏览器可能无法支持解压。

4. 对资源的缓存

我们常见的缓存方案无非就包括了,强缓存/协商缓存

区别在于是否会像服务端请求资源。

强缓存分为Expires与Cache-Control,优先级上Cache-Control大于Expires。出现版本一个是HTTP 1 一个是HTTP 1.1

http1 与http1.1一个大区别就是连接是否可复用。

缓存首先会查看Expires与Cache-Control,如果存在的话,判断强缓存是否实现。如果失效了,再从服务器请求资源,此时协商缓存的作用,就是判断资源的存活性,一个按照lastModified 文件最后修改时间,一个Etag按照文件的一些特定内容,例如文件内容的sha1值。

lastModified === ctx.get("If-Modified-Since")
      fileSum === ctx.get("is-none-match")

Etag与lastModified 同时存在的话必须 两者同时通过方可返回304状态码,告知浏览器资源未被修改。

这样一来,我们可以简单地使用强缓存与协商缓存达到,缓存地效果。

同时因为这块是直接koa中间件写的,不妨提供一个方法,供我们以后充当类库使用复用。

middleware


总结:

  1. 造轮子可以获得知识,产出的代码可以化为记录。
  2. 希望能做一些好的类库。

发表评论

电子邮件地址不会被公开。 必填项已用*标注