iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >Dojo1.6有什么新的特性
  • 286
分享到

Dojo1.6有什么新的特性

2024-04-02 19:04:59 286人浏览 八月长安
摘要

这篇文章主要介绍“Dojo1.6有什么新的特性”,在日常操作中,相信很多人在Dojo1.6有什么新的特性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Dojo1.6有什么新的

这篇文章主要介绍“Dojo1.6有什么新的特性”,在日常操作中,相信很多人在Dojo1.6有什么新的特性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Dojo1.6有什么新的特性”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

前端技术虽然在不断发展之中,却一直没有质的飞跃。除了已有的各大著名框架,比如Dojo,Jquery,Extjs等等,很多公司也都有着自己的前端开发框架。这些框架的使用效率以及开发质量在很大程度上都取决于开发者对其的熟悉程度,以及对javascript的熟悉程度,这也是为什么很多公司的技术带头人都喜欢开发一个自己的框架。开发一个自己会用的框架并不难,但开发一个大家都喜欢的框架却很难。从一个框架迁移到一个新的框架,开发者很有可能还会按照原有框架的思维去思考和解决问题。这其中的一个重要原因就是JavaScript本身的灵活性:框架没办法绝对的约束你的行为,一件事情总可以用多种途径去实现,所以我们只能在方法学上去引导正确的实施方法。庆幸的是,在这个层面上的软件方法学研究,一直有人在去不断的尝试和改进,CommonJS就是其中的一个重要组织。他们提出了许多新的JavaScript架构方案和标准,希望能为前端开发提供银蛋,提供统一的指引。

AMD规范就是其中比较著名一个,全称是Asynchronous Module Definition,即异步模块加载机制。从它的规范描述页面看,AMD很短也很简单,但它却完整描述了模块的定义,依赖关系,引用关系以及加载机制。从它被requireJS,nodejs,Dojo,JQuery使用也可以看出它具有很大的价值,没错,JQuery近期也采用了AMD规范。在这篇文章中,我们就将介绍AMD的性质,用法,优势以及应用场景。从AMD中我们也能学习到如何在更高层面去设计自己的前端应用。

1. AMD是什么

作为一个规范,只需定义其语法api,而不关心其实现。AMD规范简单到只有一个API,即define函数:

define([module-name?], [array-of-dependencies?], [module-factory-or-object]);

其中:

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

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

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

从中可以看到,***个参数和第二个参数都是可以省略的,第三个参数则是模块的具体实现本身。后面将介绍在不同的应用场景下,他们会使用不同的参数组合。

从这个define函数AMD中的A:Asynchronous,我们也不难想到define函数具有的另外一个性质,异步性。当define函数执行时,它首先会异步的去调用第二个参数中列出的依赖模块,当所有的模块被载入完成之后,如果第三个参数是一个回调函数则执行,然后告诉系统模块可用,也就通知了依赖于自己的模块自己已经可用。如果对应到dojo1.6之前的实现,那么在功能上可以有如下对应关系:

◆  module-name: dojo.provide

◆  dependencies: dojo.require

◆  module-factory: dojo.declare

不同的是,在加载依赖项时,AMD用的是异步,而dojo.require是同步。异步和同步的区别显而易见,前者不会阻塞浏览器,有更好的性能和灵活性。而对于nodeJs这样的服务器端AMD,则模块载入无需阻塞服务器进程,同样提高了性能。

2. AMD实例:如何定义一个模块

下面代码定义了一个alpha模块,并且依赖于内置的require,exports模块,以及外部的beta模块。可以看到,第三个参数是回调函数,可以直接使用依赖的模块,他们按依赖声明顺序作为参数提供给回调函数。

这里的require函数让你能够随时去依赖一个模块,即取得模块的引用,从而即使模块没有作为参数定义,也能够被使用;exports是定义的alpha 模块的实体,在其上定义的任何属性和方法也就是alpha模块的属性和方法。通过exports.verb = ...就是为alpha模块定义了一个verb方法。例子中是简单调用了模块beta的verb方法。

