共计 1799 个字符,预计需要花费 5 分钟才能阅读完成。
轮子造了就写文章以免遗忘咯。
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 中间件写的,不妨提供一个方法,供我们以后充当类库使用复用。
middleware
总结:
- 造轮子可以获得知识,产出的代码可以化为记录。
- 希望能做一些好的类库。