模块化规范
Liqiuyue9597 opened this issue · 2 comments
Liqiuyue9597 commented
我自己是只知道common JS
和ES6
的模块化规范,至于AMD
和CMD
我没用过就直接没说。问题不大。
require
和import
的区别等等常规问题require
如何解析路径
Liqiuyue9597 commented
- CommonJS:将每个文件都看成是一个模块,其他的以编程方式声明模块。CommonJS模块拥有隐含的局部作用域,全局作用域必须通过
global
显式的被访问。CommonJS模块导入依赖及导出供外部调用的接口都是动态的,导入依赖是通过require
函数。这个函数是同步的,会返回所请求模块暴露的接口。要导出的值必须赋给module.exports
,可以导出任一类型的值。 - ES6模块:ES6模块是通过
export
语句暴露API的。module.exports =
可以被export default
替换,但是在CommonJS中可以为module.exports
动态赋值,export
只能处出现模块顶级。
Liqiuyue9597 commented
当 Node 遇到 require(X) 时,按下面的顺序处理。
(1)如果 X 是内置模块(比如 require('http'))
a. 返回该模块。
b. 不再继续执行。
(2)如果 X 以 "./" 或者 "/" 或者 "../" 开头
a. 根据 X 所在的父模块,确定 X 的绝对路径。
b. 将 X 当成文件,依次查找下面文件,只要其中有一个存在,就返回该文件,不再继续执行。
X
X.js
X.json
X.node
c. 将 X 当成目录,依次查找下面文件,只要其中有一个存在,就返回该文件,不再继续执行。
X/package.json(main字段)
X/index.js
X/index.json
X/index.node
(3)如果 X 不带路径
a. 根据 X 所在的父模块,确定 X 可能的安装目录。
b. 依次在每个目录中,将 X 当成文件名或目录名加载。
(4) 抛出 "not found"。
require()源码解析