傳統服務器頁面技術如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
實現步驟以下:git
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);
複製代碼
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這個大殺器了,實現步驟以下:數據庫
就是這麼簡單,代碼以下:express
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 開發框架webcontext,並實現了請求上下文封裝、靜態文件服務、反向代理、數據庫訪問,sesison存取、日誌記錄等web應用服務器必備功能 ,若是喜歡,求star緩存
傳送門: github.com/windyfancy/…服務器