JavaScript中模块化工具require.js
什么是require.js?
RequireJS是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一。它还同时可以和其他的框架协同工作,使用RequireJS必将使您的前端代码质量得以提升。
使用require.js带来的好处
1、防止JavaScript加载阻塞页面渲染(因为它遵循AMD【异步模块加载机制】规范);
2、使用程序调用的方式加载js,防止出现如下丑陋的场景:
<script type="text/javascript" src="a.js"></script>
<script type="text/javascript" src="b.js"></script>
<script type="text/javascript" src="c.js"></script>
<script type="text/javascript" src="d.js"></script>
<script type="text/javascript" src="e.js"></script>
<script type="text/javascript" src="f.js"></script>
<script type="text/javascript" src="g.js"></script>
<script type="text/javascript" src="h.js"></script>
<script type="text/javascript" src="i.js"></script>
<script type="text/javascript" src="j.js"></script>
开始使用require.js
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<p>AMD test</p>
<script type="text/javascript" src="js/require.js" data-main = "./main.js"></script>
</body>
</html> //main.js(和html同个文件夹)
require(['./js/a.js'],function(a){
var date = new Date();
a.printDate(date);
}) //a.js
define(['./a-util.js'],function(aUtil){
var a = {
printDate:function(date){
console.log(aUtil.aGetFormatDate(date));
}
}
return a;
}) //a-util.js
define(['./util.js'],function(util){
var aUtil = {
aGetFormatDate:function(date){
return util.getFormatDate(date,);
}
}
return aUtil;
}) //util.js
define(function(){
var util = {
getFormatDate:function(date,type){
if(type === ){
return "2017-11-09";
}else{
return "2017年11月9日";
}
}
}
return util;
})
require.js中的基本API
require会定义三个变量:
define 用来定义一个模块;
require 加载依赖模块,并执行加载完后的回调函数 。require API的第二个参数是callback,一个function,是用来处理加载完毕后的逻辑,如:
require(["js/a"],function(){
alert("load finished");
})
requirejs,其中require === requirejs,一般使用require更简短。
require.js加载文件
之前的例子中加载模块都是本地js,但是大部分情况下网页需要加载的JS可能来自本地服务器、其他网站或CDN,这样就不能通过这种方式来加载了,我们以加载一个jquery库为例:
require.config({
paths : {
"jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery"]
}
})
require(["jquery","js/a"],function($){
$(function(){
alert("load finished");
})
})
require.config
是用来配置模块加载位置,简单点说就是给模块起一个更短更好记的名字,比如将百度的jquery库地址标记为jquery
,这样在require时只需要写["jquery"]
就可以加载该js,本地的js我们也可以这样配置:
require.config({
paths : {
"jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery"],
"a" : "js/a"
}
})
require(["jquery","a"],function($){
$(function(){
alert("load finished");
})
})
通过paths的配置会使我们的模块名字更精炼,paths还有一个重要的功能,就是可以配置多个路径,如果远程cdn库没有加载成功,可以加载本地的库,如:
require.config({
paths : {
"jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery", "js/jquery"],
"a" : "js/a"
}
})
require(["jquery","a"],function($){
$(function(){
alert("load finished");
})
})
这样配置后,当百度的jquery没有加载成功后,会加载本地js目录下的jquery
使用require.js注意事项
1、在使用requirejs时,加载模块时不用写.js
后缀的,当然也是不能写后缀;
2、上面例子中的callback函数中发现有$
参数,这个就是依赖的jquery
模块的输出变量,如果你依赖多个模块,可以依次写入多个参数来使用:
require(["jquery","underscore"],function($, _){
$(function(){
_.each([,,],alert);
})
})
3、如果某个模块不输出变量值,则没有,所以尽量将输出的模块写在前面,防止位置错乱引发误解。
require.js全局配置
上面的例子中重复出现了require.config
配置,如果每个页面中都加入配置,必然显得十分不雅,requirejs提供了一种叫"主数据"的功能,我们首先创建一个main.js:
require.config({
paths : {
"jquery" : ["http://libs.baidu.com/jquery/2.0.3/jquery", "js/jquery"],
"a" : "js/a"
}
})
然后在页面中使用下面的方式来使用requirejs:
<script data-main="js/main" src="js/require.js"></script>
加载requirejs脚本的script标签加入了data-main
属性,这个属性指定的js将在加载完reuqire.js后处理,我们把require.config
的配置加入到data-main
后,就可以使每一个页面都使用这个配置,然后页面中就可以直接使用require
来加载所有的模块名。
data-main
还有一个重要的功能,当script标签指定data-main属性时,require会默认的将data-main指定的js为根路径,是什么意思呢?如上面的data-main="js/main"
设定后,我们在使用require(['jquery'])
后(不配置jquery的paths),require会自动加载js/jquery.js这个文件,而不是jquery.js,相当于默认配置了。
require.js第三方模块
通过require
加载的模块一般都需要符合AMD规范即使用define
来申明模块,但是部分时候需要加载非AMD规范的js,这时候就需要用到另一个功能:shim,shim解释起来也比较难理解,shim直接翻译为"垫",其实也是有这层意思的,目前主要用在以下两个地方。
1. 非AMD模块输出,将非标准的AMD模块"垫"成可用的模块,例如:在老版本的jquery中,是没有继承AMD规范的,所以不能直接require["jquery"],这时候就需要shim,比如我要是用underscore类库,但是他并没有实现AMD规范,那我们可以这样配置:
require.config({
shim: {
"underscore" : {
exports : "_";
}
}
})
这样配置后,我们就可以在其他模块中引用underscore模块:
require(["underscore"], function(_){
_.each([,,], alert);
})
2.插件形式的非AMD模块,我们经常会用到jquery插件,而且这些插件基本都不符合AMD规范,比如jquery.form插件,这时候就需要将form插件"垫"到jquery中:
require.config({
shim: {
"underscore" : {
exports : "_";
},
"jquery.form" : {
deps : ["jquery"]
}
}
})
也可以简写为:
require.config({
shim: {
"underscore" : {
exports : "_";
},
"jquery.form" : ["jquery"]
}
})
这样配置之后我们就可以使用加载插件后的jquery了
require.config(["jquery", "jquery.form"], function($){
$(function(){
$("#form").ajaxSubmit({...});
})
})
JavaScript中模块化工具require.js的更多相关文章
- Javascript模块化工具require.js教程
转自:http://www.w3cschool.cc/w3cnote/requirejs-tutorial-1.html, http://www.w3cschool.cc/w3cnote/requir ...
- JS模块化工具require.js教程(二):基本知识
前一篇:JS模块化工具我们以非常简单的方式引入了requirejs,这一篇将讲述一下requirejs中的一些基本知识,包括API使用方式等 基本API require会定义三个变量:define,r ...
- JS模块化工具require.js教程(一):初识require.js
随着网站功能逐渐丰富,网页中的js也变得越来越复杂和臃肿,原有通过script标签来导入一个个的js文件这种方式已经不能满足现在互联网开发模式,我们需要团队协作.模块复用.单元测试等等一系列复杂的需求 ...
- 坑人的 Javascript 模块化编程 require.js
坑人的 Javascript 模块化编程 require.js
- JavaScript中解析JSON --- json.js 、 json2.js 以及 json3.js的使用区别
JSON官方(http://www.json.org/)提供了一个json.js,json.js是JSON官方提供的在JavaScript中解析JSON的js包,json.js.json2.js.js ...
- Javascript模块化编程require.js的用法
JS模块化工具requirejs教程(一):初识requirejs http://www.runoob.com/w3cnote/requirejs-tutorial-1.html JS模块化工具req ...
- JavaScript模块化-require.js,r.js和打包发布
在JavaScript模块化和闭包和JavaScript-Module-Pattern-In-Depth这两篇文章中,提到了模块化的基本思想,但是在实际项目中模块化和项目人员的分工,组建化开发,打包发 ...
- Javascript模块化编程 require.js使用详解
一.为什么用require.js,产生的背景 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载. & ...
- Javascript模块化编程-require.js[3]
很多情况下,JS都是放到一个或者多个文件里,只要加载这些文件就可以了. 但是对于一些小型项目而言,这种写法是没有任何问题的. 但是对于某些大型网站,JS的量是很大的,如果还采用这种方式,网站时常在加载 ...
随机推荐
- Tomcat中查看JVM内存使用情况
TOMCAT运行时,实时监控当前应用JVM的使用情况:可以利用Tomcat自带的应用manager查看详情. 首先,确认服务目录webapps下有manager应用 其次,需要创建角色manager和 ...
- 接上篇—用spring注入DBbean,并使用maven管理
接着上篇的登陆功能,用spring的依赖注入和maven的管理,又实现了一遍.新增了注册功能. 有两个目标:使用spring和使用maven 目录结构 首先是目标1:使用spring的依赖注入,注入b ...
- Python用于http/https接口自动化
本接口自动化框架主要用到的类: 1. unittest:组织测试用例 2. requests:http/https请求 3. HTMLTestRunner:生成测试报告 4. Dingtalkchat ...
- pyinstaller打包工具简单使用
python脚本如果在没有安装python的机器上不能运行,所以将脚本打包成exe文件将可跨平台使用,那么怎么打包了,python提供了专门的模块:pyinstaller,下面就介绍下怎么用 1.安装 ...
- centos7 装机配置及 mysql 安装过程
打开网卡,使操作系统可以上网 1 ip add 查看网卡,lo是回环网卡可以忽略,ens33为实际网卡. [root@localhost ~]# ip add 1: lo: <LOOPBACK, ...
- SpringCloud---服务容错保护---Spring Cloud Hystrix
1.概述 1.1 在分布式架构中,存在着许多的服务单元,若一个单元出现故障,很容易因依赖关系引发故障的蔓延,最终导致整个系统的瘫痪: 为了解决这样的问题,产生了断路器等服务保护机制: 1.2 分布式架 ...
- 源码安装caffe2时遇到的问题解决办法
https://github.com/facebookresearch/DensePose/issues/119
- volatile与synchronized实现原理
参考文章:https://www.cnblogs.com/charlesblc/p/5994162.html --------------------------------------------- ...
- MariaDB10.2修改默认密码
1.修改 my.ini,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2.重启 mysqld 服务 3.使用 roo ...
- FocusBI:SSAS体系结构(原创)
关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. SSAS是微软BI组件系列中最核心的组件,商业智能的心脏所有的数据都从这里统一输出,它能把 ...