一、AMD规范探索

1、AMD规范(即异步模块加载机制)

我们在接触js的时候,一般都是通过各种function来定义一些方法,让它们帮我们做一些事情,一个js可以包含很多个js,而这些function都是单独存在。

在开发的时候我们会将几个function组合成一个功能,我们称这个功能的几个function为一个模块。

1.1、模块化JS

现在AMD规范定义了这种模块对象,我们称之为直接对象,用于封装这个模块种所有变量和方法。

举个例子:

<span style="font-size:18px;">var model1=(function() {
var oldtext = {};
var _setText = function(id, text) {
var node = document.getElementById(id);
oldtext[id] = node.innerHTML;
node.innerHTML = text;
};
var _restoreText = function(id) {
document.getElementById(id).innerHTML = oldtext[id];
}; return {
setText: _setText,
restore: _restoreText
}
});</span>

这里我们定义了一个JS的直接对象,这个对象里面封装了一个数组变量和两个方法,return用于对外提供调用入口,现在我们可以直接通过model1().setText(id,text)或者model1().restore(id)的方式调用该对象里提供的方法。

当然现在我们可以按照AMD规范来这样写:

<span style="font-size:18px;">define (function() {
var oldtext = {};
var _setText = function(id, text) {
var node = document.getElementById(id);
oldtext[id] = node.innerHTML;
node.innerHTML = text;
};
var _restoreText = function(id) {
document.getElementById(id).innerHTML = oldtext[id];
}; return {
setText: _setText,
restore: _restoreText
}
});</span>

没错,只把直接变量基础上把接收变量改为define就是一个符合AMD规范的异步模块了。

1.2、AMD规范简单到只有一个API(使用AMD)

define函数:

<span style="font-size:18px;">define([module-name?], [array-of-dependencies?], [module-factory-or-object]);</span>

module-name: 模块标识,可以省略。

array-of-dependencies: 所依赖的模块,可以省略。

module-factory-or-object: 模块的实现,或者一个JavaScript对象。

1.3、所以在Dojo中这样写就是定义了一个模块

define([
'dojo/dom'
], function(dom) {
var oldText = {};
return {
setText: function(id, text) {
var node = dom.byId(id);
oldText[id] = node.innerHTML;
node.innerHTML = text;
}, restoreText: function(id) {
var node = dom.byId(id);
node.innerHTML = oldText[id];
delete oldText[id];
}
};
});

既然我们定义了一个模块,自然要使用这个模块,如何使用?异步加载机制!

1.4、异步加载JS

有许多js库都是支持异步加载js的,比如比较流行的requrieJS,当然他们的用法都是一致的。

1.4.1、当然了,在实现异步加载自定义的JS模块我们还需要明确这个模块所在的目录:

<span style="font-size:18px;">var dojoConfig = {
async: true,
packages: [{name: "js",location: location.pathname.replace(/\/[^/]*$/, '') + '/js'
}]
};</span>

1.4.2、完成了设置,我们就可以异步调用JS(不需要在页面中通过script标签加载JS):

<span style="font-size:18px;">require(["js/public/swapText"], function(swapText) {
swapText.setText(index, msg);
});</span>

后面会继续探讨dojo框架技术。。。。

