node中间层

node中间层

1、总结

一、node中间层做用:前端也是mvc,NodeJS以后,前端能够更加专一于视图层,而让更多的数据逻辑放在Node层处理 javascript

二、node中间层做用当发现全部请求量太多应付不过来的时候就能够考虑作这样的分离将处理页面渲染的请求分给另外一个服务,挡在前面,本身只负责数据相关的请求nodejs擅长处理io密集型任务,很适合作处理页面渲染的服务html

三、node中间层做用功能分离,减轻板块负担 前端

四、善用学习网站(不仅善用搜索引擎):去菜鸟教程或者别的里面首页能够了解例如node.js的做用vue

五、node.js部署在服务器上的js,能够部署一些高性能服务java

 

简单的说 Node.js 就是运行在服务端的 JavaScript。node

Node.js 是一个基于Chrome JavaScript 运行时创建的一个平台。nginx

Node.js是一个事件驱动I/O服务端JavaScript环境,基于Google的V8引擎,V8引擎执行Javascript的速度很是快,性能很是好。git

 

若是你是一个前端程序员,你不懂得像PHP、Python或Ruby等动态编程语言,而后你想建立本身的服务,那么Node.js是一个很是好的选择。程序员

Node.js 是运行在服务端的 JavaScript,若是你熟悉Javascript,那么你将会很容易的学会Node.js。github

固然,若是你是后端程序员,想部署一些高性能的服务,那么学习Node.js也是一个很是好的选择。

 

2、从NodeJS搭建中间层再谈先后端分离

以前在知道创宇的项目中有用到过nodejs做中间层,当时还不太理解其背后真正的缘由;后来在和一位学长交谈的过程当中,也了解到蚂蚁金服也在使用相似的方法使用nodejs做为中间层去请求真实后台的数据;以后人到北京,也见到如今的公司也在往nodejs后端方向靠拢。随着知识的增长,加之本身查阅资料,慢慢总结出了一些原理。

从作微信小程序引起的思考

最近出于爱好,写了个音乐播放器的微信小程序(本来想用vue写的,后来由于公司业务缘由,年后可能去作微信小程序,因此就换了前端技术栈),源码在个人GitHub上: wx-audio 。

思考:后端出于性能和别的缘由,提供的接口所返回的数据格式也许不太适合前端直接使用,前端所需的排序功能、筛选功能,以及到了视图层的页面展示,也许都须要对接口所提供的数据进行二次处理。这些处理虽能够放在前端来进行,但也许数据量一大便会浪费浏览器性能。于是现今,增长node端即是一种良好的解决方案

在个人微信小程序demo的server端代码中,我经过http模块对真实后台(网易云音乐API)发起http请求,而后经过express模块搭建后端服务

发起请求:

