JavaScript 模块化是什么?

js在es6之前是没有模块化这一概念的
es6之前,js模块化有几种规范:CommonJS、AMD。

CommonJS
CommonJS有一个全局方法require(),nodejs就是采用的CommonJS规范来实现的模块化:

  var path = require('path');
  path.join(...)

上面的代码可以看出来,其实这两行代码是同步的,第二行代码,必须要等第一行代码执行完毕才能执行,不然就会报错。
这就是CommonJS的特点,同步执行。
缺点也是同步导致的,如果在浏览器中使用CommonJS规范,因为浏览器加载资源会通过网络请求,所以如果客户端的网络很卡,那同步的模块加载就卡住了,很影响用户体验。所以浏览器中需要用异步模块规范。
AMD
AMD采用异步方式加载模块,模块的加载不影响它后面语句的运行,加载模块的时候,会定义一个回调函数,等待模块加载完毕后,会去调用这个函数,实现异步加载。

  require(['path'], function (path) {
    path.join(...);
  });

es6以后,js语言本身提供了模块化的实现,可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案:

import {path} from 'path' 
path.join(...)

上面代码其实是一个import命令,import命令会被 JavaScript 引擎静态分析,先于模块内的其他语句执行,本质是从path模块加载一个path方法,其他方法不加载,这种加载称为“编译时加载”或者静态加载,即 ES6 可以在编译时就完成模块加载,效率要比 CommonJS 模块的加载方式高。
但是缺点来了,import命令是在编译阶段执行的,所以他能与js语法嵌套使用,比如:

if (true) {
import xx form 'xxx'
}

这样会报错。于是,就有了import()方法提案:

if (true) {
import('xxx').then(() => {
  // xxx
})
}

这样,是不是跟AMD规范很像,其实import()函数就是js语言本身模块化的异步实现,并且返回一个Promise,来实现回调。