前言: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. ZKEACMS 如何使用组件自定义样式/编辑样式

    前言 如果你还不知道ZKEACMS,不妨先了解一下. ASP.NET MVC 开源建站系统 ZKEACMS 推荐,从此网站“拼”起来 官方地址:http://www.zkea.net/zkeacms ...

  2. Unit Vector Compression

    Recently, I compared a few methods for compressing generic unit vectors. The method used in Cry Engi ...

  3. JAVA程序对MYSQL数据库加锁实验

    什么是脏读,不可重复读,幻读 1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据. 2. 不可重 ...

  4. RHEL因为selinux设置失误,无法重启问题。(centos适用)

    今天做FTP模拟的时候selinux设置出现失误.导致系统无法重新启动.出现如下界面 Failed To Load SELinux policy.freezing .. 网上找了下,解决方法如下: 开 ...

  5. django admin的自定制

    from django.contrib import admin # Register your models here. from .models import * from django.util ...

  6. ACM-ICPC 2018青岛网络赛-H题 Traveling on the Axis

    题目:略(不知道怎么从ZOJ搬题) 地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4054 把这题的每个点分成两种情况 ...

  7. [独家] Adobe Flash 直接复制元件不改变原元件

    正在考网页高级考证,然后会需要做Adobe Flash相关操作.在网上看了下,基本都是错误的.于是,自己研究解决该问题. 首先,你需要更改元件不改变原文件是不可能的. 所以: 1.你需要对原元件所在的 ...

  8. numpy之转置(transpose)和轴对换

    转置(transpose)和轴对换 转置可以对数组进行重置,返回的是源数据的视图(不会进行任何复制操作). 转置有三种方式,transpose方法.T属性以及swapaxes方法. 1 .T,适用于一 ...

  9. nginx高性能WEB服务器系列之一简介及安装

    nginx系列友情链接:nginx高性能WEB服务器系列之一简介及安装https://www.cnblogs.com/maxtgood/p/9597596.htmlnginx高性能WEB服务器系列之二 ...

  10. P4173 残缺的字符串

    题目链接 题意分析 啥 ? ? ? \(FFT\)做字符串匹配 可是就是这样 我们定义匹配函数 我们定义\(A\)是匹配串 \(B\)是被匹配串 我们当前到达\(B\)串的\(x\)位置 \[P(x) ...