一、Node.js 前言

1.node.js 之父

Ryan Dahl(瑞安达尔) ,技术好,颜值高!

  • 数学系博士, 中途退学, 为了生活, 学习了Ruby On Rails接Web项目, 经过两年成了Web服务器专家。第一个阶段: 接项目做网站。第二个阶段: 帮助客户解决性能问题。
  • 2009年推出Node.js, 2012年退出Node.js, 转战Go语言。

2.Node出现的背景

为了解决Web服务器的高并发性能问题,Dyan Dahl 尝试用 ruby,c,lua去解决,但因语言自身原因失败,即语言历史包袱太重,船大难掉头,各种语言的生态根深蒂固,无法轻易改变。关于如何避免IO阻塞:异步I/O,事件驱动

3、V8引擎

一款专门对 JavaScript 进行解释和执行的流程虚拟机

比如把V8引擎嵌入到浏览器中,那么我们写的JavaScript代码就会被浏览器所执行;那么如果把V8引擎嵌入到NodeJS环境下,那么我们写的JavaScript代码就会被服务器所执行。

V8引擎嵌入到不同的宿主环境中时,就可以把JavaScript语言应用到不同的多领域中。

V8优势:

  • 编译强大、快速执行
  • 性能好,比python,Ruby等脚本语言好
  • 历史包袱轻,没有同步I/O
  • 事件驱动机制

瑞安 达尔,修改了V8引擎内核,并用户服务器开发,于是产生了 Node.js

二、Node.js 简介

Node.js 是一个让 JavaScript 运行在服务端的开发平台,使得 javascript从浏览器 延伸到了服务器,一开始叫 web.js,目的就是用来写高性能的Web服务器的。后来越来越壮大,改为叫 Node.js,从2009年到现在,不断改进和更新......

与其他后台语言的区别:

  • Node.js 不是一种独立的语言,Node.js 用JavaScript进行编程,运行环境是包装后的js 引擎(V8)
  • Node.js不架设在任何服务器软件上,java,php 等需要部署到tomcat,apache等
  • 用最小的硬件成本,达到跟高的并发,更优秀的处理性能

Node.js的特点:

1、单线程:

  • 优势:减少了内存开销(操作系统不会有线程创建、销毁的开销)
  • 劣势:如果一个事情被I/O阻塞,整个线程就被阻塞了

2、非I/O阻塞

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

Node.js中采用了非阻塞型I/O机制,因此在执行了访问数据库的代码之后,将立即转而执行其后面的代码,把数据库返回结果的处理代码放在回调函数中,从而提高了程序的执行效率。

当某个I/O执行完毕时,将以事件的形式通知执行I/O操作的线程,线程执行这个事件的回调函数。为了处理异步I/O,线程必须有事件循环,不断的检查有没有未处理的事件,依次予以处理。

阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程。而非阻塞模式下,一个线程永远在执行计算操作,这个线程的CPU核心利用率永远是100%。

3、事件驱动

比如执行着小红的业务,执行过程中,小刚的I/O回调完成了,此时怎么办??所以要有事件驱动循环

不管是新用户的请求,还是老用户的I/O完成,都将以事件方式加入事件环,等待调度,Node.js当中所有的I/O都是异步的, 都是回调函数套回调函数

运作流程:

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

Node.js当中所有的I/O都是异步的, 都是回调函数套回调函数

三、Node.js的应用方向

1.特点

  • 善于I/O,不善于计算

因为Node.js最擅长的就是任务调度,如果你的业务有很多的CPU计算,实际上也相当于这个计算阻塞了这个单线程,就不适合Node开发。

当应用程序需要处理大量并发的I/O,而在向客户端发出响应之前,应用程序内部并不需要进行非常复杂的处理的时候,Node.js非常适合。Node.js也非常适合与web socket配合,开发长连接的实时交互应用程序。

  • 异步

2.适用场景

网站开发(如express/koa等)
im即时聊天(socket.io)
api(移动端,pc,h5)
HTTP Proxy(淘宝、Qunar、腾讯、百度都有)
前端构建工具(grunt/gulp/bower/webpack/fis3…)
跨平台打包工具
PC端的electron、nw.js,比如钉钉PC客户端、微信小程序IDE、微信客户端,移动的cordova,Phonegap,一站式开发框架ionic framework
写操作系统(NodeOS)
命令行工具(比如cordova、shell.js)
反向代理(比如anyproxy,node-http-proxy)
编辑器Atom、VSCode等

3.Node.js 不是全能的

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

创业型公司(正处于A轮、B轮)非常爱使用Node做核心业务

