JavaScript模块化
梳理JavaScript模块化的历史和现状
不同的逻辑代码放在单独的js文件,但是当项目更复杂的时候,html中可以引入很多个js文件,此时会出现命名冲突,污染作用于等一系列问题,此时模块的概念以及实现方法就出现了
传统JavaScript
JavaScript初创时期,本身是在浏览器的脚本语言,在浏览器中使用,需要使用script标签引入即可,依赖关系的解决,需要手动保证引入的顺序问题
JS
<script src="/appConfig.js"></script>
<script src="/packages-cdn/thirdParty/jquery.min.js"></script>
<script src="/packages-cdn/thirdParty/Cesium1.7.1/Cesium.js"></script>
Node.js 模块方案-CommonJS
Node.js是浏览器之外的一个运行环境,其创建之初,为了弥补JavaScript确实模块的问题,带来了commonjs规范。 在Node.js中模块是强制的,外面的define在Nodejs中是自动添加的,不需要手动编写。
JS
define(function (require, exports, module) {
//使用event 模块
var ec = require("event");
});
JS
// 定义Util模块
const H = 888;
function add(a,b){
return a + b;
}
module.exports = {
H,add
}
// 加载模块
const util = require("./util")
console.log(util.add(1+1));
浏览器模块方案-AMD
(Asynchronous Module Definition) 异步定义模块
在浏览器视角引入模块系统是,发现commonjs并不适合浏览器,在Node.js中引入一个模块是通过fs文件系统,属于同步操作,但在浏览器中,所有的文件都需要网络去进行加载,那肯定是异步的状态。 异步加载规范:AMD,(使用AMD需要加载,其中RequireJS是最广泛的AMD模块加载器),很多JS库都引入AMD的引入方式。
JS
define(id?, dependencies?, cb);
// id:定义的模块名
// dependencies:定义模块中所有依赖的模块数组
// cb:是模块初始化要执行的函数或对象,必选
JS
define(['moment'],function () {
moment.getTime() //调用模块
});
UMD
UMD 是 (Universal Module Definition) 通用模块定义 的缩写。UMD 是 AMD 和 CommonJS 的一个糅合。AMD 是浏览器优先,异步加载;CommonJS 是服务器优先,同步加载。
通用使用的逻辑判断:判断是否支持node的模块,支持就用node;再判断是否支持AMD,支持则使用AMD。
JS
(function (window, factory) {
if (typeof exports === "object") {
// CommonJS
module.exports = factory();
} else if (typeof define === "function" && define.amd) {
// AMD
define(factory);
} else {
// 浏览器全局定义
window.eventUtil = factory();
}
})(this, function () {
// do something
});
ES6模块化
ES6中,使用export关键字导出模块,使用import关键字引入模块
JS
// 导入指定模块
import { total,sum,count } from "./utils"
// 导入全部模块
import utils from "./utils"
JS
function total(){
...
}
function sum(){
...
}
function count(){
...
}
export default { total,sum,count }
缺点:原生浏览器还没有实现该标准,需要使用babel将es6代码转为es5