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 相关文章推荐
Jquery Ajax学习实例 向页面发出请求,返回XML格式数据
Mar 14 Javascript
JavaScript中的作用域链和闭包
Jun 30 Javascript
js 连接数据库如何操作数据库中的数据
Nov 23 Javascript
js onclick事件传参讲解
Nov 06 Javascript
jquery任意位置浮动固定层插件用法实例
May 29 Javascript
理解Javascript的call、apply
Dec 16 Javascript
jquery判断checkbox是否选中及改变checkbox状态的实现方法
May 26 Javascript
Django+vue跨域问题解决的详细步骤
Jan 20 Javascript
js this 绑定机制深入详解
Apr 30 Javascript
JS闭包原理及其使用场景解析
Dec 03 Javascript
video.js添加自定义组件的方法
Dec 09 Javascript
三种方式清除vue路由跳转router-link的历史记录
Apr 10 Vue.js
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 GD 图像处理组件的常用函数总结
2010/04/28 PHP
yii2中dropDownList实现二级和三级联动写法
2017/04/26 PHP
php readfile()修改文件上传大小设置
2017/08/11 PHP
Aster vs KG BO3 第二场2.18
2021/03/10 DOTA
js滚动条多种样式,推荐
2007/02/05 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
js getElementsByTagName的简写方式
2010/06/27 Javascript
使用js简单实现了tree树菜单
2013/11/20 Javascript
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
2017/03/05 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
使用jQuery实现购物车结算功能
2017/08/15 jQuery
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
js处理包含中文的字符串实例
2017/10/11 Javascript
vue 2.0 购物车小球抛物线的示例代码
2018/02/01 Javascript
微信小程序实现列表下拉刷新上拉加载
2020/07/29 Javascript
微信公众平台 发送模板消息(Java接口开发)
2019/04/17 Javascript
WebGL three.js学习笔记之阴影与实现物体的动画效果
2019/04/25 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
JavaScript实现刮刮乐效果
2020/11/01 Javascript
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
Python 数据处理库 pandas进阶教程
2018/04/21 Python
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
Python  Django 母版和继承解析
2019/08/09 Python
python模块导入的方法
2019/10/24 Python
Python学习笔记之函数的参数和返回值的使用
2019/11/20 Python
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
TCP协议通讯的过程和步骤是什么
2015/10/18 面试题
万里长城导游词
2015/01/30 职场文书
大学生实习推荐信
2015/03/27 职场文书
培训班通知
2015/04/25 职场文书
简爱电影观后感
2015/06/10 职场文书
2016春季幼儿园大班开学寄语
2015/12/03 职场文书
Python函数对象与闭包函数
2022/04/13 Python