一、Node能够解决什么问题?

  1. Node的首要目标是提供一种简单的,用于创建高性能服务器的开发工具
  2. 对比Java和Php的实现方式,Web服务器的瓶颈在于并发的用户量
  3. Node在处理高并发,I/O密集场景有明显的性能优势
    ① 高并发,是指在同一时间并发访问服务器
    ② I/O密集指的是文件操作、网络操作、数据库
    ③ 与I/O密集相对的是CPU密集,CPU密集指的是逻辑处理运算、压缩、解压、加密、解密
  4. Web主要场景就是接收客户端的请求,读取静态资源和渲染界面,所以Node非常适合Web应用的开发

二、Node.js前言

Node.js之父

Ryan Dahl(瑞安·达尔)

数学系博士, 中途退学, 选择了诗和远方
为了生活, 学习了Ruby On Rails接Web项目, 经过两年成了Web服务器专家
第一个阶段: 接项目做网站
第二个阶段: 帮助客户解决性能问题
工作少了, 活更高端, 钱赚的更多了
2009年推出Node.js, 2012年退出Node.js, 转战Go等其它语言
1)Node适合小型,实时事务型服务器网站
2)GO更适合构建大型服务器网站
3)不要说某种语言好或者不好, 都有各自的应用场景, 只有合适不合适

Node出现的背景

为了解决Web服务器的高并发性能问题

  1. 什么性能问题?

    1)缩短发送到响应的时长
    ① 发送请求快一点:不能控制(客户端网速决定)
    ② 响应快一点:可以控制(服务器带宽提高, CDN加速…)
    ③ 服务器处理请求任务快一点:可以控制(优秀的程序员)
    ④ 服务器从磁盘读取/写入数据到数据库快一点,所有项目后期都会遇到的瓶颈:不能控制(磁盘的读取速度有上限)分布式、矩阵式、刀片式....
    2)传统服务器的运作流程
    多线程,发送一个请求就开启一条线程。举例: 饭店服务员。
    需要大量的资源支持
  2. Ryan Dahl(瑞安·达尔)尝试过用Ruby, c, Lua去解决, 但都因为语言自身的各种限制而一一失败,江山易改,本性难移,语言历史包袱太重, 船大难掉头,各种语言的思想都根深蒂固, 生态没法轻易改变。
  3. V8引擎的出现,渐渐摸索到解决问题的钥匙。事件驱动、异步I/O

V8引擎的出现

什么是V8引擎?

一款专门对JavaScript语言进行解释和执行的流程虚拟机
比如把V8引擎嵌入到浏览器中,那么我们写的JavaScript代码就会被浏览器所执行;那么如果把V8引擎嵌入到NodeJS环境下,那么我们写的JavaScript代码就会被服务器所执行
V8引擎嵌入到不同的宿主环境中时,可以把JavaScript语言应用到不同的多领域中

起初的作用?

用于Chrome浏览器解析js脚本
比如: 发送HTTP请求给服务器, 响应服务器端返回的HTTP请求

V8引擎的优势?

  1. 强大的编译和快速的执行效率,运用了大量的算法和奇技淫巧
  2. 性能非常好, 它的执行效率远超Python, Ruby等其它脚本语言
  3. 历史包袱轻, 没有同步I/O
  4. 强大的事件驱动机制

Node的诞生

Ryan Dahl(瑞安·达尔)修改V8引擎的内核, 把它用在了服务器开发, 经过修改后的这样一套东西就被称为Node.js

三、Node.js简介

什么是Node.js

Node.js是一个基于 Chrome V8 引擎的JavaScript运行环境(runtime)

  1. Node不是一门语言,而是一个开发工具,让JS运行在后端
  2. Node不包含JavaScript全集,在服务器端没有DOM和BOM
  3. Node也提供了一系列新的模块,例如:http,fs模块等
  4. Node之前, js代码只能运行在客户端, 最多只能在浏览器内翻江倒海
  5. Node之后, js代码可以和操作系统(Mac OS, windows, Linux…)交互, 战场从浏览器延伸到了服务器
  6. 版本变化
    ① 一开始叫Web.js, 目的就是用于写高性能Web服务器的
    ② 越写越大, 形成生态(服务器开发, 各种框架的依赖…), 改名为Node.js
    Node: 节点, Node的开源团队希望它像节点一样可以不断扩展, 壮大
    Joyent收购Node, 把它变成公司旗下的一产品, 但程序员都有一颗开源的心(共产主义, 希望Node不属于某个人,某个公司), 退出, 搞了个io.js , 分久必合合久必分
    原来是0.几, 突然来了个4.0, 不要感觉奇怪!
    Node 奇数是开发版, 偶数是稳定版

