require.js中的define函数详解


Posted in Javascript onJuly 10, 2017

前言

模块不同于传统的脚本文件,它良好地定义了一个作用域来避免全局名称空间污染。它可以显式地列出其依赖关系,并以函数(定义此模块的那个函数)参数的形式将这些依赖进行注入,而无需引用全局变量。RequireJS的模块是模块模式的一个扩展,其好处是无需全局地引用其他模块。 RequireJS的模块语法允许它尽快地加载多个模块,虽然加载的顺序不定,但依赖的顺序最终是正确的。同时因为无需创建全局变量,甚至可以做到在同一个页面上同时加载同一模块的不同版本。

在定义一个模块的时候,方法的第一行写一个“use strict”;这是干什么的?

use strict --严格模式,这种模式使得Javascript在更严格的条件下运行。

  • 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
  • 消除代码运行的一些不安全之处,保证代码运行的安全;
  • 提高编译器效率,增加运行速度;
  • 为未来新版本的Javascript做好铺垫。

1. 简单的值对模块

其实就是把文件名称作为name参数传入,若依赖该组件那么返回的就是一个对象!

define({
 name: "hehe",
 age: "18"
});

2. 简单的函数模块

和上面一样文件名称作为默认的name,与上面的差异是,可以提前执行返回值外的代码

define(function() {
 return {
 name: "hehe",
 age: "18"
 };
});

3. 依赖函数模块

define([
 'angular',
 'jsUtil',
 'modules/meet/modules',
 'modules/meet/services/Meet',
 'modules/meet/services/MeetRemoteService'
],function(require) {
 'use strict';

 var module = angular.module('meet.services');

 module.factory('MeetService', function(Meet, MeetRemoteService) {
 var service = {
  name: 'hehe',
  age: '18'
 };
 return service;
 });
});

和上面一样,关键是依赖模块是以返回值作为入参的形式传入,如果加载错误或者没有找到对应的模块,那么得到的入参是Undefiend,需要注意!

4. 返回函数模块

define([
 'angular',
 'jsUtil',
 'modules/meet/modules',
 'modules/meet/services/Meet',
 'modules/meet/services/MeetRemoteService'
],function(require) {
 'use strict';

 var module = angular.module('meet.services');

 module.factory('MeetService', function(Meet, MeetRemoteService) {
 var service = {};
 service.getWeekOfMeet = function(weekFlag, date) {

  return MeetRemoteService.get(weekFlag, date).then(function(data) {
  data.content = Meet.sortMeet(data.content);
  return data;
  });
 }
 return service;
 });
});

和上面一样,这里返回的是函数,在依赖模块中把他作为函数对象调用即可,其实这是一个简单的闭包!

5. 完整定义

define('sample3' ,['sample','sample1'],function (sample,sample1) {
 var sample4 = require('sample4');
 return function(){
 alert(sample.name+':'+sample.sayhell());
 } 
});

这就是完整定义,有名称,有依赖,有回调,内部还有common的形式引入依赖对象!

关于define函数的name和require函数的依赖名称之间的关系

define(name,[] , callback); 这个name可以省掉,默认是文件名称;当然也可以自定义,一旦我们定义了name,根据源代码我们可以发现define函数内部其实就是把这个name以及依赖模块、回调函数作为一个对象存储在全局的数组当中,也就是 defQueue.push([name,deps,callback]);那么这个name就是这个组件注册的的ID!

require([name , name2],callback); 系统首先会在全文检索path中是否对应的路径,如果没有自然把他作为路径拼接在baseUrl上去异步加载这个js文件,加载时从源代码中可以看到 ,var data = getScriptData(evt);返回的 data.id 其实就是name,然后执行contex.completeLoad(node.id) ,其内部就很清楚了,把define中注册的name和这里得到的name进行比较如果相等就执行。所以道理就是:require 和 define 的 name 必须保证一致!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
IE6与IE7中,innerHTML获取param的区别
Mar 15 Javascript
jQuery 图片切换插件(代码比较少)
May 07 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
Jan 09 Javascript
JavaScript中判断函数、变量是否存在
Jun 10 Javascript
详细解读JavaScript的跨浏览器事件处理
Aug 12 Javascript
vuejs动态组件给子组件传递数据的方法详解
Sep 09 Javascript
IE8兼容Jquery.validate.js的问题
Dec 01 Javascript
JS碰撞运动实现方法详解
Dec 15 Javascript
Node.js开发第三方微信公众平台
Jun 05 Javascript
mpvue微信小程序开发之实现一个弹幕评论
Nov 24 Javascript
JS内置对象和Math对象知识点详解
Apr 03 Javascript
JavaScript实现消消乐的源代码
Jan 12 Javascript
vue.js组件之间传递数据的方法
Jul 10 #Javascript
Node.js+Express+MySql实现用户登录注册功能
Jul 10 #Javascript
基于jQuery Easyui实现登陆框界面
Jul 10 #jQuery
Angular X中使用ngrx的方法详解(附源码)
Jul 10 #Javascript
angular实现spa单页面应用实例
Jul 10 #Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
Jul 10 #Javascript
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
Jul 10 #Javascript
You might like
PHP邮件专题
2006/10/09 PHP
在Windows版的PHP中使用ADO
2006/10/09 PHP
解析php中的fopen()函数用打开文件模式说明
2013/06/20 PHP
php实现两表合并成新表并且有序排列的方法
2014/12/05 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
2016/05/28 PHP
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
2018/09/07 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
js几个不错的函数 $$()
2006/10/09 Javascript
jQuery插件 tabBox实现代码
2010/02/09 Javascript
JQuery的$命名冲突详细解析
2013/12/28 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
基于React.js实现原生js拖拽效果引发的思考
2016/03/30 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
解决layui弹出层layer的area过大被遮挡的问题
2019/09/21 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
2020/04/22 Javascript
[16:56]heroes英雄教学 司夜刺客
2014/09/18 DOTA
[01:07:11]Secret vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python Django模板的使用方法(图文)
2013/11/04 Python
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
发布你的Python模块详解
2016/09/15 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
python+selenium开发环境搭建图文教程
2017/08/11 Python
Python遍历numpy数组的实例
2018/04/04 Python
使用python画个小猪佩奇的示例代码
2018/06/06 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
python构建指数平滑预测模型示例
2019/11/21 Python
Python如何给函数库增加日志功能
2020/08/04 Python
前端实现背景虚化但内容清晰且自适应 的实例代码
2019/08/01 HTML / CSS
美国领先的商务贺卡出版商:The Gallery Collection
2018/02/13 全球购物
学院书画协会部门职责
2013/11/28 职场文书
文明青少年标兵事迹材料
2014/01/28 职场文书
行政监察建议书
2014/05/19 职场文书
2014领导班子四风剖析对照检查材料思想汇报
2014/09/20 职场文书
安全教育片观后感
2015/06/17 职场文书
Idea连接MySQL数据库出现中文乱码的问题
2021/04/14 MySQL