深入浅出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实现包装或向外到处。

包 与 NPM

  • 包结构
    • 包实际上是一个存档文件,完全符合CommonJs规范的包目录应该包含以下文件
      • package.json:包描述文件
      • bin:用于存放可执行二进制文件的目录
      • doc: 用于存放文档的目录
      • test: 用于存放单元测试用例的代码
      • README.md: 对项目进行描述
  • 包描述文件与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,一些模块只在开发时需要依赖。

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
  • 事件循环是异步实现的核心,它与浏览器中的执行模型基本保持了一致。

函数式编程

  • 高阶函数
    • 高阶函数可以把函数作为参数,或是将函数作为返回值的函数。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 2. NODE模块端实现 2.2 node模块的实现 引入模块: 路径分析 文件定位 编译执行 2.2.1 优先从...
    yozosann阅读 2,158评论 0 0
  • 前言 js是从网页小脚本演变过来的,至今,前端的js库,也不像一个真正的模块。前端js经历了工具类库、组件库、前端...
    白昔月阅读 3,320评论 2 11
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    Myselfyan阅读 4,103评论 2 58
  • Node.js是目前非常火热的技术,但是它的诞生经历却很奇特。 众所周知,在Netscape设计出JavaScri...
    w_zhuan阅读 3,642评论 2 41
  • 红泥地的脚印, 连接城市的柏油路, 乡村的繁星, 点亮街市的霓虹灯。 茅庵的月光, 映照青城的灯火辉煌。 黄河的涛...
    刘晓松阅读 240评论 0 2