获得徽章 0
- node 中 require 是怎么查找对应的包呢?node_modules 是如何找到文件的入口呢?
在 Node.js 中,`require` 函数用于引入模块。当调用 `require` 时,Node.js 会按照以下顺序查找对应的模块:
1. 首先,Node.js 会将 `require` 函数中给定的模块路径视为一个相对或绝对路径。
2. 如果路径是一个相对路径,Node.js 会将其相对于调用 `require` 的模块的位置进行解析。
3. 如果路径是一个绝对路径,Node.js 会直接使用该路径。
4. 如果模块路径不是一个相对或绝对路径,Node.js 会按照以下步骤查找模块:
- 首先,在内置模块中查找是否存在该模块。
- 如果在内置模块中找不到该模块,则 Node.js 会根据模块路径从当前目录的 `node_modules` 文件夹查找是否存在具有该模块名的文件夹。
- 如果当前目录的 `node_modules` 文件夹中没有找到该模块名的文件夹,则 Node.js 会继续向上一级目录查找,直到找到根目录为止,依次尝试 `node_modules` 文件夹里的模块名,直到找到该模块或者达到根目录。
5. 如果找到了模块所在的文件夹,Node.js 会首先查找该文件夹下是否存在一个 `package.json` 文件。
6. 如果存在 `package.json` 文件,并且该文件中有一个名为 `main` 的属性指定了入口文件,则 Node.js 会使用该入口文件。
7. 如果没有 `package.json` 文件或者该文件没有指定入口文件,则 Node.js 会尝试在该文件夹下查找一个名为 `index` 的文件作为入口文件。
总结来说,Node.js 会按照模块路径的先后顺序查找内置模块和 `node_modules` 文件夹,并根据 `package.json` 文件或者默认规则找到模块的入口文件。展开评论点赞 - 倒计时时间偏差问题解析
由于 setTimeout 和 setInterval 都是将对应的函数丢进任务队列,而不是立即执行,所以函数实际执行的时间一定是大于指定的时间间隔的,而不可能等于该时间。
这里涉及到 JS 的代码执行顺序问题, JS 属于单线程,代码执行的时候首先是执行主线程的任务,也就是同步的代码,如果遇到了函数或者异步的代码块,并不会立即执行,而是丢进对应的任务队列中,任务队列是先进先出,待主线程的代码执行完毕以后,才会依次的执行任务队列中的函数。所以,在执行对应的计时器任务时,是指定的时间间隔 + 主线程执行时间 + 任务队列前面函数的执行时间,必然是大于指定的计时器时间的。
因此,对于 setInterval 来说,每次将函数丢进任务队列中,而每次函数的实际执行时间又都是大于指定的时间间隔的,一旦执行的次数多了,误差就会越来越大。展开评论点赞