Liqiuyue9597/front-end-interview

模块化规范

Liqiuyue9597 opened this issue · 2 comments

我自己是只知道common JSES6的模块化规范,至于AMDCMD我没用过就直接没说。问题不大。

  1. requireimport的区别等等常规问题
  2. require如何解析路径
  1. CommonJS:将每个文件都看成是一个模块,其他的以编程方式声明模块。CommonJS模块拥有隐含的局部作用域,全局作用域必须通过global显式的被访问。CommonJS模块导入依赖及导出供外部调用的接口都是动态的,导入依赖是通过require函数。这个函数是同步的,会返回所请求模块暴露的接口。要导出的值必须赋给module.exports,可以导出任一类型的值。
  2. ES6模块:ES6模块是通过export语句暴露API的。 module.exports = 可以被export default替换,但是在CommonJS中可以为module.exports动态赋值,export只能处出现模块顶级。

阿里巴巴:Javascript 模块化指北

当 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()源码解析