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

    函数式编程

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

    相关文章

      网友评论

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

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