讲解arcgis中的amd知识前,首先介绍这两种Javascript模块规范:CommonJS和AMD。我主要介绍AMD,但是要先从CommonJS讲起。

CommonJS

2009年,美国程序员Ryan Dahl创造了node.js项目,将javascript语言用于服务器端编程。

这标志”Javascript模块化编程”正式诞生。因为老实说,在浏览器环境下,没有模块也不是特别大的问题,毕竟网页程序的复杂性有限;但是在服务器端,一定要有模块,与操作系统和其他应用程序互动,否则根本没法编程。

Node.js的模块系统,就是参照CommonJS规范实现的。在CommonJS中,有一个全局性方法require(),用于加载模块。假定有一个数学模块math.js,就可以像下面这样加载。

  1. var math = require('math');

然后,就可以调用模块提供的方法:

  1. var math = require('math');
  2. math.add(2,3); // 5

因为这个系列主要针对浏览器编程,不涉及node.js,所以对CommonJS就不多做介绍了。我们在这里只要知道,require()用于加载模块就行了。

浏览器环境

有了服务器端模块以后,很自然地,大家就想要客户端模块。而且最好两者能够兼容,一个模块不用修改,在服务器和浏览器都可以运行。

但是,由于一个重大的局限,使得CommonJS规范不适用于浏览器环境。还是上一节的代码,如果在浏览器中运行,会有一个很大的问题,你能看出来吗?

  1. var math = require('math');
  2. math.add(2, 3);

第二行Math.add(2, 3),在第一行require(‘math’)之后运行,因此必须等math.js加载完成。也就是说,如果加载时间很长,整个应用就会停在那里等。

这对服务器端不是一个问题,因为所有的模块都存放在本地硬盘,可以同步加载完成,等待时间就是硬盘的读取时间。但是,对于浏览器,这却是一个大问题,因为模块都放在服务器端,等待时间取决于网速的快慢,可能要等很长时间,浏览器处于”假死”状态。

因此,浏览器端的模块,不能采用”同步加载”(synchronous),只能采用”异步加载”(asynchronous)。这就是AMD规范诞生的背景。

AMD模块编程是怎么回事呢?

AMD是”Asynchronous Module Definition”的缩写,意思就是”异步模块定义”。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。

AMD也采用require()语句加载模块,但是不同于CommonJS,它要求两个参数:

  1. require([module], callback);

第一个参数[module],是一个数组,里面的成员就是要加载的模块;第二个参数callback,则是加载成功之后的回调函数。如果将前面的代码改写成AMD形式,就是下面这样:

  1. require(['math'], function (math) {
  2. math.add(2, 3);
  3. });

math.add()与math模块加载不是同步的,浏览器不会发生假死。所以很显然,AMD比较适合浏览器环境。

目前,主要有两个Javascript库实现了AMD规范:require.js和curl.js。

讲完后大家应该对AMD的出现有了基本的认识,那么接下来最重要的是我们如何使用它,它会不会与jquery等其他的javascript库冲突呢?答案必须是否定的,不然我们用起dojo来不是要累死了么==

用jquery的初始化函数或者javascript原生的代码都可以的,可以在它里面嵌套符合AMD规范的代码,也可以在符合AMD规范的代码里面嵌套普通javascript语句。举个例子撒:

function map(){var map;require(["esri/geometry/Extent","esri/map","esri/InfoTemplate","esri/layers/FeatureLayer","esri/renderers/SimpleRenderer","esri/symbols/SimpleFillSymbol","esri/symbols/SimpleLineSymbol","dojo/dom","dojo/number","dojo/on","dojo/parser","esri/Color","esri/layers/ArcGISTiledMapServiceLayer","esri/symbols/SimpleMarkerSymbol","esri/tasks/query","esri/geometry/Circle","esri/graphic","esri/geometry/geometryEngine","esri/geometry/Point","esri/dijit/InfoWindow","esri/dijit/FeatureTable","esri/layers/GraphicsLayer","esri/dijit/OverviewMap","dijit/layout/BorderContainer","dijit/layout/ContentPane","dojox/layout/ExpandoPane","dojo/domReady!"],function (Extent, Map, InfoTemplate, FeatureLayer, SimpleRenderer, SimpleFillSymbol,SimpleLineSymbol, dom, number, on, parser, Color, ArcGISTiledMapServiceLayer,SimpleMarkerSymbol, Query, Circle, Graphic, geometryEngine, Point, InfoWindow, FeatureTable, GraphicsLayer,OverviewMap ) {var ip="192.168.70.133";var bounds = new Extent({"xmin": 457075,"ymin": 4314838,"xmax": 457384,"ymax": 4315085,"spatialReference": {"wkid": 3857}});var map = new Map("map", {extent: bounds});var tileURL = "http://"+ip+":6080/arcgis/rest/services/JGSfolder/JGS/MapServer";var tiled = new ArcGISTiledMapServiceLayer(tileURL);map.addLayer(tiled);$("#jz_name").click(function () {selectByID("140922001001A1");});});}

里面符合AMD规范的代码放在了一个普通函数里面,而它里面的代码也用了jquery的标志性符号$,很灵活的,只不过就是它里面只能用require里面已有的依赖对象,这样把文件功能分开了,但是在代码外要使用require中的对象模型不方便。

下面介绍自定义加载模型使用方法,敬请期待==

