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 相关文章推荐
判断用户是否在线的代码
Mar 05 Javascript
原来Jquery.load的方法可以一直load下去
Mar 28 Javascript
js history对象简单实现返回和前进
Oct 30 Javascript
Javascript中的String对象详谈
Mar 03 Javascript
jquery简单实现图片切换效果的方法
May 12 Javascript
简单谈谈javascript中this的隐式绑定
Feb 22 Javascript
Webpack常见静态资源处理-模块加载器(Loaders)+ExtractTextPlugin插件
Jun 29 Javascript
最通俗易懂的javascript变量提升详解
Aug 05 Javascript
Vue中的无限加载vue-infinite-loading的方法
Apr 08 Javascript
angular ng-model 无法获取值的处理方法
Oct 02 Javascript
vue cli安装使用less的教程详解
Jul 12 Javascript
微信小程序实现限制用户转发功能的实例代码
Feb 22 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程序员你要知道的另外一种日志
2018/07/30 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
js为什么不能正确处理小数运算?
2015/12/29 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
2016/08/25 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
2016/12/27 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
Vue.js实现文章评论和回复评论功能
2020/05/30 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
基于Python 的进程管理工具supervisor使用指南
2016/09/18 Python
再谈Python中的字符串与字符编码(推荐)
2016/12/14 Python
在python中bool函数的取值方法
2018/11/01 Python
在python中使用requests 模拟浏览器发送请求数据的方法
2018/12/26 Python
Python实现微信消息防撤回功能的实例代码
2019/04/29 Python
python实现银联支付和支付宝支付接入
2019/05/07 Python
详解python中__name__的意义以及作用
2019/08/07 Python
Python使用matplotlib绘制三维参数曲线操作示例
2019/09/10 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
2020/02/13 Python
python对文件的操作方法汇总
2020/02/28 Python
python实现梯度下降和逻辑回归
2020/03/24 Python
Python爬虫开发与项目实战
2020/12/16 Python
python 使用OpenCV进行简单的人像分割与合成
2021/02/02 Python
Kipling凯浦林美国官网:世界著名时尚休闲包袋品牌
2016/08/24 全球购物
手机业务员岗位职责
2013/12/13 职场文书
大学生职业生涯规划范文
2014/01/08 职场文书
《蜗牛》教学反思
2014/02/18 职场文书
小小商店教学反思
2014/04/27 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
优秀教育工作者事迹材料
2014/12/24 职场文书
教师节老师寄语
2015/05/28 职场文书
团干部培训班心得体会
2016/01/06 职场文书
CSS3点击按钮圆形进度打钩效果的实现代码
2021/03/30 HTML / CSS
原生JS封装vue Tab切换效果
2021/04/28 Vue.js
详解非极大值抑制算法之Python实现
2021/06/28 Python