纯理论阶段结束了,接下来就是真正开始建设我们的网站了,在此之前,还有一些工作要做...........
在开始真正编写网站之前,我们首先要大致知道Node.js实现网站的工作原理
Node.js和PHP、Perl、ASP等一样,目的都是实现动态网页,也就是说由服务器动态生成HTML 页面
一开始的静态网页,都是提前放置在服务器端,然后通过请求获取
缺点:静态HTML 的可扩展性非常有限,无法与用户有效交互。同时如果有大量相似的内容时,则会产生冗余,不利于维护
后来使用Perl和CGI实现动态网页,在Perl 程序中输出HTML 内容,然后由HTTP 服务器调用Perl 程序,将结果返回给客户端
缺点:HTML 内容比较多时,维护非常不方便
再后来,以ASP、PHP、JSP 为代表的语言使用了与Perl相反的方法,是在以HTML 为主的模板中插入程序代码(例如ASP 的<% %> 和PHP 的 标签,在这些标签内添加代码,借以生成动态数据)
缺点:页面和程序逻辑紧密耦合,任何一个网站规模变大以后,都会遇到结构混乱,难以处理的问题
大势所趋,以MVC 架构为基础的平台逐渐兴起
MVC (Model-View-Controller,模型-视图-控制器)是一种软件的设计模式,即把一个复杂的软件工程分解为三个层面
模型是对象及其数据结构的实现,通常包含数据库操作
视图表示用户界面,在网站中通常就是HTML 的组织结构
控制器用于处理用户请求和数据流、复杂模型,将输出传递给视图
除此之外,传统的架构中HTTP 服务器的角色会由Apache、Nginx、IIS 之类的软件来担任,而Node.js不需要,Node.js本身就提供了http 模块
Node.js和其他的语言相比的另一个显著区别,在于它的原始封装程度较低,例如PHP 中
你可以访问 $_REQUEST 获取客户端的POST 或GET 请求,而在NodeJS中,很多工作需要你自己来做(并不是都要自己动手,因为有第三方框架的帮助)
Node.js 由于不需要另外的 HTTP 服务器,因此减少了一层抽象,给性能带来不少提升,但同时也因此而提高了开发难度。举例来说,我们要实现一个 POST 数据的表单,例如:
<form method="post" action="http://localhost:3000/" >
<input type="text" name="title" />
<textarea name="text" ></textarea>
<input type="submit" />
</form>
假设我们要实现的功能是将这两个字段的东西原封不动地返回给用户,PHP 只需写两行代码
echo $_POST['title'];
echo $_POST['text'];
Node.js却要这样
var http = require('http');
var querystring = require('querystring');
var server = http.createServer( function(req, res) {
var post = '';
req.on('data', function(chunk) {
post += chunk;
});
req.on('end', function() {
post = querystring.parse(post);
res.write(post.title);
res.write(post.text);
res.end();
});
}).listen( 3000);
Node.js 完成这样一个简单任务竟然如此复杂,是不是Node.js不够好
其实这个比较是不公平的, PHP 之所以显得简单并不是因为它没有做这些事,而是因为PHP 已经将这些工作完全封装好了,只提供了一个高层的接口,而 Node.js 的 http 模块提供的是底层的接口,尽管使用起来复杂,却可以让我们对 HTTP 协议的理解更加清晰
但是我们并不是为了理解 HTTP 协议才来使用 Node.js 的,作为 Web 应用开发者,我们不需要知道实现的细节,更不想与这些细节纠缠从而降低开发效率。难道 Node.js 的抽象如此之差,把不该有的细节都暴露给了开发者吗?
实际上, Node.js 虽然提供了 http 模块,却不是让你直接用这个模块进行 Web 开发的
http 模块仅仅是一个 HTTP 服务器内核的封装,你可以用它做任何 HTTP 服务器能做的事情,不仅仅是做一个网站,甚至实现一个 HTTP 代理服务器都行。你如果想用它直接开发网站,那么就必须手动实现所有的东西了,小到一个 POST 请求,大到 Cookie、会话的管理。当你用这种方式建成一个网站的时候,你就几乎已经做好了 一个完整的框架了
所以,我们直接从express开始,开启全新的Node之旅~