学习东西总是要循序渐进的,吃多了会噎着,吃少了又会饿。 但是每个人的接受能力是存在差异的,适当的加快自己的步伐,但又需要把握自己的节奏。
几个概念
在前面介绍了Nodejs的安装后,相信很多人已经开始尝试练习Nodejs的开发环境了。但是在真正的开发之前,我希望我们对于以下几个概念有一个清楚的认识,清除我们在基本概念理解上的雾霾。
Nodejs 与 Javascript
首先,我们要理清楚Nodejs与Javascript的关系。 很早之前,Javascript是一个只能运行在浏览器端的语言,通常只能在浏览器里操作DOM,然后其它的事情就基本干不了了。 然后有一些基于Javascript的后端开发尝试,但是都不是非常成功,直到Nodejs的出现。 所以我们要很清楚Nodejs是Javascript在非浏览器端的一个实现,它的目标是实现高性能Web服务器的,因此首先它是一个后端开发语言环境。基于我们之前的介绍,Nodejs是一个基于高速网络IO,提供了事件机制,提供了网络接口,功能相对受限的,以支持网络开发为目的的Javascript环境。如果有人称Nodejs为语言,其实也是可以接受的,因为语言通常是带有环境套件的。但是称Nodejs为Javascript的非浏览器端环境则是更加准确的描述。
Nodejs默认是服务器开发环境,也就是后端开发环境
所以我们可以看到浏览器端JS环境与Nodejs的JS环境的差异如下: 浏览器端: Javascript + DOM + BOM + 事件机制 Nodejs: Javascript + 网络库和网络IO(异步IO) + 事件机制(EventLoop) + 原生组件机制(Addons )+包机制( npm)
所以通常没有前缀的Nodejs开发指的是后端/桌面开发,而不是前端开发。
Nodejs提供了最给力的前端开发工具,但前端开发环境并不是Nodejs的唯一服务方向
由于在语言上的共通性,自从Nodejs出来后,又出现了Bower/Grunt/Gulp/Webpack/Browserify/Uglify等各种工具服务于前端开发。所以如果有人称他是Nodejs前端开发,通常是指基于这类前端工具的前端开发。 这种融合也导致了很多人对nodejs定位的错觉,认为Nodejs是一种前端开发环境。而实际上前端开发只是Nodejs擅长的领域之一,这是所有使用Nodejs开发人的所需要区分好的。 Nodejs提供了目前最好的前端工具链,但是Nodejs并不完全是前端开发环境,他还有更多的可以发挥能力的领域。
前后端、前后端同构
由于现在我们仍处在Nodejs高速发展的时代,前端与后端在代码上越来越趋同,同构代码也占领了不少Nodejs模块的市场。所以对于所有的人来说正确的理解前后端,以及前后端同构等概念是一件非常重要的事情。 所以这里,我们再仔细的区分一下。 在我们讨论前后端时需要非常注意的一个地方就是我们讨论的前后端是指Web前后端,而不是其它的前后端。因为一支笔也有前后端,任何东西都有前后端,所以如果不能明确我们的讨论范围,那么讨论就会失去意义。 所以我们这里要明确的是Web前后端的定义,它的定义如下:
Web前后端是指HTTP协议连接的两端,它们是通过运行环境区分的,通常浏览器端就是前端,服务器端就是后端。
而由于使用Nodejs后,前后端的代码都是JS,这就会产生一个代码冗余与共享的问题。 通常,除了我们看到的运行环境的差异外,是可以有很多的共享空间的。所以目前也有很多框架将前后端代码共享(即同构)作为一个非常重要的目标来实践,其中最典型的就是Metoer。
所以前后端同构就是指前后端共用一套代码。 简单来说:
运行于浏览器端的内容就是前端技术关注的内容,运行于服务器端的内容就是后端技术关注的内容,而在技术层面前后端是可以通用的。比如模板技术既是前端关注的内容,也是后端关注的内容。这也就是同构的意义。
所以我们无法通技术本身来区分前后端,只有通过运行环境才能确定前后端。
前后端同构在未来有多大的发展我们尚不可知,但是既然有人已经开始尝试了,我们也就有必要去了解一下。
前后端分离
基于上面我们对前后端的定义,我们可以看出来,前后端本身就是意义明确且分离的。前后端是指浏览器与服务器环境。所以前后端分离是指浏览器与服务器的分离,而这种分离是早就存在着的。所以前后端本身就是分离的,提前后端分离显然是多余的,也是没有意义的。 那么为什么前后端分离仍有很多人在说呢?可能他们更想表达的是MVC的分离与前后端职责的划分,而不是Web意义上的前后端分离。 由于Nodejs、前端框架、RESTful APIs等技术的兴趣导致原来只需要写好HTML+CSS+JS就可以的前端工程师可以有更大的工作领域。而这一工作领域原来通常是属于服务器工程师的。典型的比如套HTML模板,基于Nodejs及相关的服务器包与模板包,套HTML对于大多数前端工程师来说是一件非常轻松的事件。因此会有人错误的将模板化当成是前端来看待。 但是这些人忘记了实际上这个模板处理是在非浏览器环境下进行的,因为跟前端是没有关系的。而我们也强调了前后端并没有在技术上能做出很好的区分,模板技术是无法区分前后端的。所以前后端分离的概念本身是建立在错误之上的,是一种错误的认识。
对于我们来说,我们需要时刻保持清醒的认识,Nodejs的开发并不是前端开发,虽然提供了目前最好的前端工具链。
综上分析,其实我们并没有发现有什么可以进行前后端分离的地方。即使是套模板这样的活,也是跟前后端分离没有关系的。 所以我会倾向于避免提前后端分离。
MV**与MVC认识的细化
之所以有人提出来前后端分离,可能更多的是建立在对MVC的错误的理解之上。MVC理论解决了三个基本模型的关联关系问题。但是它并不是一种非常细化的认识,它更多是一种对业务的高级抽象。而实际的业务会涉及到很多细节,导致有时候MVC并没有想象中那么好用,从而导致很多人认为MVC已经过时的或者错误。并且自己也出现了认知的错误。比如将模板化这个属于MVC里的V的部分变成了前端,而实际上V即可以存在于前端,也可以存在于后端。
只要正确的认识MVC,使用MVC去解构很多问题仍然是非常有效的。但是如何扩展与延伸对MVC的认识可能是更加重要的。所以现在有很多前端框架提出的MV**模式,实际上是对MVC的一种延伸与落实。 MVC不应该死板的去认识他,应该对它进行适当的裁剪与优化,使它更加方便的应用于实际。
服务器API化(RESTful APIs)与客户端多元化
由于MVC本身是要求模块化的,而前后端的交互目前主要是基于HTTP协议的。并且虽然基于HTTP协议可以传输很多内容,但是主要传输的内容仍然是HTML页面。这与MVC的模块化是相违背的。因此服务器RESTful化的呼声越来越高涨,从而引起了前后端分离之说的另一个错误。即将服务器接口RESTful化当成是前后端分离,实际上只是服务器输出接口化。
虽然存在的很多的认识误差工,但是在服务器MVC潮流中,大部分服务器采用或者倾向于采用RESTful架构,因此类RESTful API是服务器的主要接口形式。而通常这类API提供的是JSON/XML数据,从而让服务器的接口更加的简单,可复用。因为这样的数据格式可以直接被移动端所识别,因此写一次接口就可以完成所有的终端的共享,成本是最低的。是比直接输出HTML页面更加高效的接口形式。这种模式将是未来的Web开发的一个重要的模式: 一个API+多种终端。
基于以上的讨论,我们已经很清楚的理解了以下几个问题:
- Nodejs与Javascript的差异
- Nodejs与前后端的关系
- 前后端分离的提出的背景以及存在的问题
- MVC与MVC的延伸(MV**)
- 服务器端API化与多屏或者多端的兴起
以上问题有一些是Web开发领域长期存在的问题,有些是Nodejs出现后引入的问题,有些则是前端开发繁荣后带来的问题。希望本文能够帮助你更好的理解它们的关系,从而不再被这些问题所困扰。
理解了这些概念后,我们就可以很轻松进入真正的Nodejs的开发了。从下一节开始,我们就要真正的进入Nodejs的代码实践了。
广告时间
这个系列会全面介绍Nodejs的基础知识与Web开发的知识,感兴趣就订阅作者的微信公共号,接收最新的推送信息吧。
微信公共号:frontend-guru 或者扫描下面的图片