這篇文章跟大家介紹一下node裡的靜態檔案中間件koa-static。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
相關推薦:《nodejs 教學》
細說koa-static使用
在app.js裡,若想指定目前目錄為託管目錄,我們通常會這樣做:
const static=require('koa-static') const Koa=require('koa') const app=new Koa() app.use(static('.')) app.listen(8081)
koa-static 是koa(node框架)中最常用的、較成熟的靜態web託管服務中間件 ,在koa中常用於例如外鏈靜態資源(如CSS檔案):
//下载 npm install koa-static --save
//引入 const server=require('koa-static')
//使用 app.use(server('static'))//或:app.use(server(__dirname+'/static'))
總之,server裡面一定是靜態模板(相對)路徑
然後我們就可以這樣使用static目錄下的css資料夾中的xxx.css檔案了:
<link rel="stylesheet" href="css/xxx.css" />
這麼簡單?那它的原理是啥?
根據檔案後綴名設定請求頭 “Content-Type”值,使其與瀏覽器渲染相符!
就拿上面說的static說:
#尋找
static/css/xxx.css
是否存在(若存在)設定
Content-Type: text/css;charset=utf-8;
透過response傳回瀏覽器
前面說了koa-static作用是☞靜態檔案託管☜ ,那肯定不只是對於CSS、JavaScript這類資源檔。
事實上,對於圖片,koa-static同樣可以用來設定 圖片快取 !就像這樣
const server=require('koa-static') const path=require('path') //path模块:设置路径信息 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);
——如果對應路徑中是jpg/GIF/png/jpeg格式的圖片,那麼就將其快取60s。
我們都知道,在express(node框架)中有一個關於靜態服務的「便捷方式」:
app.use('/teacher',express.static('/public'))
它可以指定靜態服務的「請求前綴」 ——就是指定載入相對於哪個url的靜態資源。
很明顯,這是非常實用的。我們突然想到,本文上面我們所說的koa-static都是相對於「全域 」作用的?
如何在koa中實現這個功能呢? koa為開發者提供了另一個(輔助)模組- 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是一個將中間件掛載到指定路徑的Koa中間件。它可以掛載任一Koa中間件!
前面說過,koa-static是一個中間件,所以koa-mount可以和koa-static結合,以實現和express一樣的靜態服務請求前綴的功能。
static原理探究
學習了上面神奇的使用方式,你有沒有想過它是怎麼實現的?
透過 npm info koa-static
,你會發現 koa-static 依賴兩個模組,分別是 debug 和 koa-send 。
找到koa-static 原始碼的index文件,其核心實作如下:
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 } } } }
而經過這段程式碼,我們發現其中實作核心是send()
方法,而這是由模組koa-send 提供的!
找到koa-send的原始碼,發現其核心實作原理也是很簡單的:
if (!ctx.type) ctx.type = type(path, encodingExt) ctx.body = fs.createReadStream(path)
其中type方法是根據檔案後綴來設定 Content-Type !很實用,但是我們這裡更要關注的是另一個比較有趣的事—— koa-send的原理:
設定Content-Type ,可透過檔案後綴進行設定;
以Stream形式為ctx.body賦值
為什麼說它有趣呢?
除了它竟然也是以設定content-type為目標外,stream串流的方式一直受到業界大拿們的推崇:因為它比 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 })
Koa回顧
其實在koa中,ctx.body的工作原理其實就和本文所說koa-static、koa-send 中間件相似:根據賦值類型來進行不同Content-type 的處理
根據body類型設定對應的Content-type
根據Content-type呼叫res.write或res.end,將資料寫入瀏覽器
關於Content-type值:
字串-又分為「text/html」和「text/plain」兩種類型(不一樣);
Buffer / Stream類型;
若不是以上任何類型,那麼應該就是JSON物件了
(原始碼中是透過typeof來判定其類型,這種技巧非常實用!
更多程式相關知識,請訪問:編程視頻!!
以上是深入淺析nodejs裡的koa-static中間件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫

JavaScript是現代Web開發的核心語言,因其多樣性和靈活性而廣泛應用。 1)前端開發:通過DOM操作和現代框架(如React、Vue.js、Angular)構建動態網頁和單頁面應用。 2)服務器端開發:Node.js利用非阻塞I/O模型處理高並發和實時應用。 3)移動和桌面應用開發:通過ReactNative和Electron實現跨平台開發,提高開發效率。

JavaScript的最新趨勢包括TypeScript的崛起、現代框架和庫的流行以及WebAssembly的應用。未來前景涵蓋更強大的類型系統、服務器端JavaScript的發展、人工智能和機器學習的擴展以及物聯網和邊緣計算的潛力。

JavaScript是現代Web開發的基石,它的主要功能包括事件驅動編程、動態內容生成和異步編程。 1)事件驅動編程允許網頁根據用戶操作動態變化。 2)動態內容生成使得頁面內容可以根據條件調整。 3)異步編程確保用戶界面不被阻塞。 JavaScript廣泛應用於網頁交互、單頁面應用和服務器端開發,極大地提升了用戶體驗和跨平台開發的靈活性。

Python更适合数据科学和机器学习,JavaScript更适合前端和全栈开发。1.Python以简洁语法和丰富库生态著称,适用于数据分析和Web开发。2.JavaScript是前端开发核心,Node.js支持服务器端编程,适用于全栈开发。

JavaScript不需要安裝,因為它已內置於現代瀏覽器中。你只需文本編輯器和瀏覽器即可開始使用。 1)在瀏覽器環境中,通過標籤嵌入HTML文件中運行。 2)在Node.js環境中,下載並安裝Node.js後,通過命令行運行JavaScript文件。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

記事本++7.3.1
好用且免費的程式碼編輯器

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。