扫码关注官方订阅号
AMD与CMD根本性的区别到底是怎么样的,一直都不能很好的理解,看了很多文章都是千篇一律,AMD 是提前执行,CMD 是延迟执行具体怎么理解呢?
业精于勤,荒于嬉;行成于思,毁于随。
我自己的理解。
它们解决的问题都是当一个脚本文件被加载时,分析其依赖项并且载入和执行这些依赖。
然而,脚本加载器对它们的实际载入和执行采用了不同的方式。
当定义如
define("path/library-name", [ "require", "jquery", "./relative-path/library", "absolute-path/library" ], function f(require, $, lib, anotherLib) { // do something // and return the module itself. });
的一个脚本文件被加载时, AMD 的 define 函数被执行。它会用一些预定义的规则解析依赖路径,并且把未载入也未进入等待列表的依赖放入等待列表,并加载这些依赖所对应的文件。
define
当所有依赖被加载和执行完成后,执行传入的回调函数 (在此被记为 f) 才被执行,而此时加载器提供的回调函数把返回值填充于一个内部的哈希表里,以这里指定的模块名称 path/library-name, 或者隐式的使用当前加载的文件名作为模块名称为键。
f
path/library-name
所以相对我们定义模块的函数 f, AMD 加载器是提前执行所有依赖。
与 AMD 不同的是, CMD 加载器在依赖分析阶段通过字符串分析函数内形如 require("stringLiteral") 的正则匹配来获取所有依赖项。
require("stringLiteral")
然后怎么执行的我不是很清楚,然而万能的知乎有答案:
通过回调函数的Function.toString函数,使用正则表达式来捕捉内部的require字段,找到require('jquery')内部依赖的模块jquery 根据配置文件,找到jquery的js文件的实际路径 在dom中插入script标签,载入模块指定的js,绑定加载完成的事件,使得加载完成后将js文件绑定到require模块指定的id(这里就是jquery这个字符串)上 回调函数内部依赖的js全部加载(暂不调用)完后,调用回调函数 当回调函数调用require('jquery'),即执行绑定在'jquery'这个id上的js文件,即刻执行,并将返回值传给var b
通过回调函数的Function.toString函数,使用正则表达式来捕捉内部的require字段,找到require('jquery')内部依赖的模块jquery
根据配置文件,找到jquery的js文件的实际路径
在dom中插入script标签,载入模块指定的js,绑定加载完成的事件,使得加载完成后将js文件绑定到require模块指定的id(这里就是jquery这个字符串)上
回调函数内部依赖的js全部加载(暂不调用)完后,调用回调函数
当回调函数调用require('jquery'),即执行绑定在'jquery'这个id上的js文件,即刻执行,并将返回值传给var b
—https://www.zhihu.com/questio...
其中最后一条表明,相对我们定义模块的函数之执行来说, CMD/SeaJS 是延迟执行依赖的。
See also https://www.douban.com/note/2... for more details.
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
我自己的理解。
它们解决的问题都是当一个脚本文件被加载时,分析其依赖项并且载入和执行这些依赖。
然而,脚本加载器对它们的实际载入和执行采用了不同的方式。
AMD 加载器
当定义如
的一个脚本文件被加载时, AMD 的
define函数被执行。它会用一些预定义的规则解析依赖路径,并且把未载入也未进入等待列表的依赖放入等待列表,并加载这些依赖所对应的文件。当所有依赖被加载和执行完成后,执行传入的回调函数 (在此被记为
f) 才被执行,而此时加载器提供的回调函数把返回值填充于一个内部的哈希表里,以这里指定的模块名称path/library-name, 或者隐式的使用当前加载的文件名作为模块名称为键。所以相对我们定义模块的函数
f, AMD 加载器是提前执行所有依赖。CMD 加载器
与 AMD 不同的是, CMD 加载器在依赖分析阶段通过字符串分析函数内形如
require("stringLiteral")的正则匹配来获取所有依赖项。然后怎么执行的我不是很清楚,然而万能的知乎有答案:
—https://www.zhihu.com/questio...
其中最后一条表明,相对我们定义模块的函数之执行来说, CMD/SeaJS 是延迟执行依赖的。
See also https://www.douban.com/note/2... for more details.