什么是 AMD,CommonJS 和 UMD? - 简书

标签: | 发表时间:2021-05-31 14:05 | 作者:
出处:https://www.jianshu.com

(本文译自 What Is AMD, CommonJS, and UMD?

介绍

多年来,可供选择的JavaScript组件的生态系统不断地稳步增加。有很多的选择固然是很好的一件事,但是各个组件混合搭配使用的时候会带来不少的问题,开发者不会花很多时间就会发现所有组件使用起来总有这样那样的问题。

为了解决这些问题,互为竞争对手的模块规范 AMD 和 CommonJS 出现了,它们可以让开发者在约定的沙箱以模块化的方式编写自己的代码,以免“污染生态系统”。

AMD

异步模块定义(英文简称AMD)已经引领了前端潮流,RequireJS已经是最流行的实现方式。

下面的例子是 foo模块简单地依赖 jquery

    //    filename: foo.js
define(['jquery'], function ($) {
    //    methods
    function myFunc(){};

    //    exposed public methods
    return myFunc;
});

下面的更复杂一点的例子就是多个依赖和多个暴露方法的用法。

    //    filename: foo.js
define(['jquery', 'underscore'], function ($, _) {
    //    methods
    function a(){};    //    private because it's not returned (see below)
    function b(){};    //    public because it's returned
    function c(){};    //    public because it's returned

    //    exposed public methods
    return {
        b: b,
        c: c
    }
});

定义的第一部分是依赖的数组,而第二部分基本上是仅在第一部分声明好才能执行的回调函数。(像 RequireJS 这种脚本加载器才会关心这部分,包括找出依赖文件的位置)

注意:定义中的依赖顺序很重要!(比如 jQuery---> $underscore---> _

还要注意的是,我们可以映射依赖到我们想要的变量上。如果我们将上面代码中的 $改为 $$,那我们下面代码的函数块中引用到 jQuery时都得用 $$代替 $

最重要的一点是:你绝对不能在上述代码外的函数中引用变量 $_,因为它对于外面来说就是一个不透明的沙箱。这就是那些规范想要达到的目标!

CommonJS

如果你用过 Node.js写过代码,那你会对 CommonJS感到熟悉(因为就是只有一些轻微的变动)。它已经变成使用 Browserify开发的前端开发者中的一种趋势。

用跟上面一样的格式,下面就是采用 CommonJS规范的 foo模块写法。

    //    filename: foo.js

//    dependencies
var $ = require('jquery');

//    methods
function myFunc(){};

//    exposed public method (single)
module.exports = myFunc;

下面是应用了多依赖和多个暴露方法的复杂例子:

    //    filename: foo.js
var $ = require('jquery');
var _ = require('underscore');

//    methods
function a(){};    //    private because it's omitted from module.exports (see below)
function b(){};    //    public because it's defined in module.exports
function c(){};    //    public because it's defined in module.exports

//    exposed public methods
module.exports = {
    b: b,
    c: c
};

UMD: 通用模块定义

虽然 CommonJSAMD的风格同样大受欢迎,但是看起来似乎它们并没有达成共识。这样的局面也导致了一种能同时支持两种风格的需要出现,这带给了我们通用模块定义。

下面这种模式诚然丑陋,但是能使 AMDCommonJS和谐相处,还支持老式的 global变量定义。

    (function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD
        define(['jquery'], factory);
    } else if (typeof exports === 'object') {
        // Node, CommonJS-like
        module.exports = factory(require('jquery'));
    } else {
        // Browser globals (root is window)
        root.returnExports = factory(root.jQuery);
    }
}(this, function ($) {
    //    methods
    function myFunc(){};

    //    exposed public method
    return myFunc;
}));

保持同样的模式实现更复杂的例子:

    (function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD
        define(['jquery', 'underscore'], factory);
    } else if (typeof exports === 'object') {
        // Node, CommonJS-like
            module.exports = factory(require('jquery'), require('underscore'));
    } else {
        // Browser globals (root is window)
        root.returnExports = factory(root.jQuery, root._);
    }
}(this, function ($, _) {
    //    methods
    function a(){};    //    private because it's not returned (see below)
    function b(){};    //    public because it's returned
    function c(){};    //    public because it's returned

    //    exposed public methods
    return {
        b: b,
        c: c
    }
}));

相关 [amd commonjs umd] 推荐:

什么是 AMD,CommonJS 和 UMD? - 简书

