前言:Requirejs作为一个ES5环境流行的模块加载器,在很多项目中使用它。而且这个开源库任然在更新,同类产品seajs已经不更新了。

ES6之后引入import 或者使用Commonjs的方式引入模块,在未来方向上将替换Requirejs是必然的。

一个产品是否选用ES6来开发仍然需要面临很多问题。

<1>.ES6还不能为浏览器全部识别,发布之前要编译,调试起来比浏览器上提示复杂得多。

<2>.应用ES6 必然要一定的高水平的开发资源,ES6 ,webpack等构建工具都需要一定的学习曲线。

<3>.老项目基本上很难迁移,那意味着很多组件很可能要重新书写。

所以requirejs任然是开源模块加载器首选。

一.Requirejs帮我们实现那些功能。

1.声明不同js文件之间的依赖

2.可以按需、并行、延时载入js库

3.可以让我们的代码以模块化的方式组织

二.一个简单的Requirejs的产品如何搭建

1.在html中引入Requirejs ,<script data-main="js/app.js" src="js/require.js"></script>

其中data-main中对应的路径是Requirejs配置的主入口, data-main和 src中路径都是相对html的路劲,或者是绝对路径

2.data-main文件内容,比如本例中的js/app.js文件

requirejs.config({
baseUrl:'js/lib',
paths :{
app:'../app'
} }); require(["app/start"], function(app) {
app.hello();
});

2.1 baseUrl为模块(module)的根目录,如果require(依赖) 的模块直接是用文件名作为id的会直接在这个目录寻找同名文件资源

2.2 paths 中的属性可以给不同的路径或者文件别名,如果require(依赖) 的模块使用路径作为id的时候可以 通过别名匹配path中路径,

3.定义模块(module)

requirejs提供了多种定义模块的方式,可以使用/不使用依赖,返回变量,返回对象,函数,可使用CommonJs的方法在export,module中返结果

本例中是定义了一个无依赖的模块

define([], function() {
return {
hello: function() {
alert("hello, world");
}
}
});

还有一种定义了模块id 的定义方式,如:jquery源代码中的,申明过id的不能直接使用path定义其他别名访问

if ( typeof define === "function" && define.amd ) {
define( "jquery", [], function() {
return jQuery;
} );
}

4.shim配置: 将某个依赖中的某个全局变量暴露给requirejs,当作这个模块本身的引用

如官网中例子 ,把backbone.js引入抛出Backbone作为模块名引入,dept中申明它需要的依赖,backbone依赖underscore 和jquery

requirejs.config({
shim: {
'backbone': {
deps: ['underscore', 'jquery'],
exports: 'Backbone'
},
'underscore': {
exports: '_'
}
}
});

对于不依赖于requirejs的库, 除了把js改为require.js的amd方式书写,还能使用shim来抛出全局对象。

/* util.js */
function util(){
  alert("i am util");
}
/** app.js **/
requirejs.config({
baseUrl:'js/lib',
paths :{
app:'../app',
util:'../util'
},
shim:{
util: { exports: 'util' }
}
}); require(["util"], function(util) {
util();
});

暴露多个全局函数


/* util.js */
function util() {
alert("hello, util~");
}
function util2() {
alert("hello, util2~");
}
/** app.js **/

requirejs.config({
baseUrl:'js/lib',
paths :{
app:'../app',
util:'../util'
},
shim:{
util: {
init: function() {
return {
util: util,
util2: util2
}
}
}
}
});

require(["util"], function(util) {
util.util();
util.util2();
});

5.关于打包压缩,requirejs官方提供了一套打包工具r.js 只要配置对应的build.js可以帮助我们自动化构建

具体例子 https://github.com/volojs/create-template

build.js如何配置可以参考 Richard Chen的翻译 http://www.chenliqiang.cn/node/22

官网配置说明http://requirejs.org/docs/optimization.html

5.1 构建js

{
"appDir": "../www", //打包前目录
"mainConfigFile": "../www/app.js", //打包入口文件
"dir": "../www-built", //打包后生成文件
"modules": [ //注意如果要分包,把依赖和主文件分开,需参考modules 第⑶种配置
{
"name": "app" //指定生产文件的文件名
}
]
} 运行命令
node tools/r.js -o tools/build.js
 

5.2构建css文件

需要一个css文件使用@import 包含所有依赖的css文件,

@import "bootstrap.min.css";
@import "font-awesome.min.css";
@import "main.css"; node build/r.js -o cssIn=../www/css/styles.css out=../www-built/css/all.css optimizeCss=standard  
 

如果构建多页面,以及构建多页面使用shim的,请参考官网例子

https://github.com/requirejs/example-multipage

https://github.com/requirejs/example-multipage-shim

主要是配置modules来处理模块加载,分包,给页面和资源文件重命名。

6.关于插件(Plugins) ,Requirejs官方提供了5个插件 domReady  il8n  text  step  order

