Node.js入门和企业级应用开发实战

前言

创始人:Ryan Dahl

Ryan Dahl

Ryan Dahl

2004年,在纽约罗彻斯特大学数学系读博士,研究一些分形、分类以及p-adic分析。
2006年,也许是厌倦了读博的无聊,然后退学,一个人去了智利的Valparaiso小镇。
Ryan Dahl经过两年的工作后,成为了高性能Web服务器的专家,期间他开始写一些开源项目帮助客户解决Web服务器的高并发性能问题,尝试过的语言有Ruby、C、Lua,当然这些尝试都最终失败了。

在他快绝望的时候,V8引擎来了。V8满足他关于高性能Web服务器的想象:
● 没有历史包袱,没有同步I/O。
● V8性能足够好。
● JavaScript语言的闭包特性非常方便。
于是在2009年的2月,按新的想法他提交了项目的第一行代码,这个项目的名字最终被定名为“node”。
2009年5月,Ryan Dahl正式向外界宣布他做的这个项目。
2009年底,Ryan Dahl在柏林举行的JSConf EU会议上发表关于Node.js的演讲,之后Node.js逐渐流行于世。

Node.js简介

Node.js是服务端开发。之前学的jQuery、HTML5、CSS3都是前端开发,这些代码都是在客户端浏览器中执行。
JavaScript传统意义上是前台语言,负责DOM组件、样式、运动……。
Nodejs后端开发关心GET、POST、表单的存储等等。

1.1 简介

V8引擎本身就是用于Chrome浏览器的JS解释部分,但是Ryan Dahl把V8搬到了服务器上,用于做服务器的软件。
Node.js是一个让JavaScript运行在服务器端的开发平台,它让JavaScript的触角伸到了服务器端,可以与PHP、JSP、Python、Ruby平起平坐。
但Node有点不同:
● Node.js不是一种独立的语言,与PHP、ASP.Net、JSP、Python、Perl、Ruby的“既是语言,也是平台”不同,Node.js的使用JavaScript进行编程,运行在Chrome V8引擎上。
● 与PHP、JSP等相比(PHP、ASP.Net、JSP、.net都需要运行在服务器程序上),Node.js跳过了Apache、Nginx、IIS等HTTP服务器,它自己不用建设在任何服务器软件之上。Node.js的许多设计理念与经典架构(LAMP = Linux + Apache + MySQL + PHP)有着很大的不同,可以提供强大的伸缩能力。

官网:https://nodejs.org/en/
特点:Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient.

1.2 特点

单线程

在Java、PHP或者.net等服务器端语言中,会为每一个客户端连接创建一个新的线程。而每个线程需要耗费大约2MB内存。
好处:操作系统完全不再有线程创建、销毁的时间开销。
坏处:一个用户造成了线程的崩溃,整个服务都崩溃了,其他人也崩溃了。

多线程、单线程的一个对比。

非阻塞I/O non-blocking I/O

例如,当在访问数据库取得数据的时候,需要一段时间。在传统的单线程处理机制中,在执行了访问数据库代码之后,整个线程都将暂停下来,等待数据库返回结果,才能执行后面的代码。也就是说,I/O阻塞了代码的执行,极大地降低了程序的执行效率。

事件驱动event-driven

在Node中,客户端请求建立连接,提交数据等行为,会触发相应的事件。在Node中,在一个时刻,只能执行一个事件回调函数,但是在执行一个事件回调函数的中途,可以转而处理其他事件(比如,又有新用户连接了),然后返回继续执行原事件的回调函数,这种处理机制,称为“事件环”机制。

单线程,单线程的好处,减少了内存开销,操作系统的内存换页。
非阻塞I/O, 不会等I/O语句结束,而会执行后面的语句。
事件机制,事件环,不管是新用户的请求,还是老用户的I/O完成,都将以事件方式加入事件环,等待调度。

说是三个特点,实际上是一个特点,离开谁都不行,都玩儿不转了。

1.3 适合开发什么?

善于I/O,不善于计算。因为Node.js最擅长的就是任务调度,如果你的业务有很多的CPU计算,实际上也相当于这个计算阻塞了这个单线程,就不适合Node开发。
当应用程序需要处理大量并发的I/O,而在向客户端发出响应之前,应用程序内部并不需要进行非常复杂的处理的时候,Node.js非常适合。Node.js也非常适合与web socket配合,开发长连接的实时交互应用程序。

比如:
● 用户表单收集
● 考试系统
● 聊天室
● 图文直播
● 提供JSON的API

1.4 Node.js无法挑战老牌3P

Node.js本是就是极客追求性能极致的产物,缺少了很多服务器的健壮考量。所以Node不可能应用在银行、证券、电信等需要极高可靠性的业务中。

Node.js安装

Node.js和Java非常像,跨平台的。不管是Linux还是windows编程是完全一致的(有一些不一样,比如路径的表述)。Linux版本的Node.js环境和windows环境是不一样的,但是编程语言一样。很像Java虚拟机。

装完之后,在系统的环境变量里面看一下:

环境变量,就已经自动的填写进去了,就是node安装的目录。

1 node 路径名
推荐,不要使用完整的路径名,而是通过先进入案例文件夹,然后node相对地址
cd命令,表示更改当前目录。

