RequireJS解决代码依赖问题,异步加载js,避免页面失去相应
RequireJS的目标是鼓励代码的模块化,它使用了不同于传统
<script>标签的脚本加载步骤。可以用它来加速、优化代码,但其主要目的还是为了代码的模块化。它鼓励在使用脚本时以module ID替代URL地址。
RequireJS以一个相对于baseUrl的地址来加载所有的代码。 页面顶层<script>标签含有一个特殊的属性data-main,require.js使用它来启动脚本加载过程,而baseUrl一般设置到与该属性相一致的目录。
加载
<script data-main="main" src="./require.js"></script>
这里的mian是脚本的入口,相当于c语言的main()主函数, 所有的模块都要集中在这里被解析. 默认加载的都是js文件,所以就不用加.js
<script src="js1.js""></script>
<script src="js2.js""></script>
<script src="js3.js""></script>
<script src="js4.js""></script>
之前我们引用js代码就会是这样, 依赖顺序不能颠倒, 这样就非常麻烦,
AMD规范
//AND规范的写法
require(['依赖一', '依赖二', '依赖三'], function(依赖一的别名, 依赖三的别名, 依赖三的别名){
//code
})
require很好的解决了这个代码依赖的问题,它采用AMD(异步模块加载)规范加载脚本文件.
比如:
require(['jquery', 'underscore', 'bankbone'], function($, _, Backbone) {
//code
})
配置
有的模块肯定是不符合AMD规范的,那么我们就需要配置一下,shim属性就是配置不符合AMD规范的代码的,require.config()参数是一个对象,写在页面的最顶部.
require.config({
baseUrl: '路径', // 设置js文件的根目录,默认是main.js的目录,这里写相对与main.js的相对路径
paths: {
jquery: '路径' // 为每个文件单独指定路径, 也可以是网络地址
}
shim: {
'模块名': {
exports: '模块别名',
deps: ['依赖一', '依赖二']
}
}
})
AMD模块的写法
define(['依赖'], function(依赖别名) {
//code
})
define(function(a, b) {
var add = function(a, b) {
return a + b;
}
return add
});
//这样写只能返回一个方法
//在main.js里用该模块的名字(a,b)调用
还可以用下面的方法写
define(function(a, b) {
var add = function(a, b) {
return a + b;
}
var x = function(a, b) {
return a * b
}
return {
add: add,
x: x
}
});
//这样写只能返回多个方法
//在main.js里用该模块的名字.add(a,b)或者模块名字.x(a,b)调用
模块的压缩合并
模块化的写法肯定会增加文件数量, 从而增加请求次数, 放慢加载速度, require有自带的压缩工具r.js, 可以合并所有模块为一个js文件. 可以去官网下载也可以使用bower下载
bower install r.js
- 下载完后在main.js的目录新建一个build.js文件(配置如下)
- 在build.js的文件目录下执行node r.js -o build.js
- 构建完后会有一个main-built.js文件
-
({
appDir: './', //项目根目录
out: 'main-build.js', //输出文件名
dir: './outdir', //输出目录,全部文件打包后要放入的文件夹(如果没有会自动新建的)
/* 有了dir,就不能使用out配置项了,你在编译时它有非常明确的提示 */
baseUrl: './js/pages', //相对于appDir,代表要查找js文件的起始文件夹,下文所有文件路径的定义都是基于这个baseUrl的
modules: [
//要优化的模块 —— 里面的配置项即各页面的 相对baseUrl路径的 省略后缀“.js”的 入口文件(入口文件 ---- 即加载页面时引入require.js的script标签上data-main属性所指定的文件)
//该属性必不可少,因为一个程序至少需要有一个入口
{ name:'main'},
{ name:'index'}
],
fileExclusionRegExp: /^(r|build)\.js|.*\.scss$/, //正则匹配过滤文件,匹配到的文件将不会被输出到输出目录去,这里过滤掉的是 r.js、build.js、*.scss三类文件
optimizeCss: 'standard',
removeCombined: true, //如果为true,优化器将从输出目录中删除已合并的文件
paths: { //各模块相对baseUrl的路径,直接从require.config的path配置中烤取即可
"underscore": "../libs/underscore/underscore-min",
"backbone": "../libs/backbone/backbone-min",
},
shim:{// 配置不符合AMD规范的模块,直接从require.config的shim配置中烤取即可
"underscore": {
exports: "_"
},
"backbone": {
deps: ["underscore", "jquery"],
exports: "Backbone"
},
}
})
RequireJS解决代码依赖问题,异步加载js,避免页面失去相应的更多相关文章
- React配合Webpack实现代码分割与异步加载
这是Webpack+React系列配置过程记录的第四篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...
- 网页性能优化之异步加载js文件
一个网页的有很多地方可以进行性能优化,比较常见的一种方式就是异步加载js脚本文件.在谈异步加载之前,先来看看浏览器加载js文件的原理. 浏览器加载 JavaScript 脚本,主要通过<scri ...
- HTML5中script的async属性异步加载JS
HTML5中script的async属性异步加载JS HTML4.01为script标签定义了5个属性: charset 可选.指定src引入代码的字符集,大多数浏览器忽略该值.defer 可 ...
- 异步加载js的三种方法
js加载时间线 : 它是根据js出生的那一刻开始记录的一系列浏览器按照顺序做的事,形容的就是加载顺序,可以用来优化什么东西,理论基础,背下来. 1.创建Document对象,开始解析web页面.解析H ...
- 请给出异步加载js方案
请给出异步加载js方案,不少于两种 默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很 ...
- 异步加载js
//异步加载js function loadScript(url,callback){ var script = document.createElement("script"); ...
- angularLoad(用以异步加载js文件)
angularLoad(用以异步加载js文件) 使用方法: 1.执行命令 下载 lib npm install angular-load --save 2.index.html引用js <scr ...
- phoneGap异步加载JS失败
现在正在做一个phoneGap项目,安卓平台,有个异步加载JS总是失败,phoneGap也不好调试,一个问题纠结了一下午 最后找了半天,找到了原因,因此写本文记录一下,也顺便帮帮遇到同样问题的人 原因 ...
- 异步加载js文件的方法
# 异步加载js文件 - js的加载默认是同步的,因为js是单线程执行,只能完成一件再执行下一件. - 一些外部引入的js文件可以因为文件太大,在加载资源的过程中会影响dom元素的加载,影响了用户体验 ...
随机推荐
- Windows API 学习记录1
这里面的好多函数不能死记硬背,知道有这个函数就行,等用到了,再回来细看 一.窗口管理函数包括以下几类: 按钮函数(Button) Microsoft提供了对话框和控制来支持应用程序与用户之间的交互通讯 ...
- 使用Fiddler对Android应用进行抓包
1. 打开Fiddler软件,效果图如下: 2. 首先,确保安装 Fiddler 的电脑和你的手机在同一局域网内,因为Fiddler只是一个代理,需要将手机的代理指向 PC 机,不能互相访问是不行的 ...
- 【数据结构与算法】Fibonacci Sequence
学计算机的对 Fibonacci 都并不陌生,在课堂上一讲到递归几乎都会提到 Fibonacci 数列.不久前,我对 Fibonacci 产生了一些兴趣,就在这里把自己的想法给记录下来. 递推公式: ...
- MySQL主从复制入门
1.MySQL主从复制入门 首先,我们看一个图: MySQL 主从复制与读写分离概念及架构分析 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中. 假设,实时的将变化了的日志 ...
- [TC_SRM_460]TheCitiesAndRoadsDivOne
[TC_SRM_460]TheCitiesAndRoadsDivOne 试题描述 John and Brus have become very famous people all over the w ...
- SolrCloud在linux上的搭建
SolrCloud在linux上的搭建 1.环境准备 三台虚拟机的环境准备: 1. 更改主机名 2. 关闭selinux 3. 关闭防火墙 4. 更改主机名与ip地址的映射 5. 时钟同步 6. ss ...
- BZOJ3999 [TJOI2015]旅游 【树剖 + 线段树】
题目 为了提高智商,ZJY准备去往一个新世界去旅游.这个世界的城市布局像一棵树.每两座城市之间只有一条路径可 以互达.每座城市都有一种宝石,有一定的价格.ZJY为了赚取最高利益,她会选择从A城市买入再 ...
- CDOJ 1256 二维前缀和处理
昊昊喜欢运动 他NN 天内会参加MM 种运动(每种运动用一个[1,m][1,m] 的整数表示) 舍友有QQ 个问题 问昊昊第ll 天到第rr 天参加了多少种不同的运动 Input 输入两个数NN , ...
- Mysql 取整的方法
.CEIL() 向上取整 SELECT CEIL(/); .FLOOR() 向下取整 SELECT FLOOR( .ROUND() 四舍五入 SELECT ROUND(
- [AGC016B] Colorful Hats (结论)
Description 有n个人,每个人都戴着一顶帽子.当然,帽子有不同的颜色. 现在,每个人都告诉你,他看到的所有其他人的帽子共有多少种颜色,请问你有没有符合所有人的描述的情况. Input 第一行 ...