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 相关文章推荐
javascript 多级checkbox选择效果
Aug 20 Javascript
JScript 脚本实现文件下载 一般用于下载木马
Oct 29 Javascript
JS DOM 操作实现代码
Aug 01 Javascript
JS正则表达式验证数字代码
Jan 28 Javascript
首页图片漂浮效果示例代码
Jun 05 Javascript
Bootstrap每天必学之前端开发框架
Nov 19 Javascript
七个不允许错过的jQuery小技巧
Dec 21 Javascript
JS实现瀑布流布局
Oct 21 Javascript
解决vue页面刷新或者后退参数丢失的问题
Mar 13 Javascript
解决angularjs service中依赖注入$scope报错的问题
Oct 02 Javascript
vue项目前端知识点整理【收藏】
May 13 Javascript
jQuery实现简单评论功能
Aug 19 jQuery
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中的MVC模式运用技巧
2007/05/03 PHP
DW中链接mysql数据库时,建立字符集中文出现乱码的解决方法
2010/03/27 PHP
使用PHP生成PDF方法详解
2015/01/23 PHP
PHP常用工具类大全附全部代码下载
2015/12/07 PHP
PHP后台微信支付和支付宝支付开发
2017/04/28 PHP
popdiv
2006/07/14 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
javascript 保存文件到本地实现方法
2012/11/29 Javascript
全面详细的jQuery常见开发技巧手册
2016/02/21 Javascript
Boostrap入门准备之border box
2016/05/09 Javascript
如何给ss bash 写一个 WEB 端查看流量的页面
2017/03/23 Javascript
使用Vue.js开发微信小程序开源框架mpvue解析
2018/03/20 Javascript
vue自定v-model实现表单数据双向绑定问题
2018/09/03 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
JavaScript实现简易计算器小功能
2020/10/22 Javascript
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
Python的GUI框架PySide的安装配置教程
2016/02/16 Python
python相似模块用例
2016/03/04 Python
使用Python编写基于DHT协议的BT资源爬虫
2016/03/19 Python
Python及PyCharm下载与安装教程
2017/11/18 Python
Python二叉树的定义及常用遍历算法分析
2017/11/24 Python
python实现NB-IoT模块远程控制
2018/06/20 Python
使用Py2Exe for Python3创建自己的exe程序示例
2018/10/31 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
python3.8下载及安装步骤详解
2020/01/15 Python
Python读取表格类型文件代码实例
2020/02/17 Python
详解用Python爬虫获取百度企业信用中企业基本信息
2020/07/02 Python
CSS3使用多列制作瀑布流
2016/05/10 HTML / CSS
CSS3实现酷炫的3D旋转透视效果
2019/11/21 HTML / CSS
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
MIS软件工程师的面试题
2016/04/22 面试题
化验室技术员岗位职责
2013/12/24 职场文书
总经理秘书的岗位职责
2013/12/27 职场文书
校园元旦活动总结
2014/07/09 职场文书
2016年精神文明建设先进个人事迹材料
2016/02/29 职场文书
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记