Node.js是服务器的程序,写的js语句,都将运行在服务器上。返回给客户的,都是已经处理好的纯html。

Node.js没有根目录的概念,因为它根本没有任何的web容器!

让node.js提供一个静态服务,都非常难!

HTTP模块

3.1 概述

Node.js中把一些独立功能设计成为了模块(module)。用require()内置函数来进行引用。不需要任何的实际的文件,就可以调用内置的模块。
是因为有一些程序需要使用fs功能(文件读取功能),有一些不用,所以为了效率,你用什么,就require什么。
●模块的好处:
√ 减少重复代码量,增加可读性
√ 方便进行代码规划
√ 方便使用第三方模块

3.2 server对象

可以用on语法监听某个事件,至于回调函数的形式,从API上看:
1 server.on("request",function(req, res){
2 if(req.url == "/"){
3 res.setHeader("Content-Type","text/html;charset=UTF-8");
4 res.end("这是首页11");
5 }else{
6 res.setHeader("Content-Type","text/html;charset=UTF-8");
7 res.end("没有这个页面");
8 }
9 });

3.3 req对象

req就是每次上行请求的对象
req.header HTTP上行请求头
1 console.log(req.headers);

req.httpVersion http请求的版本。现在基本上都是1.1

req.method “GET”、”POST”就是请求的类型

req.url 用户请求的网址
当用户的网址是:
http://127.0.0.1:3000/a/b/c/1.html?xingming=sefs&xfd=ere
req.url的值是:
/a/b/c/1.html?xingming=sefs&xfd=ere

3.4 res对象

res就是下行响应对象

res.end() 每次都要有这个语句,表示这次的发送已经结束,如果没有,浏览器会一直转。
参数必须是string、buffer(图片、文件)。

res.write() 就是写HTTP下行请求的body:
1 res.write("<h1>123</h1>");
2 res.write("<h1>456</h1>");
3 res.end("<h1>789</h1>");

res.setHeader() //设置返回的报文头部

res.statusCode = 404; //设置状态码

res.writeHead() //和res.setHeader差不多

NPM

4.1 npm install命令

node.js package management node.js包管理器。
模块就是一些功能的封装,所以一些成熟的、经常使用的功能,都有人封装成为了模块。并且放到了社区中,供人免费下载。
这个伟大的社区,叫做npm。 也是一个工具名字 node package management
https://www.npmjs.com/

去社区搜索需求,然后点进去,看api。
如果要配置一个模块,那么直接在cmd使用
1 npm install 模块名字
安装的时候,要注意,命令提示符的所在位置。
官网 : https://www.npmjs.com/
如果被和谐了: https://npm.taobao.org/

npm命令已经被集成在node.js中了,你安装完node就有npm了。
在npmjs.org网站上搜索你需要的包,然后在cmd中:
npm install ****

我们就能够用require去使用它。
1 var _ = require("underscore");

4.2 package.json
任何一个包都必须有一个package.json文件,里面可以规定很多内容。package.json就是这个包的身份证。
API:
https://docs.npmjs.com/getting-started/using-a-package.json

npm也有文档,这是package.json的介绍:
https://docs.npmjs.com/files/package.json
当你把你的包发布到npm上的时候,下面的信息非常有用:
1 {
2 "name": "my_package", //项目名字
3 "version": "1.0.0", //版本号
4 "main": "index.js", //入口文件
5 "keywords": [], //关键词,就是搜索什么npm上能够显示你
6 "author": "ag_dubs", //作者
7 "license": "ISC", //版权协议(许可证)
8 "repository": { //代码托管仓库,这个会自动生成一个连接
9 "type": "git",
10 "url": "https://github.com/ashleygwilliams/my_package.git"
11 },
12 "bugs": { //如果发现bug应该交给谁
13 "url": "https://github.com/ashleygwilliams/my_package/issues"
14 },
1 "dependencies": {
2 "underscore": "*",
3 "date-format" : "0.0.2"
4 },
15 "homepage": "https://github.com/ashleygwilliams/my_package" //个人网站16 }

最最重要的信息,就是:
5 {
6 "dependencies": {
7 "underscore": "",
8 "date-format" : "
"
9 }10 }
这个叫做“依赖”。 k:v对儿是这个东西的版本号。
1.我们的依赖包,可能在随时更新,我们永远想保持更新,或者某持某一个版本;
2.项目越来越大的时候,给别人看的时候,没有必要再次共享我们引用的第三方模块。

在cmd中,使用npm init可以初始化一个package.json文件,用回答问题的方式生成新的package.json文件。
如果不想自己创建一个package.json文件,那么就要:npm init

五、模板引擎
1 <a href="<%= url %>"><img src="<%= imageURL %>" alt=""></a>
数据绑定,就成为一个完整的html字符串了。

后台模板,著名的有两个,ejs和jade,是npm第三方包。

5.1 EJS
Embedded JavaScript templates
后台模板引擎
1 <ul>
2 <% for(var i = 0 ; i < news.length ; i++){ %>
3 <li><%= news[i] %></li>
4 <% } %>
5 </ul>

1 var dictionary = {
2 a:6,
3 news : ["传智新闻","高薪就业","nodejs好玩"]
4 };

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容