前言: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. robot中使用evaluate转化数据格式

    如果你使用robot却没有用过evaluate,那你将永远禁锢在框架中. json对象格式入参可以使用字典格式直接传入,但最近有一个接口测试的入参是一个json数组,在传参时总是提示请求参数不合法, ...

  2. $.ajax()所有参数详解

    原文:https://www.cnblogs.com/everest33Tong/p/6159700.html [一]$.ajax()所有参数详解 url: 要求为String类型的参数,(默认为当前 ...

  3. Centos7.6下使用docker方法安装stf

    使用Docker镜像安装 一,在centos上安装Docker 很简单,直接 yum install docker 即可开启docker服务 在centos中开启服务可以使用systemctl sta ...

  4. python之爬虫(三) Urllib库的基本使用

    官方文档地址:https://docs.python.org/3/library/urllib.html 什么是Urllib Urllib是python内置的HTTP请求库包括以下模块urllib.r ...

  5. OCP 052题库全变,最新052考试题及答案整理-第11题

    11.Which three are true about UNDO data? A) It is used to roll back failed transactions. B) It is us ...

  6. Java面试必问

    1. 图灵 1.1 聊聊哈希算法与HashMap 1)一个优秀的哈希算法有什么特点? 快速.不可逆.敏感性.低碰撞性 2)自己写一个Hash算法 取模 3)Java中的Hash算法 HashMap,侧 ...

  7. css3里面的-webkit-transition

    css3里面的-webkit-transition (1)-webkit-transition-timing-function 可以定义动画的变化时间曲线-webkit-transition-timi ...

  8. Ionic2:创建App启动页滑动欢迎界面

    来自:https://my.oschina.net/qinphil/blog/777787 著作权归原创作者所有,如有再转,请自觉标明原创出处,以示尊重! 摘要: 每个有逼格的App在第一次启动时都有 ...

  9. JAVA将秒的总和转换成时分秒的格式

    public static void main(String[] args) { String str = "221"; int seconds = Integer.parseIn ...

  10. 2016级算法第一次练习赛-C.斐波那契进阶

    870 斐波那契进阶 题目链接:https://buaacoding.cn/problem/870/index 思路 通过读题就可以发现这不是一般的求斐波那契数列,所以用数组存下所有的答案是不现实的. ...