zoukankan      html  css  js  c++  java
  • AMD:异步模块定义

    AMD:浏览器中的模块规范

    前面提到,为实现与Node.js相同方式的模块写法,大牛们做了很多努力。

     

    但浏览器环境不同于服务器端,它的模块有一个HTTP请求过程(而Node.js的模块文件就在本地),这个请求过程多数使用script tag,script 默认的异步性导致很难实现与Node.js一模一样的模块格式。

     

    Modules/Wrappings 使得实现变为现实。虽然和Node.js的模块写法不完全一致,但也有很多相似之处,使得熟悉Node.js的程序员有一些亲切感。

     

    但Node.js终究是服务器端的JavaScript,没有必要把这些条条框框放到浏览器JavaScript环境中。

     

    这时AMD 诞生了,它的全称为异步模块定义。从名称上看便知它是适合script tag的。也可以说AMD是专门为浏览器中JavaScript环境设计的规范。它吸取了CommonJS的一些优点,但又不照搬它的格式。开始AMD作为CommonJS的transport format 存在,因无法与CommonJS开发者达成一致而独立出来。它有自己的wiki 和讨论组 。

     

    AMD设计出一个简洁的写模块API:

    define(id?, dependencies?, factory);

     

    其中:

    • id: 模块标识,可以省略。
    • dependencies: 所依赖的模块,可以省略。
    • factory: 模块的实现,或者一个JavaScript对象。
    id遵循CommonJS Module Identifiers 。dependencies元素的顺序和factory参数一一对应。
     
    以下是使用AMD模式开发的简单三层结构(基础库/UI层/应用层):
     
    base.js
    1
    2
    3
    4
    5
    6
    define(function() {
        return {
            mix: function(source, target) {
            }
        };
    });

     

    ui.js

    1
    2
    3
    4
    5
    6
    7
    define(['base'], function(base) {
        return {
            show: function() {
                // todo with module base
            }
        }
    });

     

    page.js

    1
    2
    3
    define(['data', 'ui'], function(data, ui) {
        // init here
    });

     

    data.js

    1
    2
    3
    4
    define({
        users: [],
        members: []
    });

     

    以上同时演示了define的三种用法,
    1,定义无依赖的模块(base.js)
    2,定义有依赖的模块(ui.js,page.js)
    3,定义数据对象模块(data.js)
     
     
    细心的会发现,还有一种没有出现,即具名模块
     
    4,具名模块
    1
    2
    3
    define('index', ['data','base'], function(data, base) {
        // todo
    });

     

    具名模块多数时候是不推荐的,一般由打包工具合并多个模块到一个js文件中时使用。
     
    前面提到dependencies元素的顺序和factory一一对应,其实不太严谨。AMD开始为摆脱CommonJS的束缚,开创性的提出了自己的模块风格。但后来又做了妥协,兼容了 CommonJS Modules/Wrappings 。即又可以这样写
     
    5,包装模块
    1
    2
    3
    4
    5
    6
    define(function(require, exports, module) {
        var base = require('base');
        exports.show = function() {
            // todo with module base
        }
    });

     

    不考虑多了一层函数外,格式和Node.js是一样的。使用require获取依赖模块,使用exports导出API。
     
    除了define外,AMD还保留一个关键字require。require 作为规范保留的全局标识符,可以实现为 module loader。也可以不实现。
     
    目前,实现AMD的库有RequireJS 、curl 、Dojo 、bdLoadJSLocalnet 、Nodules 等。
    也有很多库支持AMD规范,即将自己作为一个模块存在,如MooTools 、jQuery 、qwery 、bonzo  甚至还有 firebug 。
     
     
  • 相关阅读:
    【LSA推荐算法】简单理解
    【数据分析案例】用户消费行为
    【Django】rest_framework 序列化自定义替换返回值
    【Django+Element UI】使用一个接口文件,搞定分页获取数据,模糊查询后分页获取数据
    【Django后端分离】使用element-ui文件上传
    JavaScript数组去重方法总结
    MySQL索引优化--对前缀索引使用like模糊匹配时的实际索引选择
    Linux命令--top
    Linux命令--free
    MySQL中的表的列设置为varchar(0)或char(0)
  • 原文地址:https://www.cnblogs.com/mrxia/p/3594519.html
Copyright © 2011-2022 走看看