CodingMeUp / AboutFE

知识归纳、内容都在issue里
74 stars 14 forks source link

50、模块化发展历程、IIFE、AMD、CMD、CommonJS、UMD、ES Modules #51

Open CodingMeUp opened 4 years ago

CodingMeUp commented 4 years ago

模块化主要是用来抽离公共代码,隔离作用域,避免变量冲突等。

IIFE: 使用自执行函数来编写模块化,特点:在一个单独的函数作用域中执行代码,避免变量冲突

  (function(){
    return {
    data:[]
    }
  })()

AMD: 使用requireJS 来编写模块化,特点:依赖必须提前声明好

  define('./index.js',function(code){
    // code 就是index.js 返回的内容
  })

CMD: 使用seaJS 来编写模块化,特点:支持动态引入依赖文件

  define(function(require, exports, module) {  
    var indexCode = require('./index.js');
  });

CommonJS: nodejs 中自带的模块化。

  var fs = require('fs');

UMD:兼容AMD,CommonJS 模块化语法。

webpack(require.ensure):webpack 2.x 版本中的代码分割。

ES Modules: ES6 引入的模块化,支持import 来引入另一个 js 。

  import a from 'a';

ES Modules与common.js区别

  1. 输出值
    • es6输出的是一个值的引用( ES6 模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块。)
    • common 输出的是一个值的拷贝(模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。)
  2. 加载方式
    • common 运行时加载 (因为 CommonJS 加载的是一个对象(即module.exports属性),该对象只有在脚本运行完才会生成)
    • es6 编译时输出接口 (ES6 模块不是对象,它的对外接口只是一种静态定义,在代码静态解析阶段就会生成。)

AMD,CMD用的不多,主要讲一下CommonJS和ESModule

模块的特性

CommonJS

特点: requiremodule.exportsexports CommonJS 一般用在服务端或者Node用来同步加载模块,它对于模块的依赖发生在代码运行阶段,不适合在浏览器端做异步加载。 exports实际上是一个对module.exports的引用:

    exports.add = function add () {/* 方法 */}
    // 等同于
    module.exports.add = function add () {/* 方法 */}

但注意,不能给exports赋值,否则会断开与module.exports的连接。

ES6 Module

特点: importexport ES6模块化不是对象,import会在JavaScript引擎静态分析,在编译时就引入模块代码,而并非在代码运行时加载,因此也不适合异步加载。 在HTML中如果要引入模块需要使用

    <script type="module" src="./module.js"></script>

ESModule的优势:

二者的差异

CommonJS模块引用后是一个值的拷贝,而ESModule引用后是一个值的动态映射,并且这个映射是只读的。

CommonJS运行时加载,ESModule编译阶段引用。

Originally posted by @Reaper622 in https://github.com/Advanced-Frontend/Daily-Interview-Question/issues/28#issuecomment-562807639

CodingMeUp commented 3 years ago

https://www.yuque.com/docs/share/9f219af8-12a5-4441-978f-201ef03987ab?