更了不起的nodejs读书笔记

275 阅读4分钟

node初识

什么是nodejs

官网描述:

Node.js不是javascript应用,也不是编程语言,也不是语言框架,而是javascript的运行时环境对象(我理解的为类似于浏览器一样的宿主对象)

Node.js构建在Chrome V8引擎上,v8引擎是通过c或c++编写的,相当于将javscript转化为c或c++代码后再执行,所以用的是js语言,减少了语言学习成本

Node.js轻量且高效,每个函数都是同步,但是I/O操作是异步的。所有由javscript编写的函数的I/O操作最终都将由libuv(也是c/c++编写的)事件循环处理库来处理,隐藏了非阻塞I/O的具体细节,简化了并发编程模型,可以轻松编写高性能的Web应用

Node.js使用了npm(node package manager)作为包管理器

Node.js执行流程: 事件循环(Event Loop)分发I/O任务,最终工作线程(Work Thread)会将任务放到线程池(Thread Pool)中执行,而事件循环只需要等待执行结果就行

Node.js之父演讲稿内容简介:

  • v8引擎(上面所属所述)
  • Node.js内置v8引擎,所以使用的是Javascript语法
  • js是单线程语言,这就意味着任务不能并发执行,需要排队。如果前面一个任务执行任务事件过久,后面一个任务就不得不等待
  • 一般情况下,排队等待的时候,cpu是闲置的。其实cpu完全可以不管I/O设备而直接挂起处于等待中的任务,先运行排在后面的任务
  • 将等待的I/O任务放到事件循环中,事件循环由libuv提供
  • 事件循环负责将文件I/O任务放到线程池中,线程池由libuv提供。网络I/O任务不通过线程池完成
  • 只要有cpu资源,就应尽力完成

Node.js在接受任务的时候是单线程的,无需切换进程/线程,但是执行任务的时候是多线程的(线程池)

Node.js同时支持Chakra引擎(ms开发,第一个支持async函数的引擎),但是依旧以v8引擎为主,Chakra版本需要单独安装

Node.js特点

适合构建Web应用
  • 构建网站(做入门开发的,和传统的java、php没多大区别)
  • 构建API(大前端的发展IOS,Andriod等多种客户端开发,为其提供可以复用的api接口变得更加困难,Node.js实现API接口开发,在各个Node.js框架中都是极其简单的)
  • 构建RPC(Remote Procedure Call,远程过程调用服务)服务(服务化--RPC协议服务;将数据库返回的数据,以TCP形式传输给调用方;将RPC服务包装成HTTP API也是Node.js擅长的)
  • 前后端分离(分离场景:1.前端页面静态化。2.前端页面服务化。3.服务端渲染。4.渐进式Web应用)
  • 适用于serverless
  • 高性能(1.执行速度块。2.天生异步(事件驱动,非阻塞I/O))
  • 简单(API写好了,语言还是javascript)
  • 可扩展(适用大量npm上的模块,可以搭配其他语言等等)
应用场景
  1. 跨平台开发(Web,移动端,RN等等)
  2. 后端
  3. 前端开发(工程化:Gulp、Webpack构建开发工具)
  4. 工具开发(也是工程化问题)

Node.js入门

安装完nodejs后,创建一个js文件,名为helloworld.js内容:

console.log("Hello World");

并在终端中输入命令node helloworld.js
执行后会发现终端中Hello World会被打印出来

这就证明了,Node.js支持javascript

CommonJS

Node.js是基于CommonJS规范的实现,即每个文件都是一个模块,每个模块内的代码都必须遵守CommonJS的规范。多文件调用的核心是基于模块对外暴露接口和互相引用。
简单的暴露和引用
创建两个js文件:hello_commonjs.js&hello_common_test.js

hello_commonjs.js内容:
module.exports = function (){
    console.log("Hello CommonJS")
}

hello_commonjs_test.js内容:
const fn = require("./hello_commonjs.js");
fn();

是的,结果就如你所想的一样
终端中输入node hello_commonjs_test.js结果是打印对应的内容

创建简单的http服务:

const http = require("http"); (1)
http.createServer((req,res)=>{ (2)
    let status = 200
    res.writeHead(status,{'Content-Type':'text/plain'}); (3)
    res.end('Hello Node.js 1111'); (4)
}).listen(3000,"127.0.0.1"); (5)
console.log("运行成功")
  1. 引入Node.js SDK(开发工具包)内置的http模块
  2. 通过http.createServer创建一个HTTP服务res可以看作是响应报文函数
  3. 定义响应头的状态码和Conetent-Type类型
  4. 响应文本
  5. listen方法指定端口以及ip地址