■ 功夫熊的APP,后台是Node.js在伺服
■ 实现网,整站为Node.js搭建

成熟大企业,基本上都是用Node实现某一方面的功能:
■ 知乎用了一个Node进程,跑起了“站内信”功能
■ 百度的很多表单,是用Node保存到数据库的

4.企业中的使用场景

Node.js 笔记01的更多相关文章

  1. Node.js 教程 01 - 简介、安装及配置

    系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...

  2. Node.js笔记1

    Node.js入门笔记 1. node -help 可以显示帮助信息2. node REPL 模式(Read-eval-print loop) 输入—求值—输出循环 直接在cmd输入node 可以进入 ...

  3. node.js 笔记

    教程总结笔记: 学习网站:http://www.runoob.com/nodejs/nodejs-install-setup.html Node.js 中文网及安装文件下载: http://nodej ...

  4. node.js初识01

    1.对于node.js的安装在这里就不做过多的介绍了,安装成功后,可以通过cmd 输入node -v查看node的版本号,如图所示 2.开始我们的hello world,通过cmd进入所属文件夹,输入 ...

  5. Node.js 笔记02

    一.关于命令 常用命令: dir 列出当前目录下面所有的文件 cd 目录名 进入到指定的目录,. 当前目录, .. 进入上级目录,cd . 当前目录, cd .. 上级目录 md 目录名 创建文件夹 ...

  6. node.js 笔记(一)

    参考:https://github.com/alsotang/node-lessons 感谢!!! 本文属于小白入门级笔记,请大牛自动屏蔽!!! 1.     开发环境 os: 10.12.6 nod ...

  7. 学习Node.js笔记(一)

    一.什么是Node.js 1.1.Node.js是什么 Node.js是用来编写高性能网络服务器的JavaScript工具包 Node.js 是一个基于Chrome JavaScript 运行时建立的 ...

  8. node.js笔记

    在node环境上面运行js代码,js相当于php,node相当于apache环境 第一步装 node 环境1.从官网下载 dmg 文件安装2.通过命令行安装 需要用到 homebrew(mac上专门用 ...

  9. Node.js笔记4

    4. 文件系统 fs fs模块是文件操作的封装,提供了同步跟异步操作2个版本 * fs.readFile(filename,[encoding],[callback(err,data)]) 是最简单的 ...

随机推荐

  1. Mysql中各种与字符编码集(character_set)有关的变量含义

    mysql涉及到各种字符集,在此做一个总结. 字符集的设置是通过环境变量来设置的,环境变量和linux中的环境变量是一个意思.mysql的环境变量分为两种:session和global.session ...

  2. IDEA 中,编译后不拷贝 mybatis 配置的 mapper 的 xml 文件

    在maven项目的pom.xml配置文件里添加 <build> <resources> <resource> <directory>src/main/j ...

  3. HTML标签 随笔2

    3-1  使用ul   添加新闻信息列表 ul-li是没有前后顺序的信息列表. 语法: <ul> <li>信息</li> <li>信息</li&g ...

  4. 【路一直都在】----img标签垂直居中问题

    先上代码 .dianshang ul li a { height: 100px; vertical-align:middle; display: table-cell;        width: 1 ...

  5. 巡风扫描器安装-windows部署

    巡风是一款适用于企业内网的漏洞快速应急,巡航扫描系统. 作者github地址 https://github.com/ysrc/xunfeng 一.环境安装 1,安装Python解释器 https:// ...

  6. 统计学中的P值与显著性的意义

    统计学意义(p值) 结果的统计学意义是结果真实程度(能够代表总体)的一种估计方法.专业上,p值为结果可信程度的一个递减指标,p值越大,我们越不能认为样本中变量的关联是总体中各变量关联的可靠指标.p值是 ...

  7. XUtils3 的 环境搭建与简单使用

    XUtils3 的 环境搭建 环境搭建三部曲 ----------------------- 说明 : author  修雨轩陈 使用andorid Studio 已经创建了一个项目 并且自己需要使用 ...

  8. win7下tomcat5.5无法通过ip和127.0.0.1访问的解决方法

    解决办法:找到tomcat5.5目录下的conf\server.xml文件,原文如下: <Connector port="8080" maxHttpHeaderSize=&q ...

  9. solidity语言13

    函数过载 合约内允许定义同名函数,但是输入参数不一致 pragma solidity ^0.4.17; contract A { function f(uint _in) public pure re ...

  10. 定时备份SQL Server数据库

    一.手动备份: 1.整个数据库备份:选择数据库 => 右键任务 => 备份: 2.导出一张表的框架:选择表 => 编写表脚本为 => CREATE到: 3.导出一张表的数据:  ...