乐趣区

nodejs基础篇回顾

一、nodejs 介绍

1.1 简介

  • nodejs是一个 JavaScript 运行环境。它让 JavaScript 可以开发后端程序,实现几乎其他后端语言实现的所有功能
  • Nodejs是基于 V8 引擎,V8Google 发布的开源 JavaScript 引擎,本身就是用于 Chrome 浏览器 的 JS 解释部分,V8搬到了服务器上,用于做服务器的软件
  • 短短几年的时间,Node 取得了巨大的成功。在企业界,Node 的应用也越来越广泛,2016 年 nodeJS 官方的调查报告。2016 年全球有 350 万开发者使用 nodeJS, 相比去年保持了 100% 的增长率。像 Yahoo、Microsoft 这样的大公司,有好多应用已经迁移到 Node 了。国内的阿里巴巴、网易、腾讯、新浪、百度等 公司的很多线上产品也纷纷改用 Node 开发,并取得了很好的效果。据统计很多 A 轮、B 轮的创业公司更 喜欢使用 NodeJs 开发。

1.2 NodeJs 的优势

1. NodeJs 语法完全是 js 语法,只要你懂 JS 基础就可以学会 Nodejs 后端开发

Node 打破了过去 JavaScript 只能在浏览器中运行的局面。前后端编程环境统一,可以大大降低开发成本

2. NodeJs 超强的高并发能力

  • Node.js的首要目标是提供一种简单的、用于创建高性能服务器及可在该服务器中运行的各种应用程 序的开发工具
  • 首先让我们来看一下现在的服务器端语言中存在着什么问题。
    JavaPHP 或者 .net 等服务器端语言中,会为每一个客户端连接创建一个新的线程。而每个线程需要耗费大约 2MB 内存
    理论上,一个 8GB 内存的服务器可以同时连接的最大用户数为 4000 个左右
    。要让 Web 应用程序支持更多的用户,就 需要增加服务器的数量,而 Web 应用程序的硬件成本当然就上升了
  • Node.js不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接了,就触发一个 内部事件,通过非阻塞 I/O、事件驱动机制,让Node.js 程序宏观上也是并行的。使用 Node.js,一个8GB 内存的服务器,可以同时处理超过 4 万 用户的连接

3. 实现高性能服务器

  • 严格地说,Node.js是一个用于开发各种 Web 服务器的开发工具。在 Node.js 服务器中,运行的是高性能 V8 JavaScript 脚本语言,该语言是一种可以运行在服务器端的 JavaScript 脚本语言
  • 那么,什么是 V8 JavaScript 脚本语言呢? 该语言是一种被 V8 JavaScript 引擎所解析并执行的脚本语言。V8 JavaScript引擎是由 Google 公司使用 C++ 语言开发的一种高性能 JavaScript 引擎,该引擎并不局限于在浏览 器中运行。Node.js将其转用在了服务器中,并且为其提供了许多附加的具有各种不同用途的 API。例如,在一个服务器中,经常需要处理各种二进制数据。在JavaScript 脚本语言中,只具有非常有限的对二进制数 据的处理能力,而 Node.js 所提供的 Buffer 类则提供了丰富的对二进制数据的处理能力
  • 另外,在 V8 JavaScript 引擎内部使用一种全新的编译技术。这意味着开发者编写的高端的 JavaScript 脚本代码与开发者编写的低端的 C 语言具有非常相近的执行效率,这也是 Node.js 服务器可以提供的一个重要特性

4. 开发周期短、开发成本低、学习成本低。

  • Node.js自身哲学,是花最小的硬件成本,追求更高的并发,更高的处理性能。
  • 特点:Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient.

1.3 NodeJs 适合做什么

在短短几年多的时间里,Node变得非常热门,使用者也非常多。这些使用者对于 Node 的各自倚重点也各部相同,经过整理, 主要有下几类

1. 前后端编程语言环境统一

这类重点的代表是雅虎。雅虎开放了 Cocktai 框架,利用 自己深厚的前端沉淀,将 YUI3 这个前端框架的能力借助 Node 延伸到服务器端,使得使用 者摆脱了日常工作中一边写 JavaScript—边写PHP 所帯来的上下文交换负担

2. Node 带来的高性能 I/0 用于实时应用

VoxerNode 应用在实时语音上。国内腾讯的 朋友网将 Node 应用在长连接中,以提供实时功能,花瓣网、蘑菇街等公司通过 socket.io 实 现实时通知的功能。

3. 并行 I/0 使得使用者可以更高效地利用分布式环境

阿里巴巴 eBay 是这方面的典型。阿里巴巴的 NodeFox 和 eBay 的 ql.io 都是借用 Node 并行 I/O 的能力,更高效地使用已有的 数据