// http.js
var formatURL = require('./formatURL.js'); var http = require('http'); const POSThttp = function(request){ return new Promise((resolve, reject) => { let body = ''; // http模块拿到真实后台api的数据 http.get(formatURL(request.body.musicname), function(res){ res.on('data', (data) => { body += data; }).on('end', () => { // 格式化 const { name, audio: musicUrl, page, album: { name: musicName, picUrl, }, artists: [{ name: singer, }], } = JSON.parse(body).result.songs[0]; const reply = { name, picUrl, musicUrl, page, singer, }; resolve(reply); }); }); }); }; module.exports = POSThttp; 

获得数据传回前端:

var express = require('express'); var POSThttp = require('./POSThttp.js'); var bodyParser = require('body-parser'); // 使用body-parser解析post请求的参数,若是没有,req.body为undefined。 var app = express(); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); app.post('/', (req, res) => { POSThttp(req).then((data) => { res.send(data); }).catch((err) => { res.send(err); }); }); app.listen(3000, () => { console.log('open wx-audio server successful!') }); 

这几十行代码也就实现了一个简单的中间层的demo,并作到了在中间层格式化参数,便于前端进行使用的过程。

为何须要中间层?

其实这个问题,我认为跟面试常考的题:“为何须要先后端分离?”是相似的,其缘由能够概括为如下几点:

现今网站存在问题

以前有向一位在百度有多年工做经验的老前辈交谈这类问题,我所提到的搜狐公司代码冗余、先后端耦合的问题,他是这么回答而且给予我这样的建议:

其实,提炼出来,现今大公司的老项目(包括百度、搜狐等公司所采用的后端渲染等),或多或少都会存在这样的一些 问题 :

  • 前端代码愈来愈复杂
  • 先后端依旧高度耦合
  • 没法良好的支持跨终端

前辈们提出的解决方案

参考 淘宝先后端分离解决方案

  • 前端代码愈来愈复杂,咱们但愿尽量地减小工做量,开始使用相似MV*的分层结构,使前端后分离成为必要
  • 前端须要处理更多的工做,但愿有权操控View,Router(如:SPA的尝试)
  • 各类终端设备的兴起,须要咱们把页面适配到更多的地方

开始:咱们所尝试的CLIENT-SIDE MV* 框架,后端暴露数据接口、处理业务逻辑,前端接收数据、处理渲染逻辑。

关于MVC的定义:

MVC是一种设计模式,它将应用划分为3个部分:数据(模型)、展示层(视图)和用户交互(控制器)。换句话说,一个事件的发生是这样的过程:
  1. 用户和应用产生交互。
  2. 控制器的事件处理器被触发。
  3. 控制器从模型中请求数据,并将其交给视图。
  4. 视图将数据呈现给用户。
咱们不用类库或框架就能够实现这种MVC架构模式。关键是要将MVC的每部分按照职责进行划分,将代码清晰地分割为若干部分,并保持良好的解耦。这样能够对每一个部分进行独立开发、测试和维护。

如:Backbone, EmberJS, KnockoutJS, AngularJS等框架。

但这样的方式仍旧存在问题:

各层职责重叠

  • Client-side Model 是 Server-side Model 的加工
  • Client-side View 跟 Server-side是 不一样层次的东西
  • Client-side的Controller 跟 Sever-side的Controller 各搞各的
  • Client-side的Route 可是 Server-side 可能没有

性能问题

  • 渲染,取值都在客户端进行,有性能的问题
  • 须要等待资源到齐才能进行,会有短暂白屏与闪动
  • 在移动设备低速网路的体验奇差无比

重用问题

  • 模版没法重用,形成维护上的麻烦与不一致
  • 逻辑没法重用,前端的校验后端仍须在作一次
  • 路由没法重用,前端的路由在后端未必存在

跨终端问题

  • 业务太靠前,致使不一样端重复实现
  • 逻辑太靠前,形成维护上的不易

渲染都在客户端,模版没法重用,SEO实现 麻烦

NodeJS做为中间层的全栈开发方案

有了NodeJS以后,前端能够更加专一于视图层,而让更多的数据逻辑放在Node层处理。

咱们使用Node层:

  • 转发数据,串接服务
  • 路由设计,控制逻辑
  • 渲染页面,体验优化
  • 中间层带来的性能问题,在异步ajax转成同步渲染过程当中获得平衡
  • 更多的可能

其实更为重要的是,对于前端来讲,NodeJS的学习成本是至关低的:咱们无需学习一门新的语言,就能作到之前开发帮咱们作的事情,一切都显得那么天然。

技术在不断变化中,惟有跟上技术革新的浪潮,才能不被时代所淘汰,无论是人仍是企业。

 

 

3、node作中间层是什么意思,能具体详说么?

问题:

没接触过node,常常看文章说node作中间层,不知道具体指什么意思?好比在程序中解决了什么问题,若是说解决了渲染问题,那也是页面端,前端框架已经解决了,难道说是后端渲染前端框架,而后整个塞到前端吗?

 

解答:

不少项目中后端应用每每不止一个服务,而是一群各司其职的服务,好比nginx的存在就是由于服务器上运行着多个服务,而不一样的网络请求由不一样的服务处理,须要在这些服务前假设一层nginx作为代理,将请求分发给不一样的服务,nginx在这里的角色就至关于中间层

对于一个比较复杂的web站点,页面中的请求一般分为两种,请求页面与请求数据(ajax)。若是后端是个单体应用,当发现全部请求量太多应付不过来的时候就能够考虑作这样的分离将处理页面渲染的请求分给另外一个服务,挡在前面,本身只负责数据相关的请求nodejs擅长处理io密集型任务,很适合作处理页面渲染的服务,因而不少人选择了nodejs。淘宝也是相似的架构,听说如今全部淘宝的页面都是由node服务渲染的。

 

讲道理就是用nodejs作静态资源管理和请求转发。
作到后端只管数据接口,前端负责路由,静态资源。

 

加了node的中间层,可让前端处理view层和control层,后端只负责处理model层。先后端分离比较完全,分工更明确一些吧。

另外就是有些框架在服务器不是node的时候SEO比较难作。加了node中间层后比较好作SEO

 

node就是链状执行

请求接收 -> 中间件1 -> 中间件2 -> ... 中间件n ... -> 返回

中间件就是某一个处理操做

相关文章
相关标签/搜索