模块

什么是 Tree Shaking

删除无用代码的算法,集成在 webpack 和 rollup 等打包工具中

CommonJS

AMD

ESM

CommonJS,ESM 区别

UMD

((root, factory) => {
  if (typeof define === 'function' && define.amd) {
    // AMD
    define(['jquery'], factory);
  } else if (typeof exports === 'object') {
    // CommonJS
    var $ = requie('jquery');
    module.exports = factory($);
  } else {
    // 没有模块环境,直接挂载在全局对象上
    root.testModule = factory(root.jQuery);
  }
})(this, ($) => {
  return {
    name: '我是一个umd模块',
  };
});
/*
  定义一个 IIFE,
  在定义模块的时候检测当前使用环境和模块的定义方式,
  将各种模块化定义方式转化为同样一种写法,
	先判断当前环境如果支持 AMD,则使用 require.js 提供的 define 函数定义模块,
	再判断是否 cjs,如果是则使用 cjs 相应的模块定义方法进行模块定义,
  如果还需要兼容其他类型的模块系统也是类似思路去兼容,

  最后如果没有模块环境,直接挂载在全局对象上,这个传进来的全局对象 this,其值可能是 window 或者 global,视运行环境而定
*/