4. 并行 I/O •有效利用稳定接口提升 Web 渲染能力

雪球财经和 Linkedln 的移动版网站均 是这种案例,撇弃 同步等待式的顺序请求,大胆采用并行丨 /〇,加速数据的获取进而提升 Web 的渲染速度

5. 云计算平台提供 Node 支持

微软将 Node 引入 Azure 的开发中,阿里云、百度均纷纷 在云服务器上提供 Node 应用托管服务,Joyent 更是云计算中提供 Node 支持的代表。这类 平台看重 JavaScript 带来的开发上的优势,以及低资源占用、高性能的特点

6. 游戏开发领域

游戏领域对实时和并发有很高的要求,网易开源了 pomelo 实时框架,可以应用在游戏和高实时应用中

7. 工具类应用

过去依赖 java 或其他语言构建的前端工具类应用,纷纷被一些前端工程 师用 Node 重写,用前端熟悉的语言为前端构建熟悉的工具
二、HTTP 模块、URL 模块 supervisor 工具
用 Node.js 时,我们不仅仅在实现一个应用,同时还实现了整个 HTTP 服务器

二、HTTP 模块、URL 模块 supervisor 工具

Node.js 时,我们不仅仅在实现一个应用,同时还实现了整个 HTTP 服务器

2.1 创建一个简单的程序

`var http = require(‘http’);

http.createServer(function(request, response) {

// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 设置 HTTP 头部,状态码是 200,文件类型是 html,字符集是 utf8 response.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"});
// 发送响应数据 "Hello World"
res.end("哈哈哈哈,我买了一个 iPhone" + (1 + 2 + 3) + "s");

}).listen(8888);
// 终端打印如下信息
console.log(‘Server running at http://127.0.0.1:8888/’);`

你会发现,我们本地写一个 js,打死都不能直接拖入浏览器运行,但是有了 node,我 们任何一个 js 文件,都可以通过 node 来运行。也就是说,node 就是一个 js 的执行环境

2.2 HTTP 模块、URL 模块

Node.js 中,将很多的功能,划分为了一个个 module(模块)。Node.js 中的很多功能都 是通过模块实现

2.2.1、HTTP 模块的使用

`// 引用模块
var http = require(“http”);
// 创建一个服务器,回调函数表示接收到请求之后做的事情
var server = http.createServer(function(req, res) {//req 参数表示请求,res 表示响应

console.log("服务器接收到了请求" + req.url);
res.end(); // End 方法使 Web 服务器停止处理脚本并返回当前结果

});
// 监听端口
server.listen(3000, “127.0.0.1”);`
** 设置一个响应头
**
res.writeHead(200,{"Content-Type":"text/html;charset=UTF8"});

  • 我们现在来看一下 req 里面能够使用的东西
  • 最关键的就是 req.url 属性,表示用户的请求 URL 地址。所有的路由设计,都是通过 req.url 来实现的。
  • 我们比较关心的不是拿到 URL,而是识别这个 URL
  • 识别 URL,用到了下面的 URL 模块

2.2.2、URL 模块的使用

  • url.parse() 解析 URL
  • url.format(urlObject) 是上面 url.parse() 操作的逆向操作
  • url.resolve(from, to) 添加或者替换地址

1. url.parse()


**2. url.format()
**

3. url.resolve()

2.3 Nodejs 自启动工具 supervisor

supervisor 会不停的 watch 你应用下面的所有文件,发现有文件被修改,就重新载入程序文件这样就实现了部署,修改了程序文件后马上就能看到变更后的结果。麻麻再也不用担心我的重启 nodejs 了

首先安装 supervisor

npm install -g supervisor
使用 supervisor 代替 node 命令启动应用

三、CommonJs 和 Nodejs 模块

3.1 什么是 CommonJs

JavaScript 是一个强大面向对象语言,它有很多快速高效的解释器。然而,JavaScript 标准定义的 API 是为了构建基于浏览器的应用程序。并没有制定一个用于更广泛的应用程序 的标准库。
, 而不只是停留在小脚本程序 的阶段。用 CommonJS API 编写出的应用,不仅可以利用 JavaScript 开发客户端应用,而且还可以编写以下应 用

  • 服务器端 JavaScript 应用程序。(nodejs)
  • 命令行工具
  • 桌面图形界面应用程序

CommonJS 就是模块化的标准,nodejs 就是 CommonJS(模块化)的实现

3.2 Nodejs 中的模块化

Node 应用由模块组成,采用 CommonJS 模块规范

