Comments (14)
模块安装过程
- 查找此模块是否已经在node_modules中安装过,然后再.npm 缓存中查看是否有同版本缓存
- 如果有缓存,直接使用缓存
- 没有缓存去registry中按照registry/packagename/version模式搜索模块
- 将模块下载并解压到node_modules目录中,如果模块是可执行模块,将可执行文件放到 .bin 目录中
- 同时在模块放在 .npm 中作为副本缓存
依赖关系梳理
- 由于顶层模块下面可能依赖其他模块,模块之间存在嵌套依赖,packge.lock.json记录了模块的逻辑依赖树
- 如果完全安装逻辑依赖关系安装,会存在大量重复的包,npm会对安装做dudupe抹平处理,将重复的包安装在顶层
- 当模块安装时,先安装顶层模块,然后安装顶层模块的依赖模块,npm会检查顶层是否存在此模块,如果不存在将此模块安装在顶层
- 如果顶层已存在相同模块,检查版本是否符合要求-
- 符合要求,不再安装模块,直接跳过
- 不符合要求,在当前模块目录node_modeules下安装模块
- 重复此过程,直到顶层模块的嵌套依赖安装完毕
from daily-interview-question.
当A模块下的C v1.0模块被更新至C v2.0的前提下,我们可以通过npm dedupe把所有C v2.0的二级依赖模块“重定向”到一级目录下的那个C v1.0。
那如果A模块的C v1.0没更新到C v2.0,使用npm dedupe就没效果,那也就是说这个npm dedupe也只是在特定情况有效。也就是npm到目前为止依然是没办法完全解决冗余的。
from daily-interview-question.
1、发出npm install命令;
2、npm 向 registry 查询模块压缩包的网址;
3、下载压缩包,存放在~/.npm目录;
4、解压压缩包到当前项目的node_modules目录;
from daily-interview-question.
建议可以把原理性知识和整个流程分开说明,这样整个流程的顺序就很清晰了。
流程性的知识可以作为一个框架,然后慢慢填充细节内容到里面。
如果理解流程顺序不清晰,其实对于debug实际问题无益处。
以上只是建议。
from daily-interview-question.
上一步会获取到模块的压缩包地址(resolved 字段),npm 会用此地址检查本地缓存,缓存中有就直接拿,如果没有则从仓库下载。
有一个疑问,这里检查的是本地缓存.npm
目录 还是 /node_modules
目录 ?
貌似记得在 npm 中的某个版本中,即使 .npm
目录 中存在缓存,npm 也会重新下载
from daily-interview-question.
安装依赖的时候,获取完首层依赖,然后把每个依赖当做树的根节点,进行深度优先安装过程吗?还是是广度优先的?不同的安装方式,是不是对依赖版本冲突的解决也有影响?
from daily-interview-question.
当A模块下的C v1.0模块被更新至C v2.0的前提下,我们可以通过npm dedupe把所有C v2.0的二级依赖模块“重定向”到一级目录下的那个C v1.0。
那如果A模块的C v1.0没更新到C v2.0,使用npm dedupe就没效果,那也就是说这个npm dedupe也只是在特定情况有效。也就是npm到目前为止依然是没办法完全解决冗余的。
那后面几个C V2.0不是会去除冗余吗?
from daily-interview-question.
我也遇到这个问题,但是我还在苦苦寻找中
from daily-interview-question.
'查询node_modules目录之中是否已经存在指定模块' @sisterAn 请教一下,这里的查询,是只查询项目中package.json同级的目录呢还是会向父级目录逐层查询?
from daily-interview-question.
回答npm install如何计算需要安装哪些包的。英文版原文来自:https://dev.to/shree_j/how-npm-works-internally-4012
npm install 的算法过程
- 检查node_modules 目录或者package-lock.json是否存在,并且根据目前的依赖关系构建一棵树 A,并且copy一个新树B。
2.从package.json读出相关的依赖包,把这些依赖加到树B - 比较树A和树B,获取不同的节点,然后采用深度优先的原则获取依赖包。
from daily-interview-question.
之前面大厂的时候被问到这个问题,同事都说问的太细了,看来还是太嫩了
from daily-interview-question.
'查询node_modules目录之中是否已经存在指定模块' @sisterAn 请教一下,这里的查询,是只查询项目中package.json同级的目录呢还是会向父级目录逐层查询?
package.json 同级的目录 就会有 node_modules, @sisterAn 这里应该指的是所查询模块是否在当前目录下的node_modules, 如果在,就会在当前目录下找是否有package.json ,如果有package.json ,就会查找有没有index.js 文件,如果有就用index文件定义模块,如果没有index文件,还会检查package.json中是否有main元素,如果有那就用main元素指定的文件定义模块,如果没有就抛异常。
如果在当前目录下没有node_modules, 就会尝试进入父目录。如果父目录存在,就接着检查目录里是否有node_modules, 有则返回模块。
如果找了半天,父目录没有模块,或者干脆找到顶了,没有父目录了,这时就会是查找的最后一步,会检查由环境变量NODE_PATH 指定的目录下,也就是全局安装node_modules 所在的目录,如果还没有,就抛出异常,如果有,就返回它。
from daily-interview-question.
当 lock file 存在时,如果 lock file 记录的版本信息不需要更新,则会使用 lock file 记录的模块信息。
详见:https://stackoverflow.com/a/53594050/8101803
from daily-interview-question.
https://zhuanlan.zhihu.com/p/503702422
上面的讨论都 少一个对 bin 文件的处理过程
在安装时,npm 会将文件软链接/符号连接到 prefix/bin 以进行全局安装或./node_modules/.bin/本地安装
from daily-interview-question.
Related Issues (20)
- ``` javascript HOT 2
- 反转数字字符串 HOT 2
- es11
- 实现
- [...new Set(arr.toString().split(',').sort((a,b) => a-b ))].map(item => Number(item))
- let nums1 = [3,3,2] let nums2 = [1,2,3,3,2,2,4444] function res (nums1,nums2){ let a = [] for (const item of nums1) { for (const i in nums2) { if(item==nums2[i]){ a.push(nums2[i]) nums2.splice(i,1) break } } }; return a } console.log(res(nums1,nums2))
- splice插入
- 自己回答一波,若有错误请各位指出,互相学习!谢谢 ~
- 递归
- 第226题:TS 中逆变和协变如何理解
- objmap
- 通过协程来实现
- 这代码写的...
- 第 161 题:用最精炼的代码实现数组非零非负最小值 index HOT 2
- No description provided.
- > 就我的使用来说(Vue)key的作用是为了在数据变化时强制更新组件,以避免“原地复用”带来的副作用,官方文档也说明了**不带key性能更好**,见:[List Rendering - key](https://cn.vuejs.org/v2/guide/list.html#key)
- 解释原因
- an
- 同步/异步 > 微任务>宏任务
- Object.prototype,map
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from daily-interview-question.