node.js 和 express 框架学习笔记(1)

上次导师让我把之前我写的网站部署到阿里云上,然后我花了一两个小时研究CentOS,再花了一两个小时研究部署容器,最后宣告失败,让合作技术公司的经理帮我干了这活……深受打击之下,决心入手服务器端编程。先是看了下PHP,感觉太复杂(好吧,就是偷懒),于是转向了js下的node.js,因为之前写网页也是纯js,看到js感觉很亲切,于是就决定是它了。

入手之后才发现里边其实有很多坑,或者至少对于我而言是挺麻烦的,于是在这里记录下学习笔记,算是给后来人一点简单的引路吧,中间大概会有很多错误,如果有人看到了请不吝赐教。

我会以思路的方式来记录,而不是纯粹的贴代码和API说明,并且将采用我觉得最自然的理解方式去说明。

好了,那么开始吧。

一. 上手Node.js之前的一些思考

1. B/S架构

B/S架构,B指的是browser,即浏览器,S指的是Server,即服务器。一个访问网站的过程,其流程拆解开来是,浏览器向指定的站点发送GET请求,站点根据设定好的路由分析请求的路径,然后返回一个页面/数据/文件/字符串,当然,也有可能重定向到另外一个页面;然后,以返回html页面为例,浏览器收到页面数据后开始渲染在屏幕上,这中间如果html里有嵌入了其他资源链接,浏览器将一并向服务器再次请求(当然仅对于相对路径而言,绝对路径的话将向路径里指定的其他服务器请求资源),直至将整个页面渲染完成。而用户还可以选择POST等等请求,服务器按照类似的流程进行响应。

那么浏览器和服务器之间的数据传送靠什么呢?http协议。协议里定义了关于请求和回复的各种属性,也包括了请求和回复的具体内容,以及所携带的其他参数。这部分的解析需要我们自己动手吗?当然可以,但是太麻烦了,服务器容器的存在就是为了提供一个方便的形式让我们能够自由的收发http报文,它把http的细节隐藏了,我们只需要关注业务逻辑而无需考虑协议本身。

一个靠谱的服务器环境应该包括什么?对协议的封装,对指定地址的监听和回复,对资源的管理,再完善一些,还包括路由处理和数据库操作,这样一来,编程者就只需要从服务器环境里获取请求内容,然后按照路由表执行不同的业务逻辑,再返回服务器的响应内容。

目前的服务器环境有哪些?Apache,nginx,IIS,这些环境都实现了上述的服务器应该具备的功能,但是都需要依赖一门服务器端编程语言。Apache通常和tomcat还有Java EE扎堆,nginx和php是好基友,IIS嘛,Windows下的服务器环境,当然只跟ASP.NET亲热啦。目前的趋势来看,Apache依旧是服务器环境王者,稳定性、扩展库、生态环境无与伦比,麻烦的是环境配置复杂,编程个人感觉也比较难,毕竟企业级的东西,但是nginx几乎和Apache不相上下,源于其在便捷性和性能、稳定性上做到了很好的平衡,加上和php亲切,用来做动态页面简直再爽不过,什么,你问IIS?为ASP默哀一发……

需要说明一点,上面所指的服务器都是指web服务器,应用服务器和游戏服务器等暂时先不讨论。

2. 为什么选择Node.js

Node.js算是后起之秀,距今已有7年历史,但是真正流行起来大概是在2013年之后了。node.js,按照官方自己的说明,既不是一门语言,也不是JavaScript的框架或者库,而是一个借用了JavaScript的平台,它有自己的运行核心,通过解释JavaScript代码来完成任务。node.js只运行在服务器端,架构如下图所示:

底层是Google V8 JavaScript引擎和基于C/C++的库,上层是JavaScript模块,包括从http服务器到文件读写和数据库访问的一系列模块。有了这些模块,我们就能够创建一个web服务器,http模块为其提供了web服务器所需的那些协议解析、报文收发功能,文件和数据库模块提供了对资源的访问,如此,一个比较完整的web服务器就实现了。

