前端模块化注:以下所有解释完全基于我的主观想法。模块化的地方,如有不妥之处还望见谅。我必须先了解它。不要太在意模块的出处和时间顺序。只需要创建一个js文件,里面定义了一些方法,常量等,提供给其他页面。这是最简单的模块,它只是一个功能文件,没有private,会污染整个世界以后把所有的方法都放在对象里面,通过对象使用这些方法,但是外部可以通过对象改变里面的属性,而且还会污染整个世界,这个缺点也很不好然后就出现了命名空间这个东西,命名空间的意思是:如果全局空间中有同名对象,则该对象不会被覆盖,否则一个将创建新的命名空间。变种我的名字空间=我的名字空间||{};MYNAMESPACE.person=function(){console.log("helloword");};这还是改变不了修改后的模块化开发iife(自执行函数)的命运,顾名思义,就是在创建的时候直接执行,然后返回一个参数对象(或者只返回其他参数)。对象可以有方法,属性等,然后在外部调用,不会污染整个世界,也不会被外部改变//创建自执行函数vartestUtils=function(){functiontest(data){console.log(data)}return{test}}();//执行自执行函数中的方法testUtils.test("张三")//执行结果-张三CJS(CommonJS参考链接https://javascript.ruanyifeng...)每个文件都是一个模块,有自己的作用域。文件中定义的变量、函数和类都是私有的,对其他文件不可见。CommonJS规范加载模块是同步的。由于Node.js主要用于服务端编程,模块文件一般已经存在于本地硬盘,加载速度更快,无需考虑异步加载的方式,所以CommonJS规范更适用。主要特点:所有代码运行在模块作用域内,不会污染全局作用域。模块可以多次加载,但它们只会在第一次加载时执行,然后会缓存一个副本。所有后续的引用和返回都由缓存模块加载。顺序是根据出现的位置来确定的,因为输出的是一个拷贝值,如果外部修改了模块代码,是不会生效的一般模块规范主要是给客户端使用的,因为客户端主要关注加载时的加载速度。如果像CJS那样同步执行,在加载大型组件时会相当耗时,于是诞生了。出于AMD客户端的异步规范,AMD规范指的是组件方法require([module],callback);第一个参数[module]是一个数组,里面的成员是要加载的模块;第二个参数callback为加载成功后的回调函数。//引入lodash组件并使用require(['lodash'],function(lo){lo.isArray([])});UMD就像一个工厂,为了同时支持CJS和AMD规范,判断谁的规范支持谁的规范,它的最外层是一个iifeESM(ES6Module参考链接http://caibaojian.com/es6/mod...)ES6实现了模块化的功能。在ES6之前,社区制定了一些Module加载方案,最重要的是CommonJS和AMD。前者用于服务器,后者用于浏览器。ES6在语言标准层面实现了模块功能,实现起来相当简单。它可以完全替代现有的CommonJS和AMD规范,成为浏览器和服务器的通用模块方案。ES6模块的设计思想是尽可能静态化,这样模块的依赖关系,以及输入输出变量都可以在编译时确定。CommonJS和AMD模块都只能在运行时确定这些东西。例如,CommonJS模块是对象,必须在输入时查找对象属性。主要特点:完全替代CJS和AMD,取消UMD,namespace等规范是静态的,编译时加载,让页面加载更快ES6模块运行机制不同于CommonJS,遇到模块加载命令import执行模块,但是而只是生成一个动态的只读引用。当你真正需要使用它时,去模块中获取值。import命令有一个改进的效果,因为它是在编译时加载的,所以它会在其他代码之前执行
