内容简介:传统服务器页面技术如jsp,aspx,php 的最大优点就是隔离性非常好,强制解耦,又省去了手工定义路由的麻烦,文件路径就直接表示了路由,对于新手非常友好,反观node.js的框架koa,express等都需要手工定义路由,例如:每增加一个接口都需要手工定义一个路由,需要抽离出来一个routers.js专门定义这些路由,频繁改动,甚至有些开发同学图省事就直接在文件里写逻辑代码了。 node.js能否实现页面技术自动路由到对应的js文件呢,答案是肯定的。实现步骤如下:
传统服务器页面技术如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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 类似Github的webhook实现
- 类似 Qt 的 GOSP 发布修复更新
- ASP实现类似hashMap功能的类
- 使用 Reactor 完成类似 Flink 的操作
- PHP实现类似题库抽题效果
- java实现golang类似的chan
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。