第二次聊一聊JS require.js模块化工具的基础知识


Posted in Javascript onApril 17, 2016

前一篇:JS模块化工具我们以非常简单的方式引入了requirejs:https://3water.com/article/82527.htm,这一篇将讲述一下requirejs中的一些基本知识,包括API使用方式等

基本API

require会定义三个变量:define,require,requirejs,其中require === requirejs,一般使用require更简短

define 从名字就可以看出这个api是用来定义一个模块
require 加载依赖模块,并执行加载完后的回调函数
前一篇中的a.js:

define(function(){
  function fun1(){
   alert("it works");
  }
  fun1();
})

 通过define函数定义了一个模块,然后再页面中使用:

require(["js/a"]);
来加载该模块(注意require中的依赖是一个数组,即使只有一个依赖,你也必须使用数组来定义),requir API的第二个参数是callback,一个function,是用来处理加载完毕后的逻辑,如:

require(["js/a"],function(){
  alert("load finished");
})

加载文件

之前的例子中加载模块都是本地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,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

在使用requirejs时,加载模块时不用写.js后缀的,当然也是不能写后缀
上面例子中的callback函数中发现有$参数,这个就是依赖的jquery模块的输出变量,如果你依赖多个模块,可以依次写入多个参数来使用:

require(["jquery","underscore"],function($, _){
  $(function(){
    _.each([1,2,3],alert);
  })
})

如果某个模块不输出变量值,则没有,所以尽量将输出的模块写在前面,防止位置错乱引发误解

全局配置

上面的例子中重复出现了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.config({
  baseUrl : "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([1,2,3], alert);
})

插件形式的非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({...});
  })
})

好了,requirejs的基本配置大致就是这么多,还有一些扩展的功能会在之后的篇幅中提到,大家不要错过呀!

Javascript 相关文章推荐
Javascript 构造函数 实例分析
Nov 26 Javascript
扩展easyui.datagrid,添加数据loading遮罩效果代码
Nov 02 Javascript
JS跨域总结
Aug 30 Javascript
jQuery计算textarea中文字数(剩余个数)的小程序
Nov 28 Javascript
jQuery实现带有洗牌效果的动画分页实例
Aug 31 Javascript
BOM系列第三篇之定时器应用(时钟、倒计时、秒表和闹钟)
Aug 17 Javascript
js 提交form表单和设置form表单请求路径的实现方法
Oct 25 Javascript
JS路由跳转的简单实现代码
Sep 21 Javascript
Node.js微信 access_token ( jsapi_ticket ) 存取与刷新的示例
Sep 30 Javascript
React根据宽度自适应高度的示例代码
Oct 11 Javascript
vue实现lodop打印功能的示例
Nov 11 Javascript
详解阿里Node.js技术文档之process模块学习指南
Jan 04 Javascript
第一次接触JS require.js模块化工具
Apr 17 #Javascript
jqGrid 学习笔记整理——进阶篇(一 )
Apr 17 #Javascript
JS组件Bootstrap dropdown组件扩展hover事件
Apr 17 #Javascript
理解javascript对象继承
Apr 17 #Javascript
node.js连接mongoDB数据库 快速搭建自己的web服务
Apr 17 #Javascript
js如何准确获取当前页面url网址信息
Sep 13 #Javascript
基于javascript实现图片切换效果
Apr 17 #Javascript
You might like
第四节 构造函数和析构函数 [4]
2006/10/09 PHP
php 向访客和爬虫显示不同的内容
2009/11/09 PHP
用php制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
2015/12/24 PHP
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
js中一个函数获取另一个函数返回值问题探讨
2013/11/21 Javascript
node.js中的fs.lchownSync方法使用说明
2014/12/16 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
JS常用字符串方法(推荐)
2021/01/15 Javascript
jQuery实现隔行变色的方法分析(对比原生JS)
2016/11/18 Javascript
jQuery插件echarts设置折线图中折线线条颜色和折线点颜色的方法
2017/03/03 Javascript
react 父组件与子组件之间的值传递的方法
2017/09/14 Javascript
JS实现的JSON数组去重算法示例
2018/04/11 Javascript
详解webpack打包nodejs项目(前端代码)
2018/09/19 NodeJs
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
Python实现模拟时钟代码推荐
2015/11/08 Python
python机器人运动范围问题的解答
2019/04/29 Python
Pycharm使用之设置代码字体大小和颜色主题的教程
2019/07/12 Python
Pytorch卷积层手动初始化权值的实例
2019/08/17 Python
Python计算两个矩形重合面积代码实例
2019/09/16 Python
python实现超级马里奥
2020/03/18 Python
python和node.js生成当前时间戳的示例
2020/09/29 Python
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
Jacadi Paris美国官方网站:法国童装品牌
2017/10/15 全球购物
校园十大歌手策划书
2014/02/01 职场文书
小学生元旦广播稿
2014/02/21 职场文书
大学生找工作求职信
2014/07/09 职场文书
委托证明书
2014/09/17 职场文书
党的群众路线教育实践活动对照检查材料(教师)
2014/09/24 职场文书
理解深度学习之深度学习简介
2021/04/14 Python
详解php中流行的rpc框架
2021/05/29 PHP
浅析Redis Sentinel 与 Redis Cluster
2021/06/24 Redis
GoFrame gredis缓存DoVar Conn连接对象 自动序列化GoFrame gredisDo/DoVar方法Conn连接对象自动序列化/反序列化总结
2022/06/14 Golang