深入浅出Node.js 笔记
第一章 node简介
语言和环境之间的关系
语言,是编写代码的语法规范。
环境(平台),提供了执行代码的能力
语言必须在环境上运行。
非阻塞式I/O模型
类似于同步和异步
Node环境中js组成部分
ECMAscript + 全局成员 + 核心API模块
环境变量
环境变量的作用,在任意目录下面都可以打开(环境变量/path配置的)程序
用户变量和系统变量区别
用户变量只有当前用户可以使用,系统变量所有用户都可以使用
访问核心成员直接使用 require('核心成员name')来调用
FS模块
文件读取会根据执行Node命令时的目录拼接
__dirname 表示当前文件所处的文件路径
path模块
path.join 兼容性更好,可以针对不同系统
JS的单线程和异步
js解析和执行是单线程的,但是 宿主环境(浏览器或node)是多线程的
异步任务是由宿主环境开启子线程完成,通过 事件驱动,回调函数,队列,把完成的任务交给主线程执行
js引擎一直在做一个工作,就是从任务队列中提取任务,放到主线程执行
异步执行任务的好处,提高耗时任务的效率,提高js解析引擎的工作效率
模块化
模块化为了解决文件之间的耦合
是一种开发思想
模块化的好处
协作开发,方便维护
CommonJs 规范
exports 定义模块
module 模块
require 请求模块
在模块中,上下文提供require()方法引入外部模块。exports对象用于到处当前模块的方法或变量,并且他是唯一的到处的出口。在模块中,还存在一个module对象,它代表模块自身,exports是module的属性,在node中,一个文件就是一个模块,讲方法挂载在exports对象上作为属性即可定义导出的方式
一个模块作用域中,向外暴露私有成员是,已 module.exports为准
AMD 和 CMD 规范
commonJS模块是同步加载的
AMD和CMD下模块是异步加载的
1.AMD 对于依赖的模块,ADM是提前执行, 推崇依赖前置
2.CMD 延时执行, CMD推崇 as lazy as possible 推崇依赖就近
ES6的模块化:es6是在语言标准层面上,实现模块功能,完全可以取代CommonJS和AMD规范,称为浏览器和服务器通用的模块解决方案;
npm (node package manager)
Node包管理工具
常用命令:
npm install pagageName --save-dev 开发阶段需要的包,可缩写为 -D
第二章 模块机制
路径分析和文件定位
- 文件扩展名分析
require()在分析标识符过程中,会出现不含文件扩展名的情况,这种情况下,Node会按照.js,.node, .json 的方式依次不足拓展名,依次尝试,如果是.node/.json文件,文件加上拓展名会提升速度
模块编译
- 编译和执行,是引入文件模块的最后一个阶段,每一个编译成功的模块,都会将其文件路径作为索引缓存在Module._cache对象上,以提高二次引入的性能
js模块的编译
- 在编译过程中,Node对获取的js文件进行了头尾包装,在头部添加( function(exports, require, module, __filename, __dirname){ \n, //end \n} ), 这样在每个模块文件之间都进行了作用域隔离。
核心模块
- Node的核心模块在编译成可执行文件的过程中被编译进了二进制文件。
- js核心模块的编译过程
- 1.转存为C/C++代码
- Node采用了v8附带的js2c.py工具,将所有内置的js代码转换为C++里的数组
- 2.编译Js核心模块
- 在核心模块中,有些模块全部由c/c++编写,有些模块则由C/C++完成核心部分,其他部分由js实现包装或向外到处。
- 1.转存为C/C++代码
包 与 NPM
- 包结构
- 包实际上是一个存档文件,完全符合CommonJs规范的包目录应该包含以下文件
- package.json:包描述文件
- bin:用于存放可执行二进制文件的目录
- doc: 用于存放文档的目录
- test: 用于存放单元测试用例的代码
- README.md: 对项目进行描述
- 包实际上是一个存档文件,完全符合CommonJs规范的包目录应该包含以下文件
- 包描述文件与NPM
- CommonJs为package.json定义了以下必须的字段
- name,报名。规范定义由小写字母和数字组成,可以包含.、_和-,但不允许出现空格。包名必须唯一,以免对外公布时产生重名冲突的误解。NPM建议不要再包名中附带上node或js重复标识它是JS或Node模块
- description,包简介
- version, 版本号,常常用于一些版本控制的场合。
- keywords,关键词数组,NPM中主要用来做分类搜索
- maintainers,包维护者列表
- contributors,贡献者列表
- bugs, 一个可以反馈bug的网页地址或邮件地址
- licenses,当前包所使用的许可证列表
- repositories,托管源代码的位置列表
- dependencies,使用当前包所需奥依赖的包列表
- homepage,当前包的网站地址
- os,操作系统支持列表
- engine,支持的js引擎猎鸟
- directories,包目录说明
- implements,实现规范的列表
- scripts,脚本说明对象
- 在包描述文件的规范中,NPM实际需要的字段有
- author,包作者
- bin,一些包作者希望包可以作为命令行工具使用
- main,模块引入方法require()在引入包是,会优先检查这个字段。
- devDependencies,一些模块只在开发时需要依赖。
- CommonJs为package.json定义了以下必须的字段
NPM常用功能
- 不熟悉NPM命令之前,可以直接执行NPM查看到帮助引导说明
- 初始化包描述文件 npm init
Node.js 异步I/O
node自身 是多线程的
- JavaScript是单线程的,所以按常识理解为不能充分利用多核CPU。在Node中,除了JS是单线程外,Node自身是多线程的,只是I/O线程使用的CUP较少。除了用户代码无法并行执行外,所有的I/O(磁盘I/O和网络I/O)则是可以并行起来的
非I/O的异步API
- Node中存在一些与I/O无关的异步API,分别是 setTimeout(),setInterval(), setImmediate
- 事件循环是异步实现的核心,它与浏览器中的执行模型基本保持了一致。
函数式编程
- 高阶函数
- 高阶函数可以把函数作为参数,或是将函数作为返回值的函数。