功能类似的其他后端语言

PHP、JSP、Python、Ruby:和系统进行交互

和其它后端语言的区别

  1. Node.js不是一种独立的语言
    ① PHP, JSP,… 既是语言, 也是平台
    ② Node.js用JavaScript进行编程, 运行平台是包装后的js引擎(V8)
  2. 轻量级架构
    ① java,php,.net都需要运行在服务器上,apache,tomat,nginx,IIS
    ② Node.js不用架设在任何服务器软件之上
    ③ 用最小的硬件成本, 达到更高的并发, 更优的处理性能

Node.js 使用了事件驱动、非阻塞式 I/O 的模型,使其轻量又高效;并且Node.js 的包管理器 npm,是全球最大的开源库生态系统

进程与线程

概念

  1. 进程是操作系统分配资源和调度任务的基本单位
  2. 线程是建立在进程上的一次程序运行单位,一个进程上可以有多个线程

浏览器是单线程还是多线程?

  1. 图示
  2. 浏览器模型
    1)用户界面-包括地址栏、前进/后退按钮、书签菜单等
    2)浏览器引擎-在用户界面和呈现引擎之间传送指令(浏览器的主进程)
    3)渲染引擎,也被称为浏览器内核(浏览器渲染进程)
    4)第三方插件进程 (一个插件对应一个进程)
    5)GPU进程(GPU用于提高网页浏览的体验)
  3. 浏览器是多线程的,我们更关注的是浏览器的渲染引擎

渲染引擎

  1. 渲染引擎内部是多线程的,内部包含两个最为重要的线程ui线程js线程
  2. ui线程和js线程是互斥的,因为JS运行结果会影响到ui线程的结果
  3. ui更新会被保存在队列中等到js线程空闲时立即被执行

JS是单线程的

  1. JS在最初设计时就设计成了单线程,因为当时是用于UI绘制,多个线程同时操作DOM会很混乱
  2. 这里所说的单线程指的是主线程是单线程的,所以在Node中主线程依旧是单线程的
  3. 其他线程
    1)浏览器事件触发线程(用来控制事件循环,存放setTimeout、浏览器事件、ajax的回调函数)
    2)定时触发器线程(setTimeout定时器所在线程)
    3)异步HTTP请求线程(ajax请求线程)
  4. 补充
    1)单线程特点是节约了内存,并且不需要再切换执行上下文
    2)而且单线程不需要管锁的问题
    例如:下课了大家都要去上厕所,厕所就一个大号,相当于所有人都要访问同一个资源,那么先进去的就要上锁
    而对于node来说,下课了就一个人去厕所,所以免除了锁的问题

查看线程

右击 任务栏 -->任务管理器 --> 进程

事件循环

图示

运行原理

  1. 所有同步任务都在主线程上执行,形成一个执行栈
  2. 主线程之外,还存在一个任务队列;只要异步任务有了运行结果,就在任务队列之中放置一个事件
  3. 一旦执行栈中的所有同步任务执行完毕,系统就会读取任务队列,将队列中的事件放到执行栈中依次执行
  4. 主线程从任务队列中读取事件,这个过程是循环不断的

Node运行过程

异步非阻塞

图示

运行过程

  1. 我们写的js代码会交给v8引擎进行处理
  2. 代码中可能会调用nodeApi,node会交给libuv库处理
  3. libuv通过阻塞i/o和多线程实现了异步io
  4. 通过事件驱动的方式,将结果放到事件队列中,最终交给我们的应用

同步与异步

同步和异步关注的是消息通知机制

  1. 同步
    同步就是发出调用后,没有得到结果之前,该调用不返回,一旦调用返回,就得到返回值了
    调用者主动等待这个调用的结果
  2. 异步
    异步则相反,调用者在发出调用后这个调用就直接返回了,所以没有返回结果
    当一个异步过程调用发出后,调用者不会立刻得到结果,而是调用发出后,被调用者通过状态、通知或回调函数处理这个调用

阻塞与非阻塞

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态

  1. 阻塞调用
    指调用结果返回之前,当前线程会被挂起
    调用线程只有在得到结果之后才会返回
  2. 非阻塞调用
    在不能立刻得到结果之前,该调用不会阻塞当前线程

Node.js的特点

单线程

