Node.js学习笔记
一、node.js简介
- Node.js是一个能够在服务器端运行JavaScript的开放源代码、跨平台JavaScript运行环境。
- Node采用Google开发的V8引擎运行js代码,使用事件驱动、非阻塞和异步I/O模型等技术来提高性能,可优化应用程序的传输量和规模。
- Node大部分基本模块都用JavaScript编写。在Node出现之前,JS通常作为客户端程序设计语言使用,以JS写出的程序常在用户的浏览器上运行。
- 目前,Node已被IBM、Microsoft、Yahoo!、Walmart、Groupon、SAP、 LinkedIn、Rakuten、PayPal、Voxer和GoDaddy等企业采用
- Node主要用于编写像Web服务器一样的网络应用,这和PHP和Python是类似的。
- 但是Node与其他语言最大的不同之处在于,PHP等语言是阻塞的而Node是非阻塞的。
- Node是事件驱动的。开发者可以在不使用线程的情况下开发出一个能够承载高并发的服务器。其他服务器端语言难以开发高并发应用,而且即使开发出来,性能也不尽人意。
- Node正是在这个前提下被创造出来。
- Node把JS的易学易用和Unix网络编程的强大结合到了一起。
- Node.js允许通过JS和一系列模块来编写服务器端应用和网络相关的应用。
- 核心模块包括文件系统I/O、网络(HTTP、TCP、UDP、DNS、TLS/SSL等)、二进制数据流、加密算法、数据流等等。Node模块的API形式简单,降低了编程的复杂度。
- 使用框架可以加速开发。常用的框架有Express.js、Socket.IO和Connect等。Node.js的程序可以在Microsoft Windows、Linux、Unix、Mac OS X等服务器上运行。
- Node.js也可以使用CoffeeScript、TypeScript、Dart语言,以及其他能够编译成JavaScript的语言编程。
Node
- Node是对ES标准一个实现,Node也是一个JS引擎
- 通过Node可以使js代码在服务器端执行
- Node仅仅对ES标准进行了实现,所以在Node中不包含DOM 和 BOM
- Node中可以使用所有的内建对象
String Number Boolean Math Date RegExp Function Object Array
而BOM和DOM都不能使用
但是可以使用 console 也可以使用定时器(setTimeout() setInterval())
- Node可以在后台来编写服务器
Node编写服务器都是单线程的服务器
- 进程
- 进程就是一个一个的工作计划(工厂中的车间)
- 线程
- 线程是计算机最小的运算单位(工厂中的工人)
线程是干活的
- 传统的服务器都是多线程的
- 每进来一个请求,就创建一个线程去处理请求
- Node的服务器单线程的
- Node处理请求时是单线程,但是在后台拥有一个I/O线程池
二、node的用途
- Web服务API,比如REST
- 实时多人游戏
- 后端的Web服务,例如跨域、服务器端的请求
- 基于Web的应用
- 多客户端的通信,如即时通信
三、node.js的安装
到 [node.js官网](下载 | Node.js 中文网 (nodejs.cn))下载
四、node.js的运行
(一)方式一
node js文件 //运行js文件
(二)方式二
vscode直接右键 run code
五、ECMAScript标准的缺陷(ES5)
- 没有模块系统
- 标准库较少
- 没有标准接口
- 缺乏管理系统
六、COMMONJS规范
(一)commonjs出现的原因
- CommonJS规范的提出,主要是为了弥补当前JavaScript没有模块化标准的缺陷。
- CommonJS规范为JS指定了一个美好的愿景,希望JS能够在任何地方运行。
- CommonJS对模块的定义十分简单:
- 模块引用
- 模块定义
- 模块标识
(二)CommonJS模块化
1、Node.js模块化的解释
1、模块引用
2、模板定义
2.1 模块化练习
3、模块标识
- 模块标识其实就是模块的名字,也就是传递给require()方法的参数,它必须是符合驼峰命名法的字符串,或者是以.、…开头的相对路径、或者绝对路径。
- 在Node中,模块分为三类:一类是底层由C++编写的内建模块,一类是Node提供的核心模块;还有一类是用户编写的模块,称为文件模块。
七、包
- CommonJS的包规范允许我们将一组相关的模块组合到一起,形成一组完整的工具。
- CommonJS的包规范由包结构和包描述文件两个部分组成。
- 包结构 用于组织包中的各种文件
- 包描述文件描述包的相关信息,以供外部读取分析
(一)包结构
• 包实际上就是一个压缩文件,解压以后还原为目录。符合规范的目录,应该包含如下文件:
– package.json 描述文件
– bin 可执行二进制文件
– lib js代码
– doc 文档
– test 单元测试
(二)包描述文件
• 包描述文件用于表达非代码相关的信息,它是一个JSON格式的文件 – package.json,位于包的根目录下,是包重要组成部分。
八、NPM
- CommonJS包规范是理论,NPM是其中一种实践。
- 对于Node而言,NPM帮助其完成了第三方模块的发布、安装和依赖等。借助NPM,Node与第三方模块之间形成了很好的一个生态系统。
[NPM详细见这篇文章]((30条消息) npm包管理工具_Less talent的博客-CSDN博客)
九、Buffer(缓冲区)
[更多API可以到官网查询](API 文档 | Node.js 中文网 (nodejs.cn))
(一)Buffer.from(str)
(二)Buffer.alloc(size)
(三)Buffer.alloUnsafe(size)
(四)Buffer.toString()
十、文件系统
- 在Node中,与文件系统的交互是非常重要的,服务器的本质就将本地的文件发送给远程的客户端
- Node通过fs模块来和文件系统进行交互
- 该模块提供了一些标准文件访问API来打开、读取、写入文件,以及与其交互。
- 要使用fs模块,首先需要对其进行加载
- fs模块中所有的操作都有两种形式可供选择同步和异步。
- 同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码。
- 异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回。
下面是API中的options参数的可选项
关于路径的问题的解释
(一)同步文件写入
(二)异步文件写入
(三)简单文件写入
1、简单文件同步写入
2、简单文件异步写入
(四)流式文件写入
(五)简单文件读取
1、同步文件读取
2、同步复制
3、异步文件读取
4、异步复制
(六)流式文件读取
1、流式读取
2、流式复制
(1)方法一(复杂)
(2)方法二(简单)
(七)其他操作
• 列出文件
– fs.readdir(path[, options], callback)
– fs.readdirSync(path[, options])
• 截断文件
– fs.truncate(path, len, callback)
– fs.truncateSync(path, len)
• 建立目录
– fs.mkdir(path[, mode], callback)
– fs.mkdirSync(path[, mode])其他操作
• 删除目录
– fs.rmdir(path, callback)
– fs.rmdirSync(path)
• 重命名文件和目录
– fs.rename(oldPath, newPath, callback)
– fs.renameSync(oldPath, newPath)
• 监视文件更改写入
– fs.watchFile(filename[, options], listener)
r(path[, mode], callback)
– fs.mkdirSync(path[, mode])其他操作
• 删除目录
– fs.rmdir(path, callback)
– fs.rmdirSync(path)
• 重命名文件和目录
– fs.rename(oldPath, newPath, callback)
– fs.renameSync(oldPath, newPath)
• 监视文件更改写入
– fs.watchFile(filename[, options], listener)