java模块化按需加载,JavaScript模块化之使用requireJS按需加载

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

JS文件的依赖关系。

通过异步加载优化script标签引起的阻塞问题

可以简单的以文件为单位将功能模块化并实现复用

主流的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暂存起来,等待数据全部加载完毕后再执行,更加复杂的场景此方法仍然通用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宇轩网络面试题目PHP,二十道接地气的php面试题,让你直接通过面试!就此奉上~...

1、echo count(“abc”); 输出什么?答:"1"count— 计算数组中的单元数目或对象中的属性个数int count ( mixed var\[,intvar \[, intvar\[,intmode ] ), 如果 var 不是数组类型或者实现了 Countable 接口的对象,将返回 1&#xff0…

java期末试题c卷,JAVA程序设计期末考试试卷及参考答案

《JAVA程序设计》期末考试试卷考生注意:1.本试卷满分100分。2.考试时间90分钟。3.卷面整洁,字迹工整。4.填写内容不得超出密封线。总分题号一二三四五六核分人题分21204019复查人得分一、单选择题(每题2分&…

mysql 分组查询原理,MySQL分組查詢Group By實現原理詳解

由於GROUP BY 實際上也同樣會進行排序操作,而且與ORDER BY 相比,GROUP BY 主要只是多了排序之后的分組操作。當然,如果在分組的時候還使用了其他的一些聚合函數,那么還需要一些聚合函數的計算。所以,在GROUP BY 的實現…

mysql 执行计划详解,Mysql中的explain执行计划详解(1)

创建一个表test_explain,并添加入下的数据mysql> create table test_explain( a int primary key, b int);Query OK, 0 rows affected (0.09 sec)mysql> insert into test_explain value(1,1),(2,2),(3,3),(4,4),(5,5);explian中的type字段:表示m…

mac php命令行模式,phpstorm分别在Mac和Windows下启动命令行,并启用ssh

Mac:在terminal下运行 sudo -i 输入密码 就可以用ssh IP:端口 命令行登录了DAssist是一个命令行开发辅助,可直接在系统命令行工具中使用,Linux和MacOS等自带命令终端的系统好说,windows下也有cmd和powerShell。那么如何结合开发IDE工具进行…

matlab 价格统计,matlab中的金融数据统计

1.均匀分布随机数生成函数unidrnd(N,m,n)N生成1到N之间的一个随机数,确定输出矩阵m行,n列。2.生成连续均匀分布的随机数unifrnd(A,B,m,n)A,B表示上下界。3.生成正态分布随机数normrnd(mu,sigma,m,n)mu均值,…

php访问js文件不存在,php文件里js不能被执行

我想把上传文件路径返回到前端保存&#xff0c;但是后台php文件里的js没有执行&#xff0c;前台input标签里的value值一直为空后台acceptfile.php代码如下:<?php if(!isset($_REQUEST[filename])){exit(No file);}else{$upload_path dirname(__FILE__)./audio;date_defaul…

php 零宽断言,正则表达式之零宽断言实例详解【基于PHP】

这篇文章主要介绍了正则表达式之零宽断言,简单介绍了零宽断言的概念、分类及php实现技巧与相关注意事项,需要的朋友可以参考下本文实例讲述了正则表达式之零宽断言。分享给大家供大家参考&#xff0c;具体如下&#xff1a;前言之前我曾写了一篇关于正则表达式的文章(//www.jb51…

python 逻辑回归准确率是1,Python利用逻辑回归模型解决MNIST手写数字识别问题详解...

本文实例讲述了Python利用逻辑回归模型解决MNIST手写数字识别问题。分享给大家供大家参考&#xff0c;具体如下&#xff1a;1、MNIST手写识别问题MNIST手写数字识别问题&#xff1a;输入黑白的手写阿拉伯数字&#xff0c;通过机器学习判断输入的是几。可以通过TensorFLow下载MN…

php面试题接口方面,php面试题6 - osc_xb4v1nhl的个人空间 - OSCHINA - 中文开源技术交流社区...

php面试题6一、总结二、php面试题6写出你认为语言中的高级函数:1)preg_replace()2)preg_match()3) ignore_user_abort()4) debug_backtrace()5) date_default_timezone_set(“PRC”)6) get_class_methods() 得到类的方法名的数组7) preg_split() 字符串分割成数组8)json_encode…