- -
多年来,可供选择的JavaScript组件的生态系统不断地稳步增加. 有很多的选择固然是很好的一件事,但是各个组件混合搭配使用的时候会带来不少的问题,开发者不会花很多时间就会发现所有组件使用起来总有这样那样的问题. 为了解决这些问题,互为竞争对手的模块规范 AMD 和 CommonJS 出现了,它们可以让开发者在约定的沙箱以模块化的方式编写自己的代码,以免“污染生态系统”.

AMD终于又有CEO了

- 九刀大魔王 - cnBeta.COM
Dirk Meyer年初被闪电辞退后,AMD CEO这一高职空缺了长达半年之后,期间虽与多位业界知名高管传出“绯闻”但都无疾而终. 今天,就在史蒂夫・乔布斯辞退苹果CEO而引发业界轩然大波之后,AMD官方宣布任命Rory P. Read为AMD总裁兼CEO,同时成为公司董事会成员,即日起生效.

AMD 代号 DESNA 的平板电脑 APU

- 麦克华斯基 - Engadget 中国版
我们看到 AMD 推出桌上型 A系列,笔记型 E 系列,以及嵌入式 G系列,那么有什么东西介于在这两个中间. 消息来源指出这个代号 DESNA 的 APU,AMD称之为 Z 系列, 支持 Flash、DirectX 11 以及 IE9 / HTML5,可以说是 C 系列的下一代,代表着 x86 阵营并没有放弃平板计算机的市场.

AMD:不会直接卖内存

- Sun - cnBeta.COM
数日前,部分市场上出现了赫然打着“AMD Radeon”标志的内存条产品,让人不禁联想:AMD是否正在挥军进入内存市场. 今天,AMD官方对此做出了回应,声称只是在进行可能性评估,不会直接制造、销售内存. AMD发言人Dave Erskine表示:“AMD并不制造内存,也不会直接向客户销售内存. AMD目前正在评估通过渠道合作伙伴销售AMD Radeon品牌内存是否是一个切实可行的机会,因此在部分地区似乎可以通过零售渠道购买.

联想COO跳槽担任AMD CEO

- 2楼水饺 - Solidot
芯片制造商AMD任命前联想公司COO Rory P.Read为公司主席、CEO和董事会成员. 自2011年1月起担任临时CEO的Thomas Seifert重回原职,继续担任首席财务官. Rory P.Read自2009年起担任联想公司主席和CEO,帮助联想成为世界上增长最快的PC制造商. 在加入联想之前,Read在IBM公司工作了23年.

Javascript模块化编程(二):AMD规范

- - 阮一峰的网络日志
这个系列的 第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. 先想一想,为什么模块很重要. 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块. 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套.

独家:MacBook Pro(ThunderBolt、Sandy Bridge、AMD 独显...)动手玩!

- Kevin - Engadget 中国版
另外 ThunderBolt 用的线材,一如先前的传言,已经改为铜线而非光纤,10 瓦的供电则是略大于 FW800 的 8 瓦;而从单一个 ThunderBolt 接口最多一次可以挂上六个支持的装置(透过一对多的转接器),而在 PCI Express 协议的加持下,未来也可以透过转接器接上 FireWire 以及 USB 产品.

AMD联合高校出书:《OpenCL异构计算》

- fid - cnBeta.COM
Fusion开发者峰会如火如荼地举行之际,AMD宣布与高等院校联合,即将面向开发人员出版一本新书:《OpenCL异构计算》(Heterogeneous Computing with OpenCL). 该书将由荷兰爱思唯尔出版集团(Elsevier)旗下的Morgan Kaufmann负责出版发行.

Many Core的应用场景的研究--Tilera Tilepro64,Intel Xeon,AMD Opteron

- imxiaobo - 弯曲评论
这是一篇来自Facebook的white paper. 作者的主要观点是:在以Key-Value为典型查询的SNS系统中,可以通过(即使是低频率的)基于众核(Many Core)芯片,可以达到,或者更好的与基于高端Intel,AMD芯片的平台达到同样或者更好的吞吐率,响应时间和功耗.

AMD 计划在下一代 APU 中使用 Coreboot

- ehoc - LinuxTOY
AMD 计划在下一代代号为 Llano 的 APU 的配套主板中使用 Coreboot 来取代古老的 BIOS. AMD 已经在自身的 Geode 嵌入式解决方案以及服务器领域中应用 Coreboot 一段时间了,这次将会是首次在消费电子产品中使用 Coreboot. Coreboot 是一个由 Free Software Foundation 负责的自由软件项目,目的是取代当下私有的系统 BIOS,同时精简现有32位和64位处理器平台上的启动过程,避免与操作系统做重复工作并缩小体积.