其中 step  order在新版本中已经不支持了,il8n做国际化的,domReady  勇于引入其他amd加载器。

text.js 可以配置依赖css ,htm等模版文件,支持html或者模版ajax加载,我和我工作过的一家公司用过这个插件,多模块化十分好用,后台系统可以经常让用户清空缓存的可以用

但是用r.js来构建的时候会悲剧,最主要的是css合并的问题,使用这种方式加载css合并后十分不友好的,毕竟css都是颗粒加载经来的,发布新版本css资源文件为了防止缓存经常会使用路径加版本号,或者文件md5改名,

https://github.com/requirejs/requirejs/wiki/Plugins

RequireJs使用快速入门的更多相关文章

  1. RequireJS 快速入门

      说明:本文只提供快速入门内容,方便快速进入实战状态.更高级的配置,请参考官网文档. 当初之所以使用 RequireJS 等工具,是因为想提高js的加载速度,避免不必要的堵塞.但通过一段时间的使用, ...

  2. angularAMD快速入门

    ngularAMD是作者 marcoslin 使用 RequireJS + AngularJS开发的前端mvvm框架,因此你可以使用它快速创建一款Web App.他特别适合快速开发SPA应用,适当的和 ...

  3. Web Api 入门实战 (快速入门+工具使用+不依赖IIS)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...

  4. SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=》提升)

     SignalR快速入门 ~ 仿QQ即时聊天,消息推送,单聊,群聊,多群公聊(基础=>提升,5个Demo贯彻全篇,感兴趣的玩才是真的学) 官方demo:http://www.asp.net/si ...

  5. 前端开发小白必学技能—非关系数据库又像关系数据库的MongoDB快速入门命令(2)

    今天给大家道个歉,没有及时更新MongoDB快速入门的下篇,最近有点小忙,在此向博友们致歉.下面我将简单地说一下mongdb的一些基本命令以及我们日常开发过程中的一些问题.mongodb可以为我们提供 ...

  6. 【第三篇】ASP.NET MVC快速入门之安全策略(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  7. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  8. Mybatis框架 的快速入门

    MyBatis 简介 什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除 了几乎所有的 JDBC 代码和参数的手工设置以及结果 ...

  9. grunt快速入门

    快速入门 Grunt和 Grunt 插件是通过 npm 安装并管理的,npm是 Node.js 的包管理器. Grunt 0.4.x 必须配合Node.js >= 0.8.0版本使用.:奇数版本 ...

随机推荐

  1. 聊聊 JDK 非阻塞队列源码(CAS实现)

    正如上篇文章聊聊 JDK 阻塞队列源码(ReentrantLock实现)所说,队列在我们现实生活中队列随处可见,最经典的就是去银行办理业务,超市买东西排队等.今天楼主要讲的就是JDK中安全队列的另一种 ...

  2. HTML5QQ登录cav demo

    <!DOCTYPE html> <head>    <meta http-equiv="Content-Type" content="tex ...

  3. 1.Javascript简介

    web前端有三层: HTML:从语义的角度,描述页面的结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用户体验) 历史背景介绍 布兰登 艾奇 199 ...

  4. php 中将完整的年月日时分秒的时间转换成 年月日的形式

    strtotime() 函数将任何英文文本的日期或时间描述解析为 Unix 时间戳(自 January 1 1970 00:00:00 GMT 起的秒数), 将完整的时间格式转换成时间撮的形式,再去进 ...

  5. [AIR] 对存储器(Storage Volume)监听

    AIR 2.0及以上提供了对系统的存储器信息访问和监听的API.通过这些API,你不仅可以访问到硬盘文件系统,同时还可以监听通过USB或火线进行连接的移动存储设备,例如移动硬盘和以存储方式连接到计算机 ...

  6. [ActionScript 3.0] 用TextField的方法getCharIndexAtPoint(x:Number, y:Number):int实现文字在固定范围内显示

    有时候我们遇到一行文字过多时必须固定文字的显示范围,但由于中英文所占字节数不一样,所以不能很好的用截取字符的方式去统一显示范围的大小,用TextField的getCharIndexAtPoint(x: ...

  7. CH2401 送礼物(双向dfs)

    CH2401 送礼物 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_- ...

  8. 斐讯K2P配置文件破解笔记

    手上有一个斐讯K2P路由器,刷机前我想把原机带的固件备份出来.搜到恩山A大开启telnet.固件备份的教程,里面提到了配置文件破解的方法,心血来潮试了一下,发现算出的密码不能解密,一直报"b ...

  9. Ubuntu16.04装机后处理

    1.卸载软件 #卸载libreOffice sudo apt remove libreoffice-common #卸载amazon sudo apt remove unity-webapps-com ...

  10. react-router的简单使用

    React Router是一个基于React之上的强大路由库,可以让你向应用中快速的添加视图和数据流,同时保持页面与URL间的同步. 1.安装: npm install --save react-ro ...