node的第一个特性在于,同时集成了服务器环境和服务器端代码编写,我们不再需要配置服务器环境,然后编写代码丢到服务器环境里执行,在node.js这里,这些都是一体化的,一句简单的var server=require('http').creatServer().listen(8080)就能直接创建一个web服务器,尽管这个服务器并不会响应任何请求。

node的第二个特性是,非阻塞式异步I/O和事件驱动模型。node的核心core运行在单线程上,但是通过异步I/O机制,可以将最耗时的I/O操作放在类似多线程环境里执行,而不会阻塞,与此相结合的特点是事件驱动,node的大多数操作都采用事件的形式,异步执行,完成后调用指定的回调函数。说到这里可能有人会担心单线程下node的性能会大打折扣,毕竟无法利用多核特性,为此,node官方加入了一个实验性的模块cluster,它允许创建多个node实例并同时监听一个端口,cluster模块会自动分配请求到不同的node实例,嗯就是所谓的负载均衡,不过似乎目前的cluster也就能做个这个了……据说用nginx做负载均衡,node处理业务逻辑会更好,初学者不妄加评论。

node的第三个特性是,模块化,编程者要手动引入需要用到的模块。这样做的好处是轻量化,灵活化,麻烦之处大概就是需要多写几行代码(咦这算麻烦么)。node官方提供了npm,node package manger,包管理器,用于方便的管理模块,可以一键下载项目用到的模块并管理。此外,用户也能创建自己的模块,自己创建的模块以js文件作为区分,应该是很好理解的,只是引用方式和前端的js有些区别,不过也很好掌握。

更多的特性,作为一个初学者也无法说出太多,只能希望大家自己去摸索去查阅资料了,多写代码多看API和别人的讲解。

node适用在哪些场景下呢?对稳定性没有极其苛刻的需求,业务逻辑不特别复杂,I/O密集而运算不密集,都是node大展身手的地方。此外,node本身的意思就是节点,意味着node天生适合分布式服务器,不过对此我同样没有太多了解,似乎就是nginx做分发,node作为节点。

你可能关心的问题:

node的性能?

能够同时支撑上万连接并发,只要业务逻辑不是很复杂的话,响应速度大大超过Apache和nginx,如果I/O再密集一些优势更明显。

node的弱势?

毕竟是轻量级的服务器端工具,完备性、安全性等等还达不到最高水平,同时基于JavaScript导致其不能胜任CPU密集的情形,当然也可以通过调用C/C++的接口弥补这一缺陷。

node的前景?

我看了很多资料和评测,目前已经有很多大企业将项目迁移到了node上,并且统计结果也表明node的热门程度正在迅速上升,但是,Apache和nginx的地位应该不会受到影响,这两者和node大概会成为互补的关系(IIS:我已经被遗忘了吗?好伤心……)

node是跨平台的吗?

废话。

node的技术门槛?

对http、HTML有基本的了解,知道JavaScript的基本语法和一些相对比较高级的语法特性(非必须,也可以边学node边看),如果对前端有了解最好,像我这种习惯了前端JavaScript的,看到node就觉得无比的亲切……


有了以上两部分的思考,下面就来正式开始Node.js的学习吧。


附:相关资源参考

http://www.cnblogs.com/dolphinX/p/3475090.html 对node的分析

http://nodejs.cn/ node中文官网

http://www.runoob.com/nodejs/nodejs-tutorial.html 比较概括性的node讲解,大概可以作为最基础的入门和备忘查询

http://ourjs.com/detail/529ca5950cb6498814000005 一本容量谈不上书的node教程,写的非常好,跟着做一遍的话会对服务器端编程的思路有一个比较清晰的认识,比如get和post请求处理,路由分发,上传下载机制等,但是作用也仅限于此了。

最好的办法当然是买本真正的教程……

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值