在ArcGIS javascript中使用了dojo框架,dojo中使用了AMD的模式,具体使用可以参考下面文章

1、AMD中class使用

2、AMD中class内部成员相互调用实现

Arcgis Javascript那些事儿(七)--AMD详解相关推荐

  1. DD每周前端七题详解-第五期

    DD每周前端七题详解-第五期 系列介绍 你盼世界,我盼望你无bug.Hello 大家好!我是霖呆呆! 呆呆每周都会分享七道前端题给大家,系列名称就是「DD每周七题」. 系列的形式主要是:3道JavaS ...

  2. JavaScript字符串对象的方法详解

    JavaScript字符串对象的方法详解 前面的博客我们说到了字符串对象的创建,属性及字符串的拼接.现在来详细讲一下字符串的方法. 1.ES6之前的方法 // js字符串的方法var str=&quo ...

  3. JavaScript 身份证号有效验证详解及实例代码

    这篇文章主要介绍了JavaScript 身份证号有效验证详解及实例代码的相关资料,需要的朋友可以参考下 JavaScript验证身份证号 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...

  4. JavaScript数据结构与算法——链表详解(下)

    在JavaScript数据结构与算法--链表详解(上)中,我们探讨了一下链表的定义.实现原理以及单链表的实现.接下来我们进一步了解一下链表的其他内容. 1.双向链表 双向链表实现原理图: 与单向链表不 ...

  5. JavaScript数据结构与算法——链表详解(上)

    注:与之前JavaScript数据结构与算法系列博客不同的是,从这篇开始,此系列博客采用es6语法编写,这样在学数据结构的同时还能对ECMAScript6有进一步的认识,如需先了解es6语法请浏览ht ...

  6. JavaScript数据结构与算法——队列详解(下)

    接下来会借助本人另一篇文章JavaScript数据结构与算法--队列详解(上)中实现的队列类及其方法实现一个应用. 配对问题 需求分析:在一个文件中保存着一份男女混合的数据,名称前以B开头表示男士,以 ...

  7. JavaScript数据结构与算法——列表详解(下),基于Nodejs实现一个列表应用

    1.上篇回顾: 上篇我们实现了一个列表类,并添加了一些属性,实现了比较多的方法,本文章将与大家一起使用列表实现一个图书借阅查询系统.需要使用JavaScript数据结构与算法--列表详解(上)中写好的 ...

  8. JavaScript数据结构与算法——列表详解(上)

    列表是一组有序的数据,每个数组中的数据项称为元素.数组相关知识不够了解的伙伴可以阅读本人上篇博客在JavaScript中,列表的元素可以是任意数据类型.列表中可以保存不定数量的元素,实际使用时元素的数 ...

  9. JavaScript数据结构与算法——数组详解(下)

    1.二维与多维数组 JavaScript只支持一维数组,但是通过在数组里保存数组元素的方式,可以轻松创建多维数组. 1.1 创建二维数组 二维数组类似一种由行和列构成的数组表格,在JavaScript ...

  10. javascript教程:console.log 详解

    对应WEB程序员,console.log 可以说是神器,极大地方便了程序开发.程序猿:学习了,用Console写日志比alert方便多了. console.log(object[, object, . ...

最新文章

  1. Python 包安装和 postgresql 的一些问题
  2. 编程软件python怎样开始学-编程零基础应当如何开始学习 Python?
  3. Json入门及基本应用
  4. 数据分析精华经验分享,看看冠军是如何炼成的?
  5. Qt 事件处理机制-qt源码解读
  6. PHP判断浏览器类型和浏览器语言(附各国语言简写代码)
  7. linux下的hosts文件
  8. 苹果6显示连接id服务器出错,appleid:appleid连接失败该如何解决
  9. win10不能访问服务器共享文件夹权限,win10没有权限访问共享文件夹(有效解决共享文件夹权限问题)...
  10. jupyter notebook环境配置
  11. 沈阳农业大学计算机专业排名,沈阳农业大学王牌专业排名
  12. Variational Inference入门:variational bayesian EM
  13. 2021 ICPC 昆明(22-4-17) C L E | 第46届ICPC亚洲区域赛(昆明)
  14. Chainlink官方文档翻译(二) 中间件-随机数 Intermediates - Random Numbers)
  15. php中预定义常量的,php预定义常量_PHP教程
  16. [心电图] 贺银成视频笔记
  17. 嵌入式开发教程哪家好?云计算培训如何学?
  18. ib中文文学课如何学习重点?
  19. Java面向对象 继承,super,方法重写
  20. Outlook中将发送邮件自动CC给自己

热门文章

  1. php网上商城拟解决的问题是,上次说的软件商城BUG,已找到问题,并解决~
  2. android日历便签,安卓手机上有日历与便签结合的app吗?
  3. 智慧城市特效(建筑颜色渐变、飞线、扫光、扫描、光墙、线路、水、道路线条、锥形标、漫游)three+shader
  4. 怎么成为日上会员直邮_放福利啦,免税店现在一件也能直邮,不用出入境、不用出入境、不用找代购...
  5. C# static变量、const变量、readonly变量
  6. [Usaco2008 Mar]River Crossing渡河问题
  7. Thymeleaf 的使用
  8. Android基础 写给新手的Android环境配置
  9. unity中的rigibody 和 collider 讲解
  10. 中间件配置文件-nginx