十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
這篇文章主要介紹“nodejs里的koa-static中間件是什么”,在日常操作中,相信很多人在nodejs里的koa-static中間件是什么問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”nodejs里的koa-static中間件是什么”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:國(guó)際域名空間、網(wǎng)站空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、岑溪網(wǎng)站維護(hù)、網(wǎng)站推廣。
本篇文章給大家介紹一下node里的靜態(tài)文件中間件koa-static。有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)大家有所幫助。
相關(guān)推薦:《nodejs 教程》
在app.js里,若想指定當(dāng)前目錄為托管目錄,我們一般會(huì)這樣做:
const static=require('koa-static') const Koa=require('koa') const app=new Koa() app.use(static('.')) app.listen(8081)
koa-static就是koa(node框架)中最常用的、較為成熟的 靜態(tài)web托管服務(wù)中間件,在koa中常用于比如外鏈靜態(tài)資源(如CSS文件):
//下載 npm install koa-static --save
//引入 const server=require('koa-static')
//使用 app.use(server('static'))//或:app.use(server(__dirname+'/static'))
總之,server里面一定是靜態(tài)模板(相對(duì))路徑
然后我們就可以這樣使用static目錄下的css文件夾中的xxx.css文件了:
這么簡(jiǎn)單?那它的原理是啥?
根據(jù)文件后綴名設(shè)置請(qǐng)求頭 「Content-Type」值,使之與瀏覽器渲染相匹配!
就拿上面說(shuō)的static說(shuō)吧:
尋找 static/css/xxx.css
是否存在
(若存在)設(shè)置 Content-Type: text/css;charset=utf-8;
通過(guò)response返回給瀏覽器
前面說(shuō)了koa-static作用是 ?靜態(tài)文件托管? ,那肯定不只是對(duì)于CSS、JavaScript這類資源文件。
事實(shí)上,對(duì)于圖片,koa-static同樣可以用于設(shè)置 圖片緩存!就像這樣
const server=require('koa-static') const path=require('path') //path模塊:設(shè)置路徑信息 const staticPath=path.resolve(__dirname,'static') const staticServer=server(staticPath,{ setHeadears:(res,path,stats)=>{ if(path.indexOf(/[jpg|png|gif|jpeg]/)>-1){ res.setHeader('Cache-Control',['private','max-age=60']) } } }) app.use(staticServer);
——如果對(duì)應(yīng)路徑中是jpg/GIF/png/jpeg格式的圖片,那么就將其緩存60s。
我們都知道,在express(node框架)中有一個(gè)關(guān)于靜態(tài)服務(wù)的“便捷方式”:
app.use('/teacher',express.static('/public'))
它可以指定靜態(tài)服務(wù)的“請(qǐng)求前綴” —— 就是指定加載相對(duì)于哪個(gè)url的靜態(tài)資源。
很明顯,這是非常實(shí)用的。我們突然想到,本文上面我們所說(shuō)的koa-static都是相對(duì)于“全局”作用的?
如何在koa中實(shí)現(xiàn)這個(gè)功能呢?koa為開發(fā)者提供了另一個(gè)(輔助)模塊 —— koa-mount
const Koa=require('koa') const server=require('koa-static') const mount=require('koa-mount') const app=new Koa() app.use(mount('/teacher',server('/public')))
koa-mount是一個(gè)將中間件掛載到指定路徑的Koa中間件。它可以掛載任意Koa中間件!
前面說(shuō)過(guò),koa-static是一個(gè)中間件,所以koa-mount可以和koa-static結(jié)合,以實(shí)現(xiàn)和express一樣的靜態(tài)服務(wù)請(qǐng)求前綴的功能。
學(xué)習(xí)了上面神奇的使用方式,你有沒(méi)有想過(guò)它是怎么實(shí)現(xiàn)的?
通過(guò) npm info koa-static
,你會(huì)發(fā)現(xiàn) koa-static 依賴兩個(gè)模塊,分別是 debug 和 koa-send 。
找到 koa-static 源碼的index文件,其核心實(shí)現(xiàn)如下:
const send = require('koa-send'); //... function serve (root, opts) { //... return async function serve (ctx, next) { await next() if (ctx.method !== 'HEAD' && ctx.method !== 'GET') return if (ctx.body !== null && ctx.status !== 404) return // eslint-disable-line try { await send(ctx, ctx.path, opts) }catch (err) { if (err.status !== 404) { throw err } } } }
而經(jīng)過(guò)這段代碼,我們發(fā)現(xiàn)其中實(shí)現(xiàn)核心是 send()
方法,而這是由模塊 koa-send提供的!
找到koa-send的源碼,發(fā)現(xiàn)其核心實(shí)現(xiàn)原理也是很簡(jiǎn)單的:
if (!ctx.type) ctx.type = type(path, encodingExt) ctx.body = fs.createReadStream(path)
其中type方法是根據(jù)文件后綴來(lái)設(shè)置 Content-Type!很實(shí)用,但是我們這里更要關(guān)注的是另一個(gè)比較有趣的事 —— koa-send的原理:
設(shè)置 Content-Type ,可通過(guò)文件后綴進(jìn)行設(shè)置;
以Stream形式為ctx.body賦值
為什么說(shuō)它有趣呢?
除了它竟然也是以設(shè)置content-type為目標(biāo)外,stream流的方式一直受到業(yè)界大拿們的推崇:因?yàn)樗?fs.readFileSync
更高效!
讓我們拿下面這段代碼和上面 koa-send 的源碼作比較:
app.use(function(ctx){ const fs=require('fs') const result=fs.readFileSync('xxx') ctx.type=type(result, encodingExt) ctx.body=result })
其實(shí)在koa中,ctx.body的工作原理其實(shí)就和本文所說(shuō) koa-static、koa-send 中間件相似:根據(jù)賦值類型來(lái)進(jìn)行不同 Content-type 的處理
根據(jù)body類型設(shè)置對(duì)應(yīng)的Content-type
根據(jù)Content-type調(diào)用res.write或者res.end,將數(shù)據(jù)寫入瀏覽器
關(guān)于Content-type值:
字符串——又分為“text/html”和“text/plain”兩種類型(不一樣);
Buffer / Stream類型;
若不是以上任何類型,那么應(yīng)該就是JSON對(duì)象了
(源碼中是通過(guò)typeof來(lái)判定其類型,這種技巧非常實(shí)用!
到此,關(guān)于“nodejs里的koa-static中間件是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!