Dojo第三方库依赖关系的管理——use.js实现

来源:互联网 发布:three.js空调贴图 编辑:程序博客网 时间:2024/06/05 06:53

Dojo是一个用javascript语言实现的开源DHTML工具包。它是在几个项目捐助基础上建立起来的(nWidgets,Burstlib,f(m)),这也是为什么叫它a”unified”toolkit的原因。Dojo的目标是解决开发DHTML应用程序遇到的那些,长期存在、历史问题(historical problems with DHTML)。跨浏览器问题。

前言

在早期(2004年开始),dojo是一个优秀的项目,它提供了众多的组件,能够十分方便的开发出交互的用户界面,同时它提供了统一的API,能够编写统一,兼容性高的web程序。然而,随着近些年web技术的快速发展,各种轻便,模块化,组件化的JS库如雨后春笋般涌出,dojo逐渐显得有些笨重和落后了。但是在GIS圈里,如果你做webGIS开发,并且使用到了ArcGIS API for JavaScript库的话,dojo就是你越不过的坎,因为ArcGIS API for JavaScript库便是基于Dojo开发的。

Dojo第三方模块依赖关系中的问题

Dojo提倡模块化开发,同时内部实现了AMD标准的JS模块化开发方法,通过definerequire来实现模块的定义和引用,一个标准的dojoConfing代码如下所示:

var dojoConfig ={    async: true,    isDebug: false,    parseOnLoad: true,    paths: {},    packages: []}

一般情况下,dojo是够用的,因为它实现了从DOM操作到Web组件以及JS类等一系列API的封装,基本上只使用这一个库就够了,所以它没用定义如何管理第三方组件的依赖关系,如果你引用了bootstrap样式,那么在引入bootstrap.js之前,你得先引用jQuery.js,因为bootstrap依赖jquery,那么,你在dojo中就没法管理这种关系,如果你说这样定义

define(['jquery','bootstrap'],function(){})

这样得也是不可以的,因为各种包的引入是异步的,你无法确定jquery.js文件在bootstrap.js文件之前已经被浏览器加载了,因此,你必须确定bootstrap在jquery之后才加载,然而Dojo并没有对这种关系的处理办法。

RequireJS的处理办法

在另一个JS模块化管理库requirejs中,它对第三方依赖关系的管理有着直接的解决办法:deps,在模块定义中便可直接定义模块的依赖关系,在加载一个模块前,首先确保它所依赖的库已经被加载,在requireJS的config文件中,可以如下定义:

requirejs.config({    baseUrl: ''    shim: {        "bootstrap": {            "deps": ['jquery']        }    },    paths: {},    packages: []});

在deps中便可明确定义模块间的依赖,那么在bootstrap被加载前,它会先确保jquery已经被加载,那么如何在dojo中解决这个问题呢。

Dojo中第三方模块依赖的解决——use.js

dojo真是一个古老的库,中文的资料实在是少,而且某度真的不太好用,搜来搜去满页都是一篇博文在几个网站上的转载。最终经过几小时的Google,以及在StackOverflow上的寻找,终于发现也有网友遇到过同样的问题。在StackOverflow上,有大神指出,可以实现一个自己的模块加载器,通过使用dojo的Deffered方法,同时使用promise确保一个模块在另一个模块后面加载,内部使用require。另一个大佬直接给出了use.js开源库,通过usejs来实现对第三方模块的管理。

useJS仓库中对它描述为,在默认的AMD加载程序不知道如何加载未使用AMD语法的JS库,它能够运行您正确管理模块的依赖关系,并将指定的全局变量附加到模块中导出。它实现了类似requireJS中的depsexports。在dojo中,我们可以这样使用:

  • 1.首先,确保dojo模块加载器为异步的:

    <script data-dojo-config="async:1" src="dojo/dojo.js"></script>
  • 2.config文件如下定义:

    require({    paths: {        "module/a": "/path/to/module/a",        "module/b": "/path/to/module/b",        "use": "path/to/use"    },    use: {        "module/a": {        deps: ["module/b"],        attach: "A"        }    }});
  • 3 最后在模块中可以这样引用模块a:

    require(["use!module/a"], function(A) {    console.log(A); // is A!});

useJS库的代码十分简单,加上注释总共110行,在代码中它主要实现了load和write两个方法,这其实就是Dojo插件库的写法,dojo本身就有着dojo/textdojo/hasdojo/load等插件,关于编写自己的dojo插件,网上教程实在太少,对于这些我也没有弄得很明白,毕竟dojo在国内已经没用那么常用了,希望这些能帮助到需要的人。

总结:使用use.js能够解决dojo第三方模块的依赖。

原创粉丝点击