原生node寫乙個靜態資源伺服器

2022-08-27 22:12:24 字數 3793 閱讀 5828

用原生node做乙個簡易閹割版的anywhere靜態資源伺服器,以提公升對node與http的理解。

相關知識

path模組

http模組

fs模組

fs.createreadstream(filepath).pipe(res)

檔案可讀流的形式,使讀取效率更高

}// 如果是乙個檔案

if (stats.isfile()) else if (stats.isdirectory()) )}})

})server.listen(conf.port, conf.hostname, () => :$`

console.info(`run at $`)

})

為了避免多層**出現,我們使用jsasync 和 await來 改造我們的**

})

上面的工作 已經可以讓我們在頁面中看到資料夾的目錄,但是是文字,不可點選

使用handlebars渲染新建mime.js檔案

const path = require('path')

const mimetypes =

module.exports = (filepath) =>

return mimetypes[ext] || mimetypes['.txt']

}

mine.js 根據檔案字尾名來返回對應的mime

對讀取的stream壓縮

在 defaultconfig.js中 新增 compress項

module.exports =
編寫壓縮處理 compress

const  = require('zlib')

module.exports = (rs, req, res) => else if (acceptencoding.match(/\bgzip\b/)) else if (acceptencoding.match(/\bdeflate\b/)) }/*

match() 方法可在字串內檢索指定的值,或找到乙個或多個正規表示式的匹配。

該方法類似 indexof() 和 lastindexof() ,但是它返回指定的值,而不是字串的位置。

*/

router.js中讀取檔案的更改

...

let rs = fs.createreadstream(filepath)

if (filepath.match(config.compress))

rs.pipe(res)

檔案結果compress壓縮後,壓縮率可達 70%

快取大致原理

使用者請求 本地快取 --no--> 請求資源 --> 協商快取 返回響應

使用者請求 本地快取 --yes--> 判斷換存是否有效 --有效--> 本地快取

--無效--> 協商快取 返回響應

快取header

cache.js

const  = require('../config/defaultconfig')

function refreshres(stats, res) = cache

if (expires)

if (cachecontrol) `)

} if (lastmodified)

if (etag) -$`)

}}module.exports = function isfresh(stats, req, res)

if (lastmodified && lastmodified !== res.getheader('last-modified'))

if (etag && res.getheader('etag').indexof(etag) )

return true

}

router.js

// 如果檔案是是新鮮的 不用更改,就設定響應頭 直接返回

if (isfresh(stats, req, res))

編寫openurl.js

const  = require('child_process')

module.exports = url => `)

break

case 'win32':

exec(`start $`)

}}

只支援windows和 mac系統

server.listen(conf.port, conf.hostname, () => :$`

console.info(`run at $`)

openurl(addr)

})

domo不難,但是涉及到的零碎知識點比較多,對底層的node有個更進一步了解,也感受到了node在處理網路請求這一塊的強大之處,另外es6和es7的新語法很是強大,以後要多做功課。

利用node發布乙個靜態資源服務

首先將node的fs模組裡面的方法封裝成promise模式 let fs require fs path require path 儲存的是當前模組執行所在的絕對路徑 dirname 建立web服務 let port 8686 let handle function handle req,res u...

使用原生node做乙個簡單的node伺服器

const http require http 伺服器模組 const fs require fs 檔案讀取 const url require url 解析url位址 const querystring require querystring 解析post資料 const zlib require...

node使用http 模組搭建乙個靜態伺服器

頁面結構如下 實現 如下 使用http模組實現靜態資源伺服器 搭建靜態資源伺服器,需要自身建立乙個伺服器 結束 res.end server.listen 9527 server.on listening 通過位址獲取檔案的資訊 param url 檔案的位址 returns async funct...