评论

收藏

[JavaScript] Node.js从入门到放弃(一)

开发技术 开发技术 发布于:2021-07-08 13:33 | 阅读数:284 | 评论:0

  
Node.js从入门到放弃(一)
前言
  这是该系列文章的第一篇,主要对Node进行一个简单的介绍
Node.js是什么
  Node.js是一个让JavaScript运行在服务器端的开发平台,它让JavaScript的触角伸到了服务器端,可以与PHP、JSP、Python、Ruby平起平坐。Node.js不是一种独立的语言,也不是框架,与PHP、JSP、Python、Perl、Ruby的“既是语言,也是平台”不同,Node.js的使用JavaScript进行编程,运行在JavaScript引擎上(如V8)。懂js,上手node很快。
Node.js的优势
  善于处理高并发,IO读写能力强,节约硬件成本
Node.js官网
  https://nodejs.org/en/
三大特点
  单线程
  在Java、PHP或者.net等服务器端语言中,会为每一个客户端连接创建一个新的线程,而每个线程需要耗费大约2MB内存。也就是说,理论上,一个8GB内存的服务器可以同时连接的最大用户数为4000个左右。要让Web应用程序支持更多的用户,就需要增加服务器的数量,而Web应用程序的硬件成本当然随之上升。Node.js不为每个客户连接创建一个新的线程,而仅仅使用一个线程。当有用户连接,就触发一个内部事件,通过非阻塞I/O、事件驱动机制,让Node.js程序宏观上是并行。使用Node.js,一个8GB内存的服务器,可以同时处理超过4万用户的连接。


  •   单线程优点: 操作系统完全不再有线程创建、销毁的时间开销。
  •   单线程缺点:某个线程崩溃,整个服务都会崩溃。
  非阻塞I/O
  Node.js使用的是非阻塞I/O,换句话说,异步。异步代码不会像同步代码那样阻塞后续代码运行,一个线程的CPU核心利用率永远是100%。当某个I/O执行完毕时,将以事件的形式通知执行I/O操作的线程,线程执行这个事件的回调函数。检查每个事件是否执行完毕以及执行栈的运行过程,就是事件循环。
  下面的代码会先打印1,即便延迟时间为0
setTimeout(()=>{  console.log(0)},0)console.log(1)
  事件驱动
  在Node中,客户端请求建立连接,提交数据等行为,会触发相应的事件。在Node中,在一个时刻,只能执行一个事件回调函数,但是在执行一个事件回调函数的中途,可以转而处理其他事件(比如,又有新用户连接了),然后返回继续执行原事件的回调函数,这种处理机制,称为事件环机制。Node.js底层是C++(V8也是C++写的)。底层代码中,近半数都用于事件队列、回调函数队列的构建。
用事件驱动来完成服务器的任务调度,就如同用一个线程,担负起了处理非常多的任务的使命。
适用场景


  •   涉及高并发和频繁的IO处理程序
  •   与socket配合,开发长连接的实时交互应用程序。(聊天室)
  •   为前台提供数据接口(不涉及高密度计算)
Node.js中的js
  Node.js和运行在浏览器端的js很像,变量+方法+数据类型+内置对象(Array+Object+ Date+ Math)和js是一致的,同时,也有差异性。Node.js内置很多核心模块(如fs,os,dns,http…),没有全局对象window,也没有BOM,DOM。
模块系统
  在Node中每一个文件就是一个完全封闭的模块,可以避免变量命名冲突污染。模块之间通过require实现模块加载,使用exports和module.exports进行模块导出。
// a.jsvar name="tom";exports.name=name//b.jsvar a=require("./a")console.log(a.name)//tom
  大多数场景,这两个的使用方式是一样的,但module.exports更好用一些。exports使用的时候是exports.xxx=xxx,必须以对象的形式使用而不能直接赋值,否则就改变了exports的指向,而它原本就是module的一个属性。
// 错误的写法 将会得到 undefinedexports = {  'a': 1,  'b': 2}// 正确的写法module.exports = {  'a': 1,  'b': 2}
模块类型
  Node中常见的模块类型三种,核心模块,文件模块,第三方模块.

  •   文件模块引用需要加入相对路径,核心模块和第三方模块(安装后) 可以直接引入
  核心模块

  •   fs 文件操作模块
  •   http 网络服务构建模块
  •   os 操作系统信息模块
  •   path 路径处理模块
  •   …
  文件模块

  •   自定义的.js文件
  第三方模块

  •   react
  •   vue
  •   jquery
  •   …来自npm模块


  
关注下面的标签,发现更多相似文章