Express細節探究(1)——app.use(express.static)

express相信是不少人用nodejs搭建服務器的首選框架,相關教程有不少,也教會了你們來如何使用。若是你想更深的瞭解他的細節,不妨和我一塊兒來研究一下。javascript

先來看一個每一個人都用到的方法app.use(express.static(__dirname+'/public'));php

你確定在你的app文件中這麼用過它:css

  app.use(express.static(__dirname + '/public'));//設置靜態文件目錄

正如註釋中寫的那樣,這句話的意思是,將靜態文件目錄設置爲項目根目錄+/public,固然你也多是這麼寫的:html

app.use(express.static(path.join(__dirname, 'public')));//和上面是同樣的

運用path模塊的join方法效果和前面是等價的,注意這裏要引入path模塊。前端

你有沒有產生過疑問,爲何這句話可以幫咱們設置靜態文件目錄呢?他到底作了些什麼呢?java

爲了照顧初學者,咱們不妨先從最基本的靜態資源文件提及,什麼是靜態資源文件呢?node

靜態資源文件通俗的能夠理解成對於不一樣的用戶來講,內容都不會變化的文件。好比不論是張三李四仍是王五訪問百度,他們所接收到的看到的圖片、css文件和前端javascript文件都是同樣的,咱們稱這類文件爲靜態資源文件。express

那麼響應的,對於不一樣用戶作出不一樣反應的就是動態文件了,張三李四王五登陸百度,百度會分別對他們顯示"你好張三"、"你好李四"、"你好王五",那麼負責這麼動態邏輯的文件就是動態文件了,根據你是用的技術不一樣,動態文件多是.jsp文件、php文件或者咱們node.js的服務器端js文件。服務器

那麼app.use()方法又幹了什麼事情呢,咱們先來看看官方API怎麼說的:app

大意是說,app.use是用來給path註冊中間函數的,這個path默認是'/',也就是處理任何請求,同時要注意的是他會處理path下的子路徑,好比若是設置path爲'/hello',那麼當請求路徑爲'/hello/','/hello/nihao','/hello/bye'這樣的請求都會交給中間函數處理的。

因而咱們如今知道了app.use(express.static(__dirname + '/public'))是將全部請求,先交給express.static(__dirname + '/public')來處理一下,雖然咱們暫時不知道express.static()的處理細節,可是這不影響咱們作出一些推測,最起碼咱們能夠知道,express.static()的返回值確定是一個函數。

官方文檔十分詳盡,像咱們解釋了express.static()的一些細節,我簡單的翻譯給你們:

Serving static files in Express

爲了提供對靜態資源文件(圖片、csss文件、javascript文件)的服務,請使用Express內置的中間函數 express.static 。

傳遞一個包含靜態資源的目錄給 express.static 中間件用於馬上開始提供文件。好比用如下代碼來提供public目錄下的圖片、css文件和javascript文件:

app.use(express.static('public'));

如今,你能夠加載 public目錄下的文件了:

http://localhost:3000/images/kitten.jpg
http://localhost:3000/css/style.css
http://localhost:3000/js/app.js
http://localhost:3000/images/bg.png
http://localhost:3000/hello.html

Express 會在靜態資源目錄下查找文件,因此不須要把靜態目錄做爲URL的一部分。

 經過屢次使用 express.static 中間件來添加多個靜態資源目錄:

app.use(express.static('public'));
app.use(express.static('files'));

Express 將會按照你設置靜態資源目錄的順序來查找靜態資源文件。

爲了給靜態資源文件建立一個虛擬的文件前綴(實際上文件系統中並不存在) ,可使用 express.static 函數指定一個虛擬的靜態目錄,就像下面這樣:

app.use('/static', express.static('public'));

如今你可使用 /static 做爲前綴來加載 public 文件夾下的文件了。

http://localhost:3000/static/images/kitten.jpg
http://localhost:3000/static/css/style.css
http://localhost:3000/static/js/app.js
http://localhost:3000/static/images/bg.png
http://localhost:3000/static/hello.html

然而,你提供給 express.static 函數的路徑是一個相對node進程啓動位置的相對路徑。若是你在其餘的文件夾中啓動express app,更穩妥的方式是使用靜態資源文件夾的絕對路徑: 

app.use('/static', express.static(__dirname + '/public'));
相關文章
相關標籤/搜索