前端模块化-commonjs,amd,cmd , es6

模块化历史:

        在es6还未正式发布前,前端模块化,往往都是通过函数式编程实现的,那时候只能这样

function moduleA(){   // code here...

}

function moduleB(){   // code here...

}

        因为没有块级作用域的概念,

   因为没有块级作用域的概念,前端模拟块状作用域,需要用函数作用域实现,但是为此会产生很多全局变量,污染了命名空间,命名冲突的问题也随之产生,用命名空间实现模块化是一种较好的方案。
        但是实现方式也是千差万别,于是有人提出了的前端模块化规范的概念,

CommonJS

   又有一些模块的概念涌现出来,比如源自服务器端js模块化的commonjs(一开始叫serverjs);

     CommonJS定义的模块分为:  模块引用(require)    模块输出(exports)       模块标识(module)

     由于commonjs采用同步加载机制,拉取模块依赖的时候会停止页面渲染,于是AMD规范这样的异步加载规范又被提出来,require.js,node.js是其最火的两个实现,nodejs遵循了commonjs规范,但并没有完全的遵循。但是又有国人觉得AMD这种异步加载的方式不太完美,于是司徒正美提出了CMD概念并祭出了其实现sea.js。

        直到2015年ES6正式发布,ECMAScript实现了原生的js模块化,import,export,块状作用域,是其十分常用的模块化的API,但并不是所有浏览器都实现了ES6的支持,由于业界毒瘤IE,尤其是ie8,ie9还占据着大部分市场份额,所以为了兼容ES6的新语法,还得引入第三方打包编译工具,比如babel,broswerify,html5-shim等向下兼容的方案。

       基于nodejs的Grunt,gulp这样的自动化模块和打包工具应运而生,require.js这样的冷兵器,黯然隐退。

       Webpack对上诉两个自动化模块和打包工具都不太满意,果断另起炉灶,获得了好评。

原文地址:https://www.cnblogs.com/Aladingding/p/6945735.html