本文用seajs来讲解两种模块加载方式require和require.async的区别,类似java里的import,php里的include。

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>seajs模块加载器</title>
</head>
<body>
seajs采用CMD规范,模块化开发,模块化要解决的问题:命名冲突、文件依赖关系。一个文件就是一个模块。
  <!--<script type="text/javascript" src="scripts/seajs/sea.js" id="seajsnode" data-main="myjs/index"></script>-->
  <script src="scripts/seajs/sea.js" id="seajsnode"></script>
  <script>
    seajs.use("myjs/index");
  </script>
</body>
</html>
//test01.js
define(function(require){
  console.log("这是test01");
  var obj = {
    title:"这是test01"
  }
  return obj;
});
//test02.js
define(function(require){
  console.log("这是test02");
  var obj = {
    title:"这是test02"
  }
  return obj;
});

1、加载方式不同

require方法的加载方式是提前并行加载,并不是同步加载,看似同步,但还会往下执行,它不会因为一个文件而阻塞其他文件的加载。require.async方法的加载方式是异步按需加载,异步回调执行。

//index.js,1、比较加载方式
define(function(require, exports, module){
  if(false) {
    require("myjs/test01"); //加载文件:test01.js和test02.js
  }else{
    require("myjs/test02");
  }
});

/*
define(function(require, exports, module){
  if(false) {
    require.async("myjs/test01"); //加载文件:test02.js
  }else{
    require("myjs/test02");
  }
});
*/

/*
define(function(require, exports, module){
  if(false) {
    require.async("myjs/test01",function(){ //加载文件:test02.js
      require("myjs/test02");
    });
  }
});
*/

2、加载阶段不同

require的文件在代码分析期加载,require. async的文件在代码执行期加载。

3、执行时间不同

require的文件预加载完成但不执行,require. async的文件加载完后立即执行。

//index.js,2,3、比较加载阶段和执行时间
define(function(require, exports, module){
  setTimeout(function(){
    require("myjs/test01");  //页面渲染时就开始加载test01.js,代码执行在2s以后
  },2000);
});  

/*
define(function(require, exports, module){
  setTimeout(function(){
    require.async("myjs/test01",function(obj){
      console.log(obj);
    });  //页面加载完成2s后开始加载test01.js,加载完执行代码,将返回值作为参数,执行回调函数
  },2000);
});
*/

4、是否有回调函数

在seajs里,require没有回调函数,只能通过变量赋值,require.async可以将返回值作为一个参数放到回调函数中使用。

//index.js,4、比较是否有回调函数
define(function(require, exports, module){
  require.async('myjs/test01',function(obj){
    console.log(obj);  //加载并执行index.js,test01.js,输出obj对象
  });
});

/*
define(function(require, exports, module){
  require('myjs/test01',function(obj){
    console.log(obj);  //只加载index.js,不加载test01.js,不执行index.js和test01.js,也不报错
  });
});
*/

/*
define(function(require, exports, module){
  var obj = require('myjs/test01');
  console.log(obj); //加载并执行index.js,test01.js,输出obj对象
});
*/

require和require.async的区别的更多相关文章

  1. [转]require(),include(),require_once()和include_once()区别

    require(),include(),require_once()和include_once()区别 面试中最容易提到的一个PHP的问题,我想和大家共勉一下: require()和include() ...

  2. <script>标签里的defer和async属性 区别(待补充)

    defer与async的区别(表格显示): table th:first-of-type { width: 150px; } table th:nth-of-type(2) { } 区别 defer ...

  3. url,href和src的区别,defer和async的区别

    URL(Uniform Resource Locator):统一资源定位符,互联网上的每个文件都有一个唯一的URL,基本URL包含协议,IP地址,路径和文件名. 重点:herf和src的区别 href ...

  4. require,include,require_once,include_once的区别

    最近面试时被问到,一时间还真没想到太多,仅仅回答了大概的几个,于是回来再确认一下. 以下内容为网络摘抄: ①作用及用法  可以减少代码的重复 include(_once)("文件的路径&qu ...

  5. require include php5中最新区别,百度上好多错的。

    二者报错机制不同,include是warning 继续执行程序,require会报致命错误,中断程序运行. 前者有返回值,后者则没有. 注意了,php5里有一个区别没了,之前说的是require是无条 ...

  6. require/exports 和 import/export 区别

    零.区别 1.require/exports 是 CommonJS 的标准,适用范围如 Node.js 2.import/export 是 ES6 的标准,适用范围如 React 一.间接获取对象 ( ...

  7. require/load/include/extend的区别

    require 一般用于加载一个库,当多次使用require加载一个库时,只有第一次有效,后面的都会加载失败,也就是会返回"false",以为require会追踪文件是否被加载. ...

  8. 【转载】PHP中require(),include(),require_once()和include_once()区别

    关于这方面的知识,这篇文章讲的较全: http://www.jb51.net/article/22467.htm require 的使用方法如 require("MyRequireFile. ...

  9. [Vue]webpack的require与require.context

    1.require 1.1完整路径的require语句: require('tools'); //preset alias tools require('./js/main'); 1.2带表达式的 r ...

随机推荐

  1. Dom选择器--内容文本操作

    一.文本内容操作 内容: <body> <div id="i1"> 学习是我快乐? <a>晚饭吃什么</a> </div> ...

  2. 菜单栏--Dom选择器

    制作一个左侧菜单栏,包含菜单目录和内容 点击菜单栏才会展示内容,否则隐藏内容 二.事例 2.1 菜单栏基本样式 <body> <div style="height: 48p ...

  3. Linux 网络操作

    Linux 基础网路操作  ifconfig eth0 down # 禁用网卡 ifconfig eth0 up # 启用网卡 ifup eth0: # 启用网卡 mii-tool em1 # 查看网 ...

  4. HDU 1501 Zipper 字符串

    题目大意:输入有一个T,表示有T组测试数据,然后输入三个字符串,问第三个字符串能否由第一个和第二个字符串拼接而来,拼接的规则是第一个和第二个字符串在新的字符串中的前后的相对的顺序不能改变,问第三个字符 ...

  5. 第6月第6天 opengles 三角形

    1. http://blog.csdn.net/u010963658/article/details/52691578 2.多张图 https://www.oschina.net/question/2 ...

  6. 洛谷 P1603 斯诺登的密码

    我一开始还没看懂非正规数字的意义,以为那里写的单词不算,蒙了好久,而且这题非常考验仔细程度,一不小心就RE,WA. 嗯,好像讲了些废话,那我们看看思路,我的做法和前面的大佬们有些不同,因为这题只有六个 ...

  7. 联通-长春处,FDD和TDD宏站,数据业务接入时延期望值默认值应为80ms

    有小坑 备注:若已经跑过V5.40.00_Alpha1_Baseline.sql或V5.30.02_Beta_TO_V5.40.00_Alpha1.sql的脚本,再次运行升级脚本修改不成功,需手动在数 ...

  8. Linux Core Dump【转】

    转自:http://www.cnblogs.com/hazir/p/linxu_core_dump.html 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中 ...

  9. LINUX下 USB转串口 【转】

    转自:http://blog.163.com/smilexiao_11015461/blog/static/2122052182012102410399459/ 1.将设备u口插入pc2.输入#lsm ...

  10. 对linux内核中jiffies+Hz表示一秒钟的理解

    jiffies在内核中是一个全局变量,它用来统计系统启动以来系统中产生的总节拍数,这个变量定义在include/linux/jiffies.h中,定义形式如下. unsigned long volat ...