Node.js 實現類似於.php,.jsp的伺服器頁面技術,自動路由

windyfancy發表於2019-05-05

伺服器頁面技術的優點

傳統伺服器頁面技術如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 實現請求路徑自動路由

實現步驟如下:

  1. 獲取到請求路徑
  2. 使用path.resolve查詢專案目錄中是否有同名的js檔案
  3. require引入檔案,必須實現一個約定好的方法名以供呼叫,如onRequest
  4. 呼叫該檔案中指定的方法

/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

大功告成!!

Node.js 實現類似於.php,.jsp的伺服器頁面技術,自動路由

如何實現熱更新

現在可以愉快的寫頁面了,再也不用擔心路由忘記定義了,但是修改完js檔案的程式碼後,每次都要重啟node才生效,傳統的頁面技術可是重新整理一下頁面就能執行最新的程式碼的,這是因為node require匯入的檔案模組會快取,要實現這個肯定要祭出fs.watch這個大殺器了,實現步驟如下:

  1. 監控檔案變化
  2. 刪除模組快取
  3. 再重新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

傳送門: github.com/windyfancy/…

相關文章