define("alpha", ["require", "exports", "beta"], function (require, exports, beta) {      exports.verb = function() {          return beta.verb();          //或者:          return require("beta").verb();      }  });

3. 匿名模块

define 方法允许你省略***个参数,这样就定义了一个匿名模块,这时候模块文件的文件名就是模块标识。如果这个模块文件放在a.js中,那么a就是模块名。可以在依赖项中用"a"来依赖于这个匿名模块。这带来一个好处,就是模块是高度可重用的。你拿来一个匿名模块,随便放在一个位置就可以使用它,模块名就是它的文件路径。这也很好的符合了DRY(Don't Repeat Yourself)原则。

下面的代码就定义了一个依赖于alpha模块的匿名模块:

define(["alpha"], function (alpha) {      return {        verb: function(){          return alpha.verb() + 2;        }      };  });

4. 仅有一个参数的define

前面提到,define的前两个参数都是可以省略的。第三个参数有两种情况,一种是一个JavaScript对象,另一种是一个函数。

如果是一个对象,那么它可能是一个包含方法具有功能的一个对象;也有可能是仅提供数据。后者和JSON-P非常类似,因此AMD也可以认为包含了一个完整的 JSON-P实现。模块演变为一个简单的数据对象,这样的数据对象是高度可用的,而且因为是静态对象,它也是CDN友好的,可以提高JSON-P的性能。考虑一个提供中国省市对应关系的JavaScript对象,如果以传统JSON-P的形式提供给客户端,它必须提供一个callback函数名,根据这个函数名动态生成返回数据,这使得标准JSON-P数据一定不是CDN友好的。但如果用AMD,这个数据文件就是如下的形式:

define({        provinces: [      {          name: '上海',           areas: ['浦东新区', '徐汇区']},      {          name: '江苏',           cities: ['南京', '南通']}          //.....        ]  });

假设这个文件名为china.js,那么如果某个模块需要这个数据,只需要:

define(['china', function(china){      //在这里使用中国省市数据  });

通过这种方式,这个模块是真正高度可复用的,无论是用远程的,还是Copy到本地项目,都节约了开发时间和维护时间。

如果参数是一个函数,其用途之一是快速开发实现。适用于较小型的应用,你无需提前关注自己需要什么模块,自己给谁用。在函数中,可以随时require自己需要的模块。例如:

define(function(){      var p = require('china');      //使用china这个模块  });

即你省略了模块名,以及自己需要依赖的模块。这不意味着你无需依赖于其他模块,而是可以让你在需要的时候去require这些模块。define方法在执行的时候,会调用函数的toString方法,并扫描其中的require调用,提前帮助你载入这些模块,载入完成之后再执行。这使得快速开发成为可能。需要注意的一点是,Opera不能很好的支持函数的toString方法,因此,在浏览器中它的适用性并不是很强。但如果你是通过build工具打包所有的 JavaScript文件,这将不是问题,构建工具会帮助你扫描require并强制载入依赖的模块。

5. Dojo中的AMD

Dojo 在三月初正式发布了1.6版本,其中一个重要的变化就是引入了AMD机制,取代了原来的dojo.provide和dojo.require方法。但是现在仍然保持了向后兼容性,你仍然可以用dojo.provide和dojo.require来定义和加载模块。需要注意的是:在 Dojo 1.6 中, 针对 AMD 的重构仍然属于一个过渡期的改动 , 用户自己开发的 AMD 模块还不能被 Dojo 的加载器和 Build 系统支持 . 1.6 中现有的编译系统对AMD的支持还非常局限。 如果你自己开发了 AMD 格式的模块,并且你仍然在使用默认的 Dojo 同步模块加载器,那么你必须严格遵循 Dojo 模块的格式 ( 包括换行的格式 ) 来保证你自己的模块能够成功编译。总结起来有以下三点:

◆  用传统的方法 (dojo.require()/dojo.provide()) – 这些模块,只能被 Dojo 同步加载器 加载,但可以被 Dojo 编译系统(Build System )正确的编译

◆  用 Dojo 同步加载器来加载 AMD 格式 ( define ()) 模块 – 这些模块可以被正常的加载,并且可以被其他兼容 AMD 格式的加载器加载 . 现在虽然 Dojo1.6 还没有正式支持这种用法, 但在目前的 Dojo1.6 编译系统中,是可以正常工作的 . ( 前提是你必须严格遵循 Dojo 模块定义的代码规范 )

◆  使用第三方加载器来加载 AMD 格式( define ())模块 – 模块可以被正常加载,并且可以被其他加载器所使用 . 这些模块可以使用 RequireJS 或 Backdraft 提供的编译系统正常编译,但是 Dojo 还没有正式的测试过和其他加载器的兼容性 .

以Calendar为例,用define方法来定义这个模块:

define("dijit/Calendar",       ["dojo", "dijit", "text!dijit/templates/Calendar.html",       "dojo/cldr/supplemental", "dojo/date", "dojo/date/locale",      "dijit/_Widget", "dijit/_Templated", "dijit/_CSSStateMixin", "dijit/fORM/DropDownButton"],       function(dojo, dijit) {           dojo.declare(              "dijit.Calendar",              [dijit._Widget, dijit._Templated, dijit._CssStateMixin],              {...}          );          return dijit.Calendar;      }  );

可以看到,模块标识就是模块文件的路径,模块本身一般都是dojo.declare定义的类。Dojo1.6中的dojo和dijit命名空间下的模块均已经用AMD的形式进行了重构,但dojox下仍然延用了传统的dojo.provide和dojo.require形式。对AMD的引入是Dojo走向自动化包管理的重要一步,在后续文章中我们也将继续关注Dojo在这方面的进展。

到此,关于“Dojo1.6有什么新的特性”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Dojo1.6有什么新的特性

本文链接: https://www.lsjlt.com/news/66594.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Dojo1.6有什么新特性
    这篇文章主要讲解了“Dojo1.6有什么新特性”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Dojo1.6有什么新特性”吧!Dojo作为最老牌的JavaSc...
    99+
    2024-04-02
  • Dojo1.6有什么新的特性
    这篇文章主要介绍“Dojo1.6有什么新的特性”,在日常操作中,相信很多人在Dojo1.6有什么新的特性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Dojo1.6有什么新的...
    99+
    2024-04-02
  • Kubernetes1.5的新特性有什么
    Kubernetes1.5的新特性有什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。背景介绍在Kubernetes1.5中,对于kubelet新增加了几个同认...
    99+
    2023-06-05
  • CSS3有什么新特性
    这篇文章给大家分享的是有关CSS3有什么新特性的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。   一、RGBA和透明度   RGBA是RGB色彩模型的一个扩展。在本质上看也是...
    99+
    2024-04-02
  • Vue.js2.5有什么新特性
    本篇内容介绍了“Vue.js2.5有什么新特性”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!TypeScr...
    99+
    2024-04-02
  • Java12有什么新特性
    这篇文章主要讲解了“Java12有什么新特性”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java12有什么新特性”吧!Switch 表达式 (JEP 325)在 Java 12 中,对 S...
    99+
    2023-06-15
  • MySQL8.0有什么新特性
    本篇内容介绍了“MySQL8.0有什么新特性”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、MySQL ...
    99+
    2024-04-02
  • OSGi 4.2的新特性有什么
    本篇文章为大家展示了OSGi 4.2的新特性有什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一些 OSGi 实现,例如 Equinox 3.5 与 Felix 2.0 早已针对 OSGi 4.2...
    99+
    2023-06-17
  • C++11有什么新特性
    这篇文章主要介绍“C++11有什么新特性”,在日常操作中,相信很多人在C++11有什么新特性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11有什么新特性”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-16
  • Mysql5.6中有什么新特性
    这篇文章主要介绍“Mysql5.6中有什么新特性”,在日常操作中,相信很多人在Mysql5.6中有什么新特性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Mysql5.6中有...
    99+
    2024-04-02
  • vue3.0中有什么新特性
    这篇文章主要介绍了vue3.0中有什么新特性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。vue3.0新特性:1、节点打Tag;2、事件开缓存;3、响应式Proxy;4、Co...
    99+
    2023-06-14
  • html5中有什么新特性
    今天小编给大家分享一下html5中有什么新特性的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。canvas<canvas...
    99+
    2023-06-27
  • PHP7中有什么新特性
    这篇文章主要介绍了PHP7中有什么新特性,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php是什么语言php,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hyper...
    99+
    2023-06-14
  • C# 3.5有什么新特性
    小编给大家分享一下C# 3.5有什么新特性,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!隐式类型本地变量(Implicity Typed Local Variab...
    99+
    2023-06-17
  • Python 3.1 有什么新特性
    这篇文章主要讲解了“Python 3.1 有什么新特性”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python 3.1 有什么新特性”吧!千位数格式化在格...
    99+
    2024-04-02
  • go语言有什么新特性
    Go语言的新特性主要集中在以下几个方面:1. 模块化支持:Go 1.11引入了Go模块的概念,可以更方便地管理和复用代码。通过go....
    99+
    2023-10-12
    Go语言
  • Linux Kernel 2.6.34新特性有什么
    Linux Kernel 2.6.34新特性有什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。又是间隔了三个月,Linus Torvalds在5月17日放出了Linux Ke...
    99+
    2023-06-16
  • Visual C# 3.0新特性有什么
    这篇文章主要讲解了“Visual C# 3.0新特性有什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Visual C# 3.0新特性有什么”吧!在发布Visual Studio 2005...
    99+
    2023-06-17
  • PostgreSQL12的新特性REINDEX有什么作用
    这篇文章主要介绍“PostgreSQL12的新特性REINDEX有什么作用”,在日常操作中,相信很多人在PostgreSQL12的新特性REINDEX有什么作用问题上存在疑惑,小编查阅了各式资料,整理出简单...
    99+
    2024-04-02
  • mysql8新特性binlog_expire_logs_seconds有什么作用
    这篇“mysql8新特性binlog_expire_logs_seconds有什么作用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作