源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

require.js中的define函数详解

  • 时间:2021-03-31 07:24 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:require.js中的define函数详解
[b]前言[/b] 模块不同于传统的脚本文件,它良好地定义了一个作用域来避免全局名称空间污染。它可以显式地列出其依赖关系,并以函数(定义此模块的那个函数)参数的形式将这些依赖进行注入,而无需引用全局变量。RequireJS的模块是模块模式的一个扩展,其好处是无需全局地引用其他模块。 RequireJS的模块语法允许它尽快地加载多个模块,虽然加载的顺序不定,但依赖的顺序最终是正确的。同时因为无需创建全局变量,甚至可以做到在同一个页面上同时加载同一模块的不同版本。 [b]在定义一个模块的时候,方法的第一行写一个“use strict”;这是干什么的?[/b] use strict --严格模式,这种模式使得Javascript在更严格的条件下运行。 [list] [*]消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;[/*] [*]消除代码运行的一些不安全之处,保证代码运行的安全;[/*] [*]提高编译器效率,增加运行速度;[/*] [*]为未来新版本的Javascript做好铺垫。[/*] [/list] [b]1. 简单的值对模块[/b] 其实就是把文件名称作为name参数传入,若依赖该组件那么返回的就是一个对象!
define({
 name: "hehe",
 age: "18"
});
[b]2. 简单的函数模块[/b] 和上面一样文件名称作为默认的name,与上面的差异是,可以提前执行返回值外的代码
define(function() {
 return {
 name: "hehe",
 age: "18"
 };
});
[b]3. 依赖函数模块[/b]
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,需要注意! [b]4. 返回函数模块 [/b]
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;
 });
});
和上面一样,这里返回的是函数,在依赖模块中把他作为函数对象调用即可,其实这是一个简单的闭包! [b]5. 完整定义[/b]
define('sample3' ,['sample','sample1'],function (sample,sample1) {
 var sample4 = require('sample4');
 return function(){
 alert(sample.name+':'+sample.sayhell());
 } 
});
这就是完整定义,有名称,有依赖,有回调,内部还有common的形式引入依赖对象! [b]关于define函数的name和require函数的依赖名称之间的关系[/b] [code]define(name,[] , callback); [/code]这个name可以省掉,默认是文件名称;当然也可以自定义,一旦我们定义了name,根据源代码我们可以发现define函数内部其实就是把这个name以及依赖模块、回调函数作为一个对象存储在全局的数组当中,也就是 [code]defQueue.push([name,deps,callback]);[/code]那么这个name就是这个组件注册的的ID! [code]require([name , name2],callback); [/code]系统首先会在全文检索path中是否对应的路径,如果没有自然把他作为路径拼接在baseUrl上去异步加载这个js文件,加载时从源代码中可以看到 ,[code]var data = getScriptData(evt);[/code]返回的 [code]data.id [/code]其实就是name,然后执行[code]contex.completeLoad(node.id) [/code],其内部就很清楚了,把define中注册的name和这里得到的name进行比较如果相等就执行。[b]所以道理就是:require 和 define 的 name 必须保证一致![/b] [b]总结[/b] 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程素材网的支持。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部