3.2.1 在 Node 中,模块分为两类

  • 一类是 Node 提供的模块, 称为核心模块; 另一类是用户编写的模块,称为文件模块
  • 核心模块部分在 Node 源代码的编译过程中,编译进了二进制执行文件。在 Node 进程启动时,部分核心模块就被直接加载进内存中,所以这部分核心模块引入时,文件定位和 编译执行这两个步骤可以省略掉,并且在路径分析中优先判断,所以它的加载速度是最快的。如:HTTP 模块、URL 模块、Fs 模块都是 nodejs 内置的核心模块,可以直接引入使用
  • 文件模块则是在运行时动态加载,需要完整的路径分析、文件定位、编译执行过程、速度相比核心模块稍微慢一些,但是用的非常多。这些模块需要我们自己定义。接下来我 们看一下 nodejs 中的自定义模块。

3.2.2 CommonJS(Nodejs)中自定义模块的规定

  1. 我们可以把公共的功能抽离成为一个单独的 js 文件作为一个模块,默认情况下面这 个模块里面的方法或者属性,外面是没法访问的。如果要让外部可以访问模块里面的方法或 者属性,就必须在模块里面通过 exports 或者 module.exports 暴露属性或者方法
  2. 在需要使用这些模块的文件中,通过 require 的方式引入这个模块。这个时候就可以 使用模块里面暴露的属性和方法

3.2.3 定义使用模块

`// 定义一个 tools.js 的模块 // 模块定义
var tools = {

sayHello: function() {return 'hello NodeJS';},
add: function(x, y) {return x + y;}

};
// 模块接口的暴露
// module.exports = tools; exports.sayHello = tools.sayHello; exports.add = tools.add;`

`var http = require(‘http’);
// 引入自定义的 tools.js 模块
var tools = require(‘./tools’);

tools.sa yHello(); // 使用模块 `

四、NPM 第三方模块和 package

4.1 包与 NPM

4.1.1 包

Nodejs 中除了它自己提供的核心模块外,我们可以自定义模块,也可以使用 第三方的模块。Nodejs 中第三方模块由包组成,可以通过包来对一组具有相互依 赖关系的模块进行统一管理

完全符合 CommonJs 规范的包目录一般包含如下这些文件

  • package.json : 包描述文件
  • bin : 用于存放可执行二进制文件的目录
  • lib : 用于存放 JavaScript 代码的目录
  • doc : 用于存放文档的目录

在 NodeJs 中通过 NPM 命令来下载第三方的模块(包)

4.1.2 NPM 介绍

  • npm 是世界上最大的开放源代码的生态系统。我们可以通过 npm 下载各种各样的包,这些源代码 (包) 我们可以在 https://www.npmjs.com 找到

npm 是随同 NodeJS 一起安装的包管理工具,能解决 NodeJS 代码部署上的很多问题,常见的使用场景有 以下几种

  • 允许用户从 NPM 服务器下载别人编写的第三方包到本地使用
  • 允许用户从 NPM 服务器下载并安装别人编写的命令行程序 (工具) 到本地使用
  • 允许用户将自己编写的包或命令行程序上传到 NPM 服务器供别人使用

NPM 命令详解

  • npm -v 查看 npm 版本
  • npm install 使用 npm 命令安装模块
  • npm uninstall moudleName 卸载模块
  • npm list 查看当前目录下已安装的 node 包
  • npm info jquery 查看 jquery 的版本
  • 指定版本安装 npm install jquery@1.8.0

4.2 package.json

package.json 定义了这个项目所需要的各种模块, 以及项目的配置信息 (比如名称、
版本、许可证等元数据)

1. 创建 package.json

`npm init
npm init –yes`
2. 安装模块并把模块写入 package.json(依赖)

  • npm install babel-cli –save-dev
  • npm install 模块 –save

3. dependencies 与 devDependencies 之间的区别

  • 使用 npm install node_module –save 自动更新 dependencies 字段值;
  • 使用 npm install node_module –save-dev 自动更新 devDependencies 字段值
  • dependencies 配置当前程序所依赖的其他
  • devDependencies 配置当前程序所依赖的其他包,只会下载模块,而不下载这些模块的测试 和文档框架

`”dependencies”: {

"ejs": "^2.3.4",
"express": "^4.13.3",
"formidable": "^1.0.17"

}`

  • ^ 表示第一位版本号不变,后面两位取最新的
  • ~ 表示前两位不变,最后一个取最新
  • * 表示全部取最新

4.3 安装淘宝镜像

  • http://www.npmjs.org npm 包官网
  • https://npm.taobao.org/ 淘宝 npm 镜像官网

淘宝 NPM 镜像是一个完整 npmjs.org 镜像,你可以用此代替官方版本(只读),同步频 率目前为 10 分钟 一次以保证尽量与官方服务同步

我们可以使用我们定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm:

npm install -g cnpm --registry=https://registry.npm.taobao.org

退出移动版