Arcgis Javascript那些事儿(七)--AMD详解
讲解arcgis中的amd知识前,首先介绍这两种Javascript模块规范:CommonJS和AMD。我主要介绍AMD,但是要先从CommonJS讲起。
CommonJS
2009年,美国程序员Ryan Dahl创造了node.js项目,将javascript语言用于服务器端编程。
这标志”Javascript模块化编程”正式诞生。因为老实说,在浏览器环境下,没有模块也不是特别大的问题,毕竟网页程序的复杂性有限;但是在服务器端,一定要有模块,与操作系统和其他应用程序互动,否则根本没法编程。
Node.js的模块系统,就是参照CommonJS规范实现的。在CommonJS中,有一个全局性方法require(),用于加载模块。假定有一个数学模块math.js,就可以像下面这样加载。
- var math = require('math');
然后,就可以调用模块提供的方法:
- var math = require('math');
- math.add(2,3); // 5
因为这个系列主要针对浏览器编程,不涉及node.js,所以对CommonJS就不多做介绍了。我们在这里只要知道,require()用于加载模块就行了。
浏览器环境
有了服务器端模块以后,很自然地,大家就想要客户端模块。而且最好两者能够兼容,一个模块不用修改,在服务器和浏览器都可以运行。
但是,由于一个重大的局限,使得CommonJS规范不适用于浏览器环境。还是上一节的代码,如果在浏览器中运行,会有一个很大的问题,你能看出来吗?
- var math = require('math');
- math.add(2, 3);
第二行Math.add(2, 3),在第一行require(‘math’)之后运行,因此必须等math.js加载完成。也就是说,如果加载时间很长,整个应用就会停在那里等。
这对服务器端不是一个问题,因为所有的模块都存放在本地硬盘,可以同步加载完成,等待时间就是硬盘的读取时间。但是,对于浏览器,这却是一个大问题,因为模块都放在服务器端,等待时间取决于网速的快慢,可能要等很长时间,浏览器处于”假死”状态。
因此,浏览器端的模块,不能采用”同步加载”(synchronous),只能采用”异步加载”(asynchronous)。这就是AMD规范诞生的背景。
AMD模块编程是怎么回事呢?
AMD是”Asynchronous Module Definition”的缩写,意思就是”异步模块定义”。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。
AMD也采用require()语句加载模块,但是不同于CommonJS,它要求两个参数:
- require([module], callback);
第一个参数[module],是一个数组,里面的成员就是要加载的模块;第二个参数callback,则是加载成功之后的回调函数。如果将前面的代码改写成AMD形式,就是下面这样:
- require(['math'], function (math) {
- math.add(2, 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详解相关推荐
- DD每周前端七题详解-第五期
DD每周前端七题详解-第五期 系列介绍 你盼世界,我盼望你无bug.Hello 大家好!我是霖呆呆! 呆呆每周都会分享七道前端题给大家,系列名称就是「DD每周七题」. 系列的形式主要是:3道JavaS ...
- JavaScript字符串对象的方法详解
JavaScript字符串对象的方法详解 前面的博客我们说到了字符串对象的创建,属性及字符串的拼接.现在来详细讲一下字符串的方法. 1.ES6之前的方法 // js字符串的方法var str=&quo ...
- JavaScript 身份证号有效验证详解及实例代码
这篇文章主要介绍了JavaScript 身份证号有效验证详解及实例代码的相关资料,需要的朋友可以参考下 JavaScript验证身份证号 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...
- JavaScript数据结构与算法——链表详解(下)
在JavaScript数据结构与算法--链表详解(上)中,我们探讨了一下链表的定义.实现原理以及单链表的实现.接下来我们进一步了解一下链表的其他内容. 1.双向链表 双向链表实现原理图: 与单向链表不 ...
- JavaScript数据结构与算法——链表详解(上)
注:与之前JavaScript数据结构与算法系列博客不同的是,从这篇开始,此系列博客采用es6语法编写,这样在学数据结构的同时还能对ECMAScript6有进一步的认识,如需先了解es6语法请浏览ht ...
- JavaScript数据结构与算法——队列详解(下)
接下来会借助本人另一篇文章JavaScript数据结构与算法--队列详解(上)中实现的队列类及其方法实现一个应用. 配对问题 需求分析:在一个文件中保存着一份男女混合的数据,名称前以B开头表示男士,以 ...
- JavaScript数据结构与算法——列表详解(下),基于Nodejs实现一个列表应用
1.上篇回顾: 上篇我们实现了一个列表类,并添加了一些属性,实现了比较多的方法,本文章将与大家一起使用列表实现一个图书借阅查询系统.需要使用JavaScript数据结构与算法--列表详解(上)中写好的 ...
- JavaScript数据结构与算法——列表详解(上)
列表是一组有序的数据,每个数组中的数据项称为元素.数组相关知识不够了解的伙伴可以阅读本人上篇博客在JavaScript中,列表的元素可以是任意数据类型.列表中可以保存不定数量的元素,实际使用时元素的数 ...
- JavaScript数据结构与算法——数组详解(下)
1.二维与多维数组 JavaScript只支持一维数组,但是通过在数组里保存数组元素的方式,可以轻松创建多维数组. 1.1 创建二维数组 二维数组类似一种由行和列构成的数组表格,在JavaScript ...
- javascript教程:console.log 详解
对应WEB程序员,console.log 可以说是神器,极大地方便了程序开发.程序猿:学习了,用Console写日志比alert方便多了. console.log(object[, object, . ...
最新文章
- Python 包安装和 postgresql 的一些问题
- 编程软件python怎样开始学-编程零基础应当如何开始学习 Python?
- Json入门及基本应用
- 数据分析精华经验分享,看看冠军是如何炼成的?
- Qt 事件处理机制-qt源码解读
- PHP判断浏览器类型和浏览器语言(附各国语言简写代码)
- linux下的hosts文件
- 苹果6显示连接id服务器出错,appleid:appleid连接失败该如何解决
- win10不能访问服务器共享文件夹权限,win10没有权限访问共享文件夹(有效解决共享文件夹权限问题)...
- jupyter notebook环境配置
- 沈阳农业大学计算机专业排名,沈阳农业大学王牌专业排名
- Variational Inference入门:variational bayesian EM
- 2021 ICPC 昆明(22-4-17) C L E | 第46届ICPC亚洲区域赛(昆明)
- Chainlink官方文档翻译(二) 中间件-随机数 Intermediates - Random Numbers)
- php中预定义常量的,php预定义常量_PHP教程
- [心电图] 贺银成视频笔记
- 嵌入式开发教程哪家好?云计算培训如何学?
- ib中文文学课如何学习重点?
- Java面向对象 继承,super,方法重写
- Outlook中将发送邮件自动CC给自己
热门文章
- php网上商城拟解决的问题是,上次说的软件商城BUG,已找到问题,并解决~
- android日历便签,安卓手机上有日历与便签结合的app吗?
- 智慧城市特效(建筑颜色渐变、飞线、扫光、扫描、光墙、线路、水、道路线条、锥形标、漫游)three+shader
- 怎么成为日上会员直邮_放福利啦,免税店现在一件也能直邮,不用出入境、不用出入境、不用找代购...
- C# static变量、const变量、readonly变量
- [Usaco2008 Mar]River Crossing渡河问题
- Thymeleaf 的使用
- Android基础 写给新手的Android环境配置
- unity中的rigibody 和 collider 讲解
- 中间件配置文件-nginx