美文网首页
深入浅出Node.js 笔记

深入浅出Node.js 笔记

作者: 阿尔方斯 | 来源:发表于2018-08-09 21:14 被阅读0次

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

函数式编程

  • 高阶函数
    • 高阶函数可以把函数作为参数,或是将函数作为返回值的函数。

相关文章

  • (三)NodeJs快速入门

    本学习笔记是根据《Node.js开发指南》一书进行学习。前面的几篇是根据《深入浅出Node.js》学习,但是学习到...

  • 理解 Node.js 的 GC 机制

    《深入浅出Node.js》第五章《内存控制》阅读笔记 随着 Node 的发展,JavaScript 的应用场景早已...

  • (一)初识NodeJs

    说明:该学习笔记参考《深入浅出Node.js》在学习过程中,添加了自己的理解和适当的补充!仅供参考! NodeJs...

  • (二)NodeJs模块机制和异步I/O

    说明:该学习笔记参考《深入浅出Node.js》在学习过程中,添加了自己的理解和适当的补充!仅供参考! NodeJs...

  • 2021-04-07each和foreach

    深入浅出 Node.js(三):深入 Node.js 的模块机制 https://www.infoq.cn/art...

  • Node.js 有什么弊端

    《深入浅出 Node.js》阅读随笔 此文为《为什么选择 Node.js》姊妹篇,简单聊一下 Node.js 的缺...

  • Node.js 有必要写测试用例吗?

    《深入浅出 Node.js》阅读随笔 先说结论:很有必要!不单是 Node.js,除非是作为体验或者 Demo 演...

  • 异步编程的困惑

    《深入浅出 Node.js》阅读随笔 众所周知,Node.js 虽然也有部分同步编程的方式,但主要还是以后异步编程...

  • 发布/订阅模式

    《深入浅出 Node.js》阅读随笔 Node.js 下使用发布/订阅的模式写程序,可以很优雅的解藕业务逻辑,尤其...

  • 读书笔记——深入浅出 node.js

    深入浅出 Node.js 阅读目的 node.js 工具链在 Web 前后端开发的作用越来越显著。我希望通过阅读本...

网友评论

      本文标题:深入浅出Node.js 笔记

      本文链接:https://www.haomeiwen.com/subject/uvxhbftx.html