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,避免页面失去相应的更多相关文章

  1. React配合Webpack实现代码分割与异步加载

    这是Webpack+React系列配置过程记录的第四篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...

  2. 网页性能优化之异步加载js文件

    一个网页的有很多地方可以进行性能优化,比较常见的一种方式就是异步加载js脚本文件.在谈异步加载之前,先来看看浏览器加载js文件的原理. 浏览器加载 JavaScript 脚本,主要通过<scri ...

  3. HTML5中script的async属性异步加载JS

    HTML5中script的async属性异步加载JS     HTML4.01为script标签定义了5个属性: charset 可选.指定src引入代码的字符集,大多数浏览器忽略该值.defer 可 ...

  4. 异步加载js的三种方法

    js加载时间线 : 它是根据js出生的那一刻开始记录的一系列浏览器按照顺序做的事,形容的就是加载顺序,可以用来优化什么东西,理论基础,背下来. 1.创建Document对象,开始解析web页面.解析H ...

  5. 请给出异步加载js方案

    请给出异步加载js方案,不少于两种 默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很 ...

  6. 异步加载js

    //异步加载js function loadScript(url,callback){ var script = document.createElement("script"); ...

  7. angularLoad(用以异步加载js文件)

    angularLoad(用以异步加载js文件) 使用方法: 1.执行命令 下载 lib npm install angular-load --save 2.index.html引用js <scr ...

  8. phoneGap异步加载JS失败

    现在正在做一个phoneGap项目,安卓平台,有个异步加载JS总是失败,phoneGap也不好调试,一个问题纠结了一下午 最后找了半天,找到了原因,因此写本文记录一下,也顺便帮帮遇到同样问题的人 原因 ...

  9. 异步加载js文件的方法

    # 异步加载js文件 - js的加载默认是同步的,因为js是单线程执行,只能完成一件再执行下一件. - 一些外部引入的js文件可以因为文件太大,在加载资源的过程中会影响dom元素的加载,影响了用户体验 ...

随机推荐

  1. Windows API 学习记录1

    这里面的好多函数不能死记硬背,知道有这个函数就行,等用到了,再回来细看 一.窗口管理函数包括以下几类: 按钮函数(Button) Microsoft提供了对话框和控制来支持应用程序与用户之间的交互通讯 ...

  2. 使用Fiddler对Android应用进行抓包

    1.  打开Fiddler软件,效果图如下: 2. 首先,确保安装 Fiddler 的电脑和你的手机在同一局域网内,因为Fiddler只是一个代理,需要将手机的代理指向 PC 机,不能互相访问是不行的 ...

  3. 【数据结构与算法】Fibonacci Sequence

    学计算机的对 Fibonacci 都并不陌生,在课堂上一讲到递归几乎都会提到 Fibonacci 数列.不久前,我对 Fibonacci 产生了一些兴趣,就在这里把自己的想法给记录下来. 递推公式: ...

  4. MySQL主从复制入门

    1.MySQL主从复制入门 首先,我们看一个图: MySQL 主从复制与读写分离概念及架构分析 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中. 假设,实时的将变化了的日志 ...

  5. [TC_SRM_460]TheCitiesAndRoadsDivOne

    [TC_SRM_460]TheCitiesAndRoadsDivOne 试题描述 John and Brus have become very famous people all over the w ...

  6. SolrCloud在linux上的搭建

    SolrCloud在linux上的搭建 1.环境准备 三台虚拟机的环境准备: 1. 更改主机名 2. 关闭selinux 3. 关闭防火墙 4. 更改主机名与ip地址的映射 5. 时钟同步 6. ss ...

  7. BZOJ3999 [TJOI2015]旅游 【树剖 + 线段树】

    题目 为了提高智商,ZJY准备去往一个新世界去旅游.这个世界的城市布局像一棵树.每两座城市之间只有一条路径可 以互达.每座城市都有一种宝石,有一定的价格.ZJY为了赚取最高利益,她会选择从A城市买入再 ...

  8. CDOJ 1256 二维前缀和处理

    昊昊喜欢运动 他NN 天内会参加MM 种运动(每种运动用一个[1,m][1,m] 的整数表示) 舍友有QQ 个问题 问昊昊第ll 天到第rr 天参加了多少种不同的运动 Input 输入两个数NN , ...

  9. Mysql 取整的方法

    .CEIL() 向上取整 SELECT CEIL(/); .FLOOR() 向下取整 SELECT FLOOR( .ROUND() 四舍五入 SELECT ROUND(

  10. [AGC016B] Colorful Hats (结论)

    Description 有n个人,每个人都戴着一顶帽子.当然,帽子有不同的颜色. 现在,每个人都告诉你,他看到的所有其他人的帽子共有多少种颜色,请问你有没有符合所有人的描述的情况. Input 第一行 ...