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动态方法调用与参数修改的问题
Dec 10 Javascript
JavaScript函数获取事件源的小例子
May 14 Javascript
一个JavaScript防止表单重复提交的实例
Oct 21 Javascript
JQuery自动触发事件的方法
Jun 13 Javascript
javascript简单比较日期大小的方法
Jan 05 Javascript
JavaScript操作表单实例讲解(上)
Jun 20 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
Sep 18 Javascript
javascript的函数劫持浅析
Sep 26 Javascript
详解探索 vuex 2.0 以及使用 vuejs 2.0 + vuex 2.0 构建记事本应用
Jun 16 Javascript
最全的JavaScript开发工具列表 总有一款适合你
Jun 29 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
Aug 16 Javascript
微信小程序实现的五星评价功能示例
Apr 25 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
PHP5新特性: 更加面向对象化的PHP
2006/11/18 PHP
ThinkPHP与PHPExcel冲突解决方法
2011/08/08 PHP
PHP实现通用alert函数的方法
2015/03/11 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
2016/06/13 PHP
PHP实现函数内修改外部变量值的方法示例
2018/12/28 PHP
PHP微信支付结果通知与回调策略分析
2019/01/10 PHP
ThinkPHP 5.x远程命令执行漏洞复现
2019/09/23 PHP
javascript 限制输入和粘贴(IE,firefox测试通过)
2008/11/14 Javascript
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
2008/12/25 Javascript
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
向大师们学习Javascript(视频与PPT)
2009/12/27 Javascript
jquery的index方法实现tab效果
2011/02/16 Javascript
jquery select动态加载选择(兼容各种浏览器)
2013/02/01 Javascript
DWZ刷新dialog解决方法
2013/03/03 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
Javascript学习笔记之 对象篇(四) : for in 循环
2014/06/24 Javascript
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
AngularJS表单验证中级篇(3)
2016/09/28 Javascript
Javascript blur与click冲突解决办法
2017/01/09 Javascript
详解Vue 2.0封装axios笔记
2017/06/22 Javascript
使用express搭建一个简单的查询服务器的方法
2018/02/09 Javascript
angular ng-model 无法获取值的处理方法
2018/10/02 Javascript
js实现倒计时秒杀效果
2020/03/25 Javascript
Python输出\u编码将其转换成中文的实例
2018/12/15 Python
django echarts饼图数据动态加载的实例
2019/08/12 Python
Django之form组件自动校验数据实现
2020/01/14 Python
HTML5 Canvas之测试浏览器是否支持Canvas的方法
2015/01/01 HTML / CSS
Linux内核的同步机制是什么?主要有哪几种内核锁
2013/01/03 面试题
医学生自我评价
2014/01/27 职场文书
授权委托书(公民个人适用)
2014/09/19 职场文书
贪污受贿检讨书范文
2014/11/19 职场文书
军训结束新闻稿
2015/07/17 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书
Elasticsearch 数据类型及管理
2022/04/19 Python
centos环境下nginx高可用集群的搭建指南
2022/07/23 Servers