Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

有 Promise 的话,还要 AMD 干嘛?

  AMD 的实现中除了 fetch 的部分外,很大一部分都是在描述一个类 Promise 的概念。由于当时并没有规范的 Promise,导致很多东西的实现变得奇奇怪怪的。我们换一种说法就更明白了。AMD 强调的是「异步」的模块定义,而如今「异步」完全是 Promise 解决的问题。
  假如我们就用全局的命名空间,那么只要每个模块都往全局定义 Promsie 对象,里面放一个异步的模块初始化。这便是一个简易的模块化系统。
  AMD 引以为傲的是对模块之间依赖关系的处理吧?如果一个模块定义的过程中依赖了别的模块,那么我们只要在所依赖的模块的 then 执行时再初始化这个模块即可。比如现在有一个 class A 和一个继承于 A 的 class B,如果是 AMD 的话大概是这样:
// a.js define('A', () => { return class {}; }); // b.js define('B', ['A'], (A) => { return class extends A {}; });   因为 extends 是一个同步操作,所以必须在 A 初始化后才可以初始化 B。这种场景使用 Promise 同样很容易解决,比如:
// a.js const $A = Promise.resolve(class {}); // b.js const $B = $A.then(A => { return class extends A {}; });   而且即使是一对多的依赖 Promise 也同样可以使用 Promise.all 来解决。甚至我们可以在定义模块的 Promise 包中动态地向服务器请求资源,把 AMD 的 fetch 那部分活儿也抢了。
  AMD 这个概念虽然不错,但它确实太古老了,而且浏览器并没有自带是实现,引入一个 requirejs 之类的东西我觉得非常划不来。如果大家可以接受直接使用全局命名空间的话(也可以自己造一个命名空间),我觉得直接使用 Promsie 就可以解决所有模块依赖问题了。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^