轨道车辆垂向振动Matlab建模与仿真,基于matlab/simulink的车辆建模与故障分析

随着铁路行业高速发展,列车运行速度逐渐提高,铁路安全越来越受到人们的重视,如何保证铁道车辆运行安全及其故障监测成为一个亟待解决的重大课题。客车车辆在结构上的故障主要有一系弹簧断裂、减振器失效、空气弹簧漏气、高圆弹簧断裂、车轮踏面擦伤、轴承故障以及蛇形减震器故障…

关于php的问题有哪些,关于PHP的报错问题?

关于这个报错的表格我不知到怎么去做&#xff0c;下面的是代码&#xff1a;header(content-type:text/html;charsetutf-8);session_start();include_once ../include/conf.php;include_once ../include/func.php;include_once ../include/mysql.func.php;check_login();$pageSi…

oracle消耗内存的查询,在AIX中计算ORACLE消耗的私有内存总数

一早就收到兄弟伙发的QQ信息&#xff0c;关于aix中oracle内存计算的内容The RSS number is equal to the sum of the number of working-segment pages in memory times 4 andthe code-segment pages in memory times 4.The TRS number is equal to just the code-segment page…

php读取ds18b20,DS18B20_单总线协议

.H文件#ifndef _ONEWIRE_H#define _ONEWIRE_H#include "STC15F2K60S2.H"#include #define OW_SKIP_ROM 0xcc#define DS18B20_CONVERT 0x44#define DS18B20_READ 0xbe//IC引脚定义sbit DQ P1^4;//函数声明extern void Delay_OneWire(unsigned int t);extern void Wri…

oracle官方文档查看方法,oracle官方文档_查看初始化参数(举例)

深蓝的blog&#xff1a;http://blog.csdn.net/huangyanlong/article/details/46864217记录了一下&#xff0c;使用oracle11g联机文档&#xff0c;查看初始化参数的步骤。如果想查看&#xff0c;可以修改的初始化参数的概念信息&#xff0c;可以点击“ChangingParameter Values …

matlab usewhitebg,Matlab的:geo​​show的網格和框架

對於問題1和問題2&#xff0c;原因是軸總是在圖的後面。因此&#xff0c;一種解決方案是在當前的軸上添加新軸並顯示網格&#xff0c;框和自定義刻度。對於問題3&#xff0c;我使用regexprep以取代S後綴負緯度(同上爲經度)。我唯一的問題是經度0將是0E&#xff0c;緯度0,0N。這…

oracle p l,使用P.A.L制作便携软件 (一) 基本原理 | 么么哒拥有者

因爱好自学所得&#xff0c;并非专业&#xff0c;此处只是抛砖引玉&#xff0c;欢迎相互交流、学习、提高&#xff0c;辛苦码字不易&#xff0c;如转载望保留链接出处。简单介绍&#xff1a;P.A.L是PortableApps.com Launcher的简称&#xff0c;它是PortableApps.com开发的便携…

oracle form执行后左上角没出现oracle标记,oracle form学习笔记

新增form步骤打开模板TEMPLATE&#xff0c;将其改成自己所要的名称&#xff0c;删除Data Blacks中的BLOCKNAME,DETAILBLOCK,删除Canvases中的BLOCKNAME,删除Windows中的BLOCKNAME,新增自己的Windows&#xff0c;Canvases&#xff0c;DateBlacks&#xff0c;在form级别的PRE-FOR…

linux 建oracle分区表,Oracle 10g 11g分区表创建举例

1.3. 创建其他类型分区表1.3.1. 用多列分区键创建范围分区表SQL> create table aning_mutilcol_range2 (aning_id number,3 aning_name varchar2(100),4 aning_year number,5 aning_month number,6 aning_day number,7 aning_amount number8 )9 partition by range (aning_y…

php carbon 连续日期,日期及时间处理包 Carbon 在 Laravel 中的简单使用

在编写 PHP 应用时经常需要处理日期和时间&#xff0c;这篇文章带你了解一下 Carbon – 继承自 PHP DateTime 类的 API 扩展&#xff0c;它使得处理日期和时间更加简单。Laravel 中默认使用的时间处理类就是 Carbon。namespace Carbon;class Carbon extends \DateTime{// code …