上一章【認識 MIME 和 HTTP】。
我們認識和了解了 MIME 的概念和作用,也簡單地學習了通過瀏覽器控制臺查看請求和返回的用法。
通過對不同的 HTML、CSS、JS 文件進行判斷,設置不同的 MIME 值,得以讓我們的瀏覽器正正確地接收和顯示不同的文件內容,渲染出正確的效果。
但真實場景中,遠遠不止這三種類型的文件,用成百上千來形容也不為過。
上圖是一個開源的項目,地址是 https://github.com/jshttp/mime-db。
該項目對所有文件類型的擴展名和 MIME 類型進行了映射。
知道文件擴展名,就能找到對應的 MIME 類型。
知道 MIME 類型,就能知道哪些文件擴展名可以匹配。
但是,也正如它的倉庫名字 “mime-db” 所表達的,它是一個映射庫。
也就是說,它只是提供了一堆數據,具體如何實現根據擴展名獲取 MIME 類型,那得用到另外一個開源項目 https://github.com/jshttp/mime-types。
從截圖中就能看到相關的文字說明,這個項目依賴了 mime-db 項目。而且,這 2 個項目是同一批作者。
mime-types 提供了多個方法,比較常用的就是 lookup 方法,根據文件擴展名,返回對應的 MIME 值。
目前,這 2 個項目在 npm 平臺的周下載量,均在 5 千萬次以上,眾多知名項目都依賴于這 2 個項目。在 github 上,有 3 千多萬個倉庫依賴了 mime-types。
而現在,我們的 web 服務器也將使用 mime-types 完成我們今天的主題:靜態資源服務器。
實現靜態資源服務器
在用 mime-types 之前呢,首先要安裝這個依賴,請看上圖:
在 (1) 處安裝,(2) 處的 package.json 文件中就有這個依賴了。
下一步呢,就在我們的項目中用起來。
這里涉及到幾個步驟,一一說明下。
首先呢,當我們直接在瀏覽器端輸入 http://127.0.0.1:3000 訪問的時候,請求的 url 值是 “/”。
沒有任何擴展名,也沒有文件名,服務器遇到這種情況怎么辦呢?總不能什么也不返回吧,那么我們的 WEB 服務器探索之路就到此終止了。
市面上的 WEB 服務器,比如 Apache、Nginx、Caddy、Tomcat。或者 Node.js 中的 Koa、Express、Fastify 等等。一般都會對這種靜態文件服務器的 “根” 請求,返回默認的 index.html 文件。
我們這里也不例外,如果是 “根 (/)” 請求,就把請求內容改成 index.html。
其次呢,根據我們請求的資源,通過我們上面說到過的,mime-types 依賴的 lookup 函數,去獲取該文件對應的 MIME 值,設置給返回數據的請求頭中的 Content-Type 屬性。
如果對這個設置頭部屬性印象模糊了,請看前面章節內容。
最后呢,再通過 readFileSync 文件讀取函數,獲取對應的請求文件內容,返回給瀏覽器。
那么經過這么一操作,我們的代碼量不僅減少了,程序也更健壯了,支持的文件類型也更多了,可以不加多余的代碼邏輯,就能顯示不同的資源了。
當然,目前的功能,距離真正的流行的 Web 框架還差得遠,同時正如前文所說,本小冊分為兩大部分。
第一大部分,是通過一個 Web 服務器的誕生,來進一步理解其工作流程。
第二大部分,就是通過我們這個 Web 服務器,來寫一個全棧的個人博客項目。
這樣,我們就能夠掌握 Node.js 全棧開發的秘訣,不管是后面使用其他 Web 框架,還是自己寫一個前后端一體化的全棧產品,都會更加輕松了。