require.js中的define函数详解
前⾔
模块不同于传统的脚本⽂件,它良好地定义了⼀个作⽤域来避免全局名称空间污染。它可以显式地列出其依赖关系,并以函数(定义此模块的那个函数)参数的形式将这些依赖进⾏注⼊,⽽⽆需引⽤全局变量。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',
sort函数 js'modules/meet/modules',
'modules/meet/services/Meet',
'modules/meet/services/MeetRemoteService'
],function(require) {
'use strict';
var module = dule('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 = dule('meet.services');
module.factory('MeetService', function(Meet, MeetRemoteService) {
var service = {};
(weekFlag, date).then(function(data) {
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,然后执
⾏contexpleteLoad(node.id) ,其内部就很清楚了,把define中注册的name和这⾥得到的name进⾏⽐较如果相等就执⾏。所以道理就是:require 和 define 的 name 必须保证⼀致!
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论