轮子造了就写文章以免遗忘咯。
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:
- mocha会捕获showDiff 再确定是否拿期待值与待测试值做彻底比较。 line 41
- ctressa 模拟node.0.x实现Error
- 在原有英文结构中,对字段做中文的alias赋值。
linecitats
是一个类似now.sh 的server工具。
它可以允许我们在命令行对资源文件夹建立目录。
流程并不复杂
- 初始化配置 例如文件夹位置等
- 启动服务器
- 压缩文件中间件
- 文件的缓存
实际上一个服务器提供资源到客户端,中间可能存在很多的资源服务器例如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中间件写的,不妨提供一个方法,供我们以后充当类库使用复用。
总结:
- 造轮子可以获得知识,产出的代码可以化为记录。
- 希望能做一些好的类库。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。