const x = require("x");
require一个模块的加载是同步的
同步说明只有当x整个模块被加载完(包括x所依赖的所有模块),当前模块的内容才能被运行。 这个在服务器中没有什么问题,因为服务器加载的都是本地js文件,加载速度很快。
在以前我们在浏览器中不用commonJs而通常采用AMD,CMD
当在网页中加载速度就显得非常重要,js的加载速度会影响到网页的渲染,所以我们的网页是用esmodule,模块的加载时异步的,不用加载完所有模块就能够得到模块之间的依赖,所以通过esmodule规范去做tree shaking
模块的查找过程
1、x为node内置模块,如http,fs
直接引入并返回核心模块
2、x为相对路径,绝对路径
如果require绝对路径的文件,则直接查找对应的路径,速度最快
相对路径的模块则相对于当前调用require的文件去查找
如果按确切的文件名没有找到模块,则 NodeJs 会尝试带上 .js、.json或 .node拓展名再加载
3、x为非内置模块,也非相对绝对路径。
首先查找当前文件夹下的node_module,如果没有就往上一层文件夹中的node_module中查找,如果没有继续往上一层中查找......直到根目录,如果没有查找到就报错。
Error: Cannot find module 'axios'
模块的加载过程
- 每当模块第一次被require之后,模块中的Js代码会被运行一次。
- 模块被多次require,js代码只会被运行一次。
- 如果被循环引用,则按照深度优先搜索顺序依次执行。