伺服器頁面技術的優點
傳統伺服器頁面技術如jsp,aspx,php 的最大優點就是隔離性非常好,強制解耦,又省去了手工定義路由的麻煩,檔案路徑就直接表示了路由,對於新手非常友好,反觀node.js的框架koa,express等都需要手工定義路由,例如:
const Koa = require('koa')
const router = require('koa-router')()
const app = new Koa()
router.get('/home', async (ctx, next) => {
ctx.response.body = '<h1>Hello,Home Page</h1>'
})
複製程式碼
每增加一個介面都需要手工定義一個路由,需要抽離出來一個routers.js專門定義這些路由,頻繁改動,甚至有些開發同學圖省事就直接在檔案裡寫邏輯程式碼了。 node.js能否實現頁面技術自動路由到對應的js檔案呢,答案是肯定的。
Node.js 實現請求路徑自動路由
實現步驟如下:
- 獲取到請求路徑
- 使用path.resolve查詢專案目錄中是否有同名的js檔案
- require引入檔案,必須實現一個約定好的方法名以供呼叫,如onRequest
- 呼叫該檔案中指定的方法
/app.js
const http=require("http");
const Path=require("path");
const Url=require("url");
const fs=require("fs");
var server=http.createServer(function (req,res){
var relPath=Url.parse(req.url,true).pathname;
var absPath=Path.resolve(__dirname,"."+relPath+".js")
if(fs.existsSync(absPath)){
var pageObj=require(absPath);
if(pageObj.onRequest){
pageObj.onRequest(req,res)
}
}
})
server.listen(80);
複製程式碼
/home.js
module.exports={
onRequest:function (req,res){
res.end("<h1>Hello,Home Page</h1>");
}
}
複製程式碼
node app.js執行後,現在訪問: http://localhost/home
大功告成!!
如何實現熱更新
現在可以愉快的寫頁面了,再也不用擔心路由忘記定義了,但是修改完js檔案的程式碼後,每次都要重啟node才生效,傳統的頁面技術可是重新整理一下頁面就能執行最新的程式碼的,這是因為node require匯入的檔案模組會快取,要實現這個肯定要祭出fs.watch這個大殺器了,實現步驟如下:
- 監控檔案變化
- 刪除模組快取
- 再重新require進來
就是這麼簡單,程式碼如下:
app.js
const fs=require("fs");
const Path=require("path");
fs.watch(__dirname,{
persistent: true,
recursive: true
},function(event,filename){
if (event === "change") {
let fullName=Path.resolve(__dirname,filename);
if(Path.extname(fullName)==".js"){
if (require.cache[fullName]) {
require.cache[fullName] = null;;
}
require(fullName);
}
}
});
複製程式碼
Node.js 伺服器頁面開發框架推薦
根據本文思路,我已經實現了一個相對比較完備的Node.js 開發框架webcontext,並實現了請求上下文封裝、靜態檔案服務、反向代理、資料庫訪問,sesison存取、日誌記錄等web應用伺服器必備功能 ,如果喜歡,求star