模块加载器的概念可能稍微接触过前端开发的童鞋都不会陌生,通过模块加载器可以有效的解决这些问题:

主流的JS模块加载器有requireJS,SeaJS等,加载器之间可能会因为遵循的规范不同有微妙的差别,从纯用户的角度出发,之所以选requireJS而不是SeaJS主要是因为:
功能实现上两者相差无几,没有明显的性能差异或重大问题。
文档丰富程度上,requireJS远远好于SeaJS,就拿最简单的加载jQuery和jQuery插件这回事,虽然两者的实现方法相差无几,但requireJS就有可以直接拿来用的Demo,SeaJS还要读文档自己慢慢折腾。一些问题的解决上,requireJS为关键词也更容易找到答案。
requireJS 加载jQuery + jQuery插件
可能对于一般Web App来说,引入jQuery及相关插件的概率是最大的,requireJS也亲切的给出了相应的解决方案及动态加载jQuery及插件的文档及实例代码。
在最新的jQuery1.9.X中,jQuery已经在最后直接将自己注册为一个AMD模块,即是说可以直接被requireJS作为模块加载。如果是加载旧版的jQuery有两种方法:
1. 让jQuery先于requireJS加载
2. 对jQuery代码稍做一点处理,在jQuery代码包裹一句:
define(["jquery"], function($) {
// $ is guaranteed to be jQuery now */
});
requireJS的示例中,直接将requireJS与jQuery合并为一个文件,如果是采用jQuery作为核心库的话推荐这种做法。
同样对于jQuery插件来说也有两种方法
1. 在插件外包裹代码
define(["jquery"], function($){
// Put here the plugin code.
});
2. 在使用reuqireJS代码加载前注册插件(比如在main.js)中
requirejs.config({
"shim": {
"jquery-cookie" : ["jquery"]
}
});
requireJS加载第三方类库
在实例的App中还用到了jQuery以外的第三方类库,如果类库不是一个标准的AMD模块而又不想更改这些类库的代码,同样需要提前进行定义:
require.config({
paths: {
'underscore': 'vendor/underscore'
},
shim: {
underscore: {
exports: '_'
}
}
});
CSS文件的模块化处理
在requireJS中,模块的概念仅限于JS文件,如果需要加载图片、JSON等非JS文件,requireJS实现了一系列加载插件。
但是遗憾的是requireJS官方没有对CSS进行模块化处理,而我们在实际项目中却往往能遇到一些场景,比如一个轮播的图片展示栏,比如高级编辑器等等。几乎所有的富UI组件都会由JS与CSS两部分构成,而CSS之间也存在着模块的概念以及依赖关系。
为了更好的与requireJS整合,这里采用require-css来解决CSS的模块化与依赖问题。
require-css是一个requireJS插件,下载后将css.js与normalize.js放于main.js同级即可默认被加载,比如在我们的项目中需要加载jQuery Mobile的css文件,那么可以直接这样调用:
require(['jquery', 'css!../css/jquery.mobile-1.3.0.min.css'], function($) {
});
不过由于这个CSS本质上是属于jQuery Mobile模块的一部分,更好的做法是将这个CSS文件的定义放在jQuery Mobile的依赖关系中,最终我们的requireJS定义部分为:
require.config({
paths: {
'jquerymobile': 'vendor/jquery.mobile-1.3.0',
'jstorage' : 'vendor/jstorage',
'underscore': 'vendor/underscore'
},
shim: {
jquerymobile : {
deps: [
'css!../css/jquery.mobile-1.3.0.min.css'
]
},
underscore: {
exports: '_'
}
}
});
在使用模块时,只需要:
require(['jquery', 'underscore', 'jquerymobile', 'jstorage'], function($, _) {
});
jQuery Mobile的CSS文件就会被自动加载,这样CSS与JS就被整合为一个模块了。同理其他有复杂依赖关系的模块也可以做类似处理,requireJS会解决依赖关系的逻辑。
数据源的加载与等待
Web App一般都会动态加载后端的数据,数据格式一般可以是JSON、JSONP也可以直接是一个JS变量。这里以JS变量为例:
var restaurants = [
{
"name": "KFC"
},
{
"name": "7-11"
},
{
"name": "成都小吃"
}
]
载入这段数据:
$.getScript('data/restaurants.json', function(e){
var data = window.restaurants;
alert(data[0].name); //KFC
});
单一的数据源确实很简单,但是往往一个应用中会有多个数据源,比如在这个实例App中UI就需要载入用户信息、餐厅信息、订餐信息三种数据后才能工作。如果仅仅靠多层嵌套回调函数的话,可能代码的耦合就非常重了。
为了解决多个数据加载的问题,我习惯的解决方法是构造一个dataReady事件响应机制。
var foodOrder = {
//数据载入后要执行的函数暂存在这里
dataReadyFunc : []
//数据源URL及载入状态
, dataSource : [
{ url : 'data/restaurants.json', ready : false, data : null },
{ url : 'data/users.json', ready : false, data : null },
{ url : 'data/foods.json', ready : false, data : null }
]
//检查数据源是否全部载入完毕
, isReady : function(){
var isReady = true;
for(var key in this.dataSource){
if(this.dataSource[key].ready !== true){
isReady = false;
}
}
return isReady;
}
//数据源全部加载完毕,则逐一运行dataReadyFunc中存放的函数
, callReady : function(){
if(true === this.isReady()){
for(var key in this.dataReadyFunc){
this.dataReadyFunc[key]();
}
}
}
//供外部调用,会将外部输入的函数暂存在dataReadyFunc中
, dataReady : function(func){
if (typeof func !== 'function') {
return false;
}
this.dataReadyFunc.push(func);
}
, init : function(){
var self = this;
var _initElement = function(key, url){
$.getScript(url, function(e){
//每次载入数据后,将数据存放于dataSource中,将ready状态置为true,并调用callReady
self.dataSource[key].data = window[key];
self.dataSource[key].ready = true;
self.callReady();
});
}
for(var key in this.dataSource){
_initElement(key, this.dataSource[key].url);
}
}
}
用法为:
foodOrder.dataReady(function(){
alert(1);
});
foodOrder.init();
dataReady内的alert将会在所有数据载入完毕后开始执行。
这段处理的逻辑并不复杂,将所有要执行的方法通过dataReady暂存起来,等待数据全部加载完毕后再执行,更加复杂的场景此方法仍然通用。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# requirejs
# 按需加载js
# 加载js
# 按需加载
# JavaScript模块管理的简单实现方式详解
# 关于Javascript模块化和命名空间管理的问题说明
# javascript模块化是什么及其优缺点介绍
# Javascript模块化编程详解
# Javascript模块化编程(三)require.js的用法及功能介绍
# Javascript模块模式分析
# 详解JavaScript模块化开发
# Javascript模块化编程(一)AMD规范(规范使用模块)
# javascript 模块依赖管理的本质深入详解
# 加载
# 关键词
# 可以直接
# 是一个
# 类库
# 多个
# 相差无几
# 这段
# 文档
# 第三方
# 的是
# 就会
# 在这里
# 也有
# 是因为
# 放在
# 在这个
# 出了
# 一句
# 就有
相关文章:
建站主机选哪家性价比最高?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
简易网站制作视频教程,使用记事本编写一个简单的网页html文件?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
网站制作报价单模板图片,小松挖机官方网站报价?
网站好制作吗知乎,网站开发好学吗?有什么技巧?
如何在Golang中指定模块版本_使用go.mod控制版本号
,在苏州找工作,上哪个网站比较好?
如何快速辨别茅台真假?关键步骤解析
创业网站制作流程,创业网站可靠吗?
成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?
jQuery 常见小例汇总
如何配置IIS站点权限与局域网访问?
如何在阿里云域名上完成建站全流程?
如何通过二级域名建站提升品牌影响力?
如何在万网自助建站平台快速创建网站?
招贴海报怎么做,什么是海报招贴?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
佛山网站制作系统,佛山企业变更地址网上办理步骤?
大同网页,大同瑞慈医院官网?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
购物网站制作公司有哪些,哪个购物网站比较好?
微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
如何用AWS免费套餐快速搭建高效网站?
建站与域名管理如何高效结合?
如何在Windows 2008云服务器安全搭建网站?
建站之星如何实现五合一智能建站与营销推广?
如何用wdcp快速搭建高效网站?
建站之星图片链接生成指南:自助建站与智能设计教程
建站DNS解析失败?如何正确配置域名服务器?
北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?
免费公司网站制作软件,如何申请免费主页空间做自己的网站?
建站之星后台管理系统如何操作?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
子杰智能建站系统|零代码开发与AI生成SEO优化指南
如何在VPS电脑上快速搭建网站?
高端网站建设与定制开发一站式解决方案 中企动力
如何通过FTP服务器快速搭建网站?
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
怀化网站制作公司,怀化新生儿上户网上办理流程?
制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?
定制建站是什么?如何实现个性化需求?
如何解决ASP生成WAP建站中文乱码问题?
已有域名建站全流程解析:网站搭建步骤与建站工具选择
如何注册花生壳免费域名并搭建个人网站?
制作公司内部网站有哪些,内网如何建网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。