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

服務器頁面技術的優勢

傳統服務器頁面技術如jsp,aspx,php 的最大優勢就是隔離性很是好,強制解耦,又省去了手工定義路由的麻煩,文件路徑就直接表示了路由,對於新手很是友好,反觀node.js的框架koa,express等都須要手工定義路由,例如:php

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

Node.js 實現請求路徑自動路由

實現步驟以下:git

  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/homegithub

大功告成!!web

如何實現熱更新

如今能夠愉快的寫頁面了,不再用擔憂路由忘記定義了,可是修改完js文件的代碼後,每次都要重啓node才生效,傳統的頁面技術但是刷新一下頁面就能運行最新的代碼的,這是由於node require導入的文件模塊會緩存,要實現這個確定要祭出fs.watch這個大殺器了,實現步驟以下:數據庫

  1. 監控文件變化
  2. 刪除模塊緩存
  3. 再從新require進來

就是這麼簡單,代碼以下:express

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/…服務器

相關文章
相關標籤/搜索