AMD(Asynchronous Module Definition) 即异步模块定义,是一个在浏览器端模块化开发的规范。
规范
模块定义
语法:define([依赖模块名...], 回调函数);
举例:module1.js
define(function () { //暴露一个对象 return { msg: 'module1', show: function () { console.log(this.msg); } };});
举例:module2.js
/** * 模块2,define声明依赖模块1 * 模块1作为形参传入回调 */define(["module1"], function (module1) { let msg = 'module2'; function show() { console.log(msg + "依赖" + module1.msg); module1.show(); } //暴露一个方法 return {show};});
举例:module3.js
/** * 模块3,define声明依赖第三方库 */define(["jquery"], function ($) { $('body').css('background', 'pink'); let msg = 'module3'; function show() { console.log(msg); } return {show};});
引入模块
语法:require([依赖模块...], 回调函数);
实现
require.js
require.js(官网:https://requirejs.org/)是AMD规范的一个库。
定义模块
见前面module1,module2,module3的定义。
引入模块
main.js
requirejs.config({ baseUrl: 'js/lib', //相对项目根目录的路径 //定义模块名和文件的对应关系,省略末尾.js paths: { jquery: 'jquery.min-3.4.1', angular: 'angular.min', module1: 'module1', module2: 'module2', module3: 'module3' }, //angular是非AMD规范的模块,需要shim中配置模块的exports shim: { 'angular': { exports: 'angular' } }});//导入模块2、模块3,模块1也被加载require(["module2", "module3", "angular"], function (module2, module3, angular) { module2.show(); module3.show(); console.log(angular);});
目录结构
总结
- 优点:适合在浏览器环境中异步加载模块。可以并行加载多个模块
- 缺点:提高了开发成本,并且不能按需加载,而是必须提前加载所有的依赖。