Dojo初探之1:AMD规范,编写符合AMD规范(异步模块加载机制)的模块化JS(其中dojo采用1.11.2版本)的更多相关文章

  1. 对于模块加载:ES6、CommonJS、AMD、CMD的区别

    运行和编译的概念 编译包括编译和链接两步. 编译,把源代码翻译成机器能识别的代码或者某个中间状态的语言. 比如java只有JVM识别的字节码,C#中只有CLR能识别的MSIL.还简单的作一些比如检查有 ...

  2. Javascript模块化编程之CommonJS,AMD,CMD,UMD模块加载规范详解

    JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发?     模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问 题进行系 ...

  3. js与AMD模块加载

    目的: 了解AMD规范与CMD规范,写一个模块加载器雏形. 基本概念: AMD是异步模块定义规范,而CMD是通用模块定义规范.其他的还有CommonJS Modules规范. 对于具体的规范,可以参考 ...

  4. 构建服务端的AMD/CMD模块加载器

    本文原文地址:http://trock.lofter.com/post/117023_1208040 . 引言:  在前端开发领域,相信大家对AMD/CMD规范一定不会陌生,尤其对requireJS. ...

  5. JavaScript AMD 模块加载器原理与实现

    关于前端模块化,玉伯在其博文 前端模块化开发的价值 中有论述,有兴趣的同学可以去阅读一下. 1. 模块加载器 模块加载器目前比较流行的有 Requirejs 和 Seajs.前者遵循 AMD规范,后者 ...

  6. js模块加载之AMD和CMD

    当我写这篇文章的时候,sea.js已经逐渐退出历史的舞台,详细链接.不过任何新事物的出现都是对旧事物的取其精华,去其糟粕,所以了解一下以前模块的加载也是一件好事. js模块化的原因自不比多说,看看HU ...

  7. WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探

    原文:WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探         最近因为项目需要,开始学习如何使用WPF开发桌面程序.使用WPF一段时间之后,感 ...

  8. 彻底搞清楚javascript中的require、import和export(js模块加载规范的前世今生)

    为什么有模块概念 理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. 但是,Javascript不是一种模块化编程语言,在es6以前,它是不支持”类”(class),所以也 ...

  9. [转]NHibernate之旅(13):初探立即加载机制

    本节内容 引入 立即加载 实例分析 1.一对多关系实例 2.多对多关系实例 结语 引入 通过上一篇的介绍,我们知道了NHibernate中默认的加载机制——延迟加载.其本质就是使用GoF23中代理模式 ...

随机推荐

  1. js解决苹果移动端300ms延迟的问题

    做移动端页面开发的可能会了解到,ios系统click事件会有卡顿的现象,这个问题的根源是苹果本身自带的safari有双击放大页面的功能,再次双击会返回到原始尺寸,所以在第一次点击的系统会延迟300ms ...

  2. 以防忘记,建立stm32工程的过程

    然后会弹出manage run -time environment的运行环境界面,必须选择的有CMSIS下的core和device下的startup,至于其它的根据你需要的外设, 在stdperiph ...

  3. 2017-4-24 WinForm开发基础、窗体的属性CenterScreen

    WinForm中文名称: Windows窗体,是·Net开发平台中对Windows Form的一种称谓. 客户端应用程序:C/S 客户端很重要的特点:可以操作用户电脑上的文件 窗体属性:窗体种类: + ...

  4. 集合框架Map、List、Set

    map分为:HashMap,TreeMap,LinkedHashMap,WeakHashMap和IdentityHashMap. 在实际开发的过程中,最常用的是HashMap,下面介绍一下最常见的用法 ...

  5. APP品牌具体有哪几个要素?又是如何操作的?

    对于品牌的一些认识 首先我们要知道,品牌是由用户与公司及其产品&服务互动后所产生的,失去了与用户互动并且承认的是伪品牌,对于开发者来说,APP的品牌要先从标志与颜色考虑起,但实话实说,标志与颜 ...

  6. 在Debian 8 上安装自动化工具Ansible

    如果你是新手,就不要犹豫了,ansible是你最好的选择,本人菜鸟一个.废话少说,开始安装! 实验环境: 192.168.3.190 192.168.3.191 192.168.3.192 192.1 ...

  7. 一个想法照进现实-《IT连》创业项目:创业时该不该用新手程序员

    前言: 距离上一篇文章,转眼已然一个多月了,这段时间没出来和大伙汇报创业的进度,怪我了. 最近又感冒了,已经一个多星期了,还在感冒中,不过感冒也不能偷懒了,每天都有大把的事情等着我解决~~~ 不过今天 ...

  8. Play学习 - 体验网页模板

    在经过无数个尝试后,最终用sbt把play所依赖的所有包都下载下来了,现在可以非常快速编译运行了.今天体验了下网页模板,觉得非常不错,在这里做个简单的介绍. 原文说明: A Play Scala te ...

  9. Bootstrap之折叠(Collapse)插件

    学习资料:Bootstrap折叠(Collapse)插件 大家可能常见的都是类似: 这种的效果,小颖今天要给大家分享一个不一样的效果嘻嘻.铛铛铛铛........................... ...

  10. IOS对话框UIAlertView

    //修改弹出对话框的样式 alertView.alertViewStyle = UIAlertViewStylePlainTextInput; //根据索引获取指定的某个文本框 [alertView ...