Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

JavaScript - NodeJS #18

Open
tomoya06 opened this issue Sep 12, 2020 · 1 comment
Open

JavaScript - NodeJS #18

tomoya06 opened this issue Sep 12, 2020 · 1 comment

Comments

@tomoya06
Copy link
Owner

tomoya06 commented Sep 12, 2020

NPM

npm 是 Node 的模块管理器,功能极其强大。它是 Node 获得成功的重要原因之一。

本文参考壹题阮一峰的博客

npm install 安装过程

安装机制概述

  1. 发出npm install命令
  2. 查询node_modules目录之中是否已经存在指定模块
    • 若存在,不再重新安装
    • 若不存在:npm 向 registry 查询模块压缩包的网址;下载压缩包,存放在根目录下的.npm目录里,当然若有缓存就不用重新下载了;解压压缩包到当前项目的node_modules目录
  3. 执行工程自身生命周期

获取依赖模块

首层依赖和依赖树

首层依赖,从package.json中获取,即dependencies / devDependencies属性,根据首层依赖分别逐级获取各个模块的依赖,得到依赖树

模块扁平化

依赖树中可能存在大量重复模块,例如A、B两模块都依赖了C。npm中加入了dedupe过程,会遍历依赖树的所有节点,都加到根节点上,同时会处理和处理重复模块。

重复模块:指的是模块名相同且 semver 兼容。每个 semver 都对应一段版本允许范围,如果两个模块的版本允许范围存在交集,那么就可以得到一个兼容版本。

如果不存在兼容版本,则会分别安装两个版本的依赖,以moduleC@version1moduleC@version2的形式都保存到依赖树中,下载并安装。

npm semver

本节参考掘金博客

版本号一般有三个部分,以.隔开,就像X.Y.Z,其中

  • X:主版本号(major),不兼容的大改动
  • Y:次版本号(minor),功能性的改动
  • Z:修订版本号(patch),问题修复

每个部分为整数(>=0),按照递增的规则改变。
在修订版本号的后面可以加上其他信息,用-连接,比如:

  • X.Y.Z-Alpha: 内测版
  • X.Y.Z-Beta: 公测版
  • X.Y.Z-Stable: 稳定版

npm依赖项支持一定范围内的版本。分别用^ / ~ / x / -等符号表示:

  • ^: 匹配大于X.Y.Z的更新Y、Z的版本号,例如^15.6.1 = [15.6.1, 15.9.999]
  • ~: 匹配大于X.Y.Z的更新Z的版本号,例如~15.6.1 = [15.6.1, 15.6.999]
  • x: 可以替代X、Y、Z中任意一个,表示该位置可更新,例如15.x = [15.0, 16.0)
  • -: 包含第一个版本号和第二个版本号的范围,表示的是一个闭区间,例如0.1.0 - 2= [0.1.0, 2.999.999]

npm生命周期

preinstall、install、postinstall、prepublish、prepare等

@tomoya06
Copy link
Owner Author

tomoya06 commented Oct 4, 2020

Node中的Event Loop

基于libuv实现。对比浏览器中的事件循环,可以看这里

image

  • timer: 执行setTImeout/setInterval的回调,同样,timer指定的时间不是准确时间
  • pending callback: 执行延迟到下一个循环迭代的 I/O 回调
  • idle/prepare: 仅系统内部使用
  • poll:取出新的IO事件,执行UI相关的回调,除开close(timer阶段执行)、setImmediate回调(check阶段执行)
  • check: 执行setImmediate回调
  • close callback: 执行close回调,如socket.on('close', ...)

微任务和宏任务在Node的执行顺序

Node 10以前:

  • 执行完一个阶段的所有任务
  • 执行完nextTick队列里面的内容
  • 然后执行完微任务队列的内容

Node 11以后:与浏览器一致,即每执行一个宏任务就执行完微任务队列。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant