輪子造了就寫文章以免遺忘咯。
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中間件寫的,不妨提供一個方法,供我們以後充當類庫使用複用。
總結:
- 造輪子可以獲得知識,產出的代碼可以化爲記錄。
- 希望能做一些好的類庫。