Node.js:Node基础相关推荐

  1. Node.js Stream - 基础篇

    背景 在构建较复杂的系统时,通常将其拆解为功能独立的若干部分.这些部分的接口遵循一定的规范,通过某种方式相连,以共同完成较复杂的任务.譬如,shell通过管道|连接各部分,其输入输出的规范是文本流. ...

  2. 【Node.js】 基础语法

    目录 Node.js npm package.json 字符编码 REPL Buffer(缓冲区) 函数 回调函数 模块系统 Express 框架 全局对象 console process Strea ...

  3. Node.js零基础自学(持续更新中)

    1. Node.js时基于Chrome V8 引擎的JavaScript运行环境.官网:Node.jsNode.js® is a JavaScript runtime built on Chrome' ...

  4. Node.js进阶基础技能—Koa基本使用

    一.简介 koa 是由 Express 原班人马打造的,致力于成为一个更小.更富有表现力.更健壮的 Web 框架.使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐 ...

  5. node.js 从基础到操作数据库

    node.js 学习 模块化 CommonJS----------双端(1.浏览器端;2.服务器端)------暴露:module.exports =??? exports.xxxx = ??? 浏览 ...

  6. node.js自学基础笔记

    Node.js 学习目标 能够知道什么是node.js 能够知道node.js可以做什么 能够说出node.js中javascript的组成部分 能够使用path模块处理模块路径 能够使用http模块 ...

  7. Node.js入门基础

    一.命令行窗口 1.打开方式:①cmd ②开始环境中直接找图标 2.通常称呼:终端.shell.小黑屏.cmd窗口 3.常用指令:cd 文件名 (跳转到文件夹下) dir                ...

  8. node.js(node.js+mongoose小案例)_实现简单的注册登录退出

    一.前言 通过node.js基本知识对node.js基本知识的一个简单应用 1.注册 2.登录 3.退出 二.基本内容 1.项目结构搭建如图所示 2.这个小案列中用到了art-template子模板以 ...

  9. js post中服务器500错误信息,node.js - Node Express Post 500(内部服务器错误)jquery-3.4.1.min.js - 堆栈内存溢出...

    我一直在研究 node js/express js 应用程序有一段时间了. 我有从 jquery $ajax 调用中获取和发布的工作. 出于某种原因,我有一个帖子"loginUser&quo ...

  10. [Node.js] node.js入门

    什么是nodejs 1.Node.js官网地址 中文 1.Node是一个构建于Chrome V8引擎之上的一个Javascript运行环境 Node是一个运行环境,作用是让js拥有开发服务端的功能 2 ...

最新文章

  1. 六、Hive中的内部表、外部表、分区表和分桶表
  2. [PHP] 安装PHP报错“Primary script unknown”的解决方法
  3. 【数据结构总结】第六章 图(非线性结构)
  4. Web安全实践(14)嗅探,arp欺骗,会话劫持与重放攻击(下)
  5. git add 撤销_更科学地管理你的项目,Git 简明教程(二)
  6. java 制作动态手机壁纸_android 动态切换壁纸实例 利用service机制实现 附完整源码 带动态截图...
  7. Ubuntu Server 使用 PPA 安装 Java (JDK) 8
  8. 使用 T4 文本模板生成设计时代码
  9. yzj学长的即兴发挥
  10. linux需要添加一个根分区才能安装,linux 根分区扩展
  11. 数据库Update操作的一些技巧总结
  12. Nginx完全正向保密(perfect forward secrecy)设置
  13. Vue3+Naive踩坑
  14. 目标跟踪经典算法汇总(持续更新...)
  15. 故乡,生活十多年的地方
  16. 【美团王兴饭否DAY1】关于CEO的思考
  17. 多线程同步机制的几种方法
  18. 深圳国际会展中心希尔顿花园酒店亮相粤港澳大湾区核心地段
  19. Oracle表中添加字段及描述
  20. 专访杨云君:变身优秀开发者的学习之道

热门文章

  1. 13.nginx 源码目录及配置
  2. 7. Linux 环境
  3. 21. RequireJS
  4. sql中用于子查询的几个关键词 any(some是 any的别名),all,in,exists
  5. OpenLayers自定义投影,转换OpenLayers中加载的OSM的默认投影坐标
  6. java常用类--------枚举的基本使用
  7. 演示Eclipse插件实现代码提示和补全
  8. Django 分页 以及自定义分页
  9. Qt--自定义Delegate
  10. shell ftp上传下载文件