本文用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. SSIS系列文章收藏

    http://blog.csdn.net/kk185800961/article/details/12398667 https://wenku.baidu.com/view/d16105abdd338 ...

  2. 第七节 认识SpringMVC中的表单标签

    所谓成熟,就是:你要习惯,任何人的忽冷忽热:也要看淡,任何人的渐行渐远: --胖先生 SpringMVC的表单标签 回顾: JSTL标签 --C标签 FMT标签 自学:JSP如何自定义标签[开源社区当 ...

  3. 在angularJs实现批量删除

    原理:在js中定义一个数组,然后给每个复选框一个点击事件,点击事件的方法参数有两个,一个是事件源$event,一个是id.点击复选框根据事件源判断是否被选中,然后进而是向这个数组增加或者删除id. $ ...

  4. bzoj千题计划201:bzoj1820: [JSOI2010]Express Service 快递服务

    http://www.lydsy.com/JudgeOnline/problem.php?id=1820 很容易想到dp[i][a][b][c] 到第i个收件地点,三个司机分别在a,b,c 收件地点的 ...

  5. dedecms织梦列表页调用TAG标签并带上链接的实现方法

    在需要调用的地方添加如下代码: [field:id runphp='yes'] global $cfg_cmspath; $tags = GetTags(@me); $revalue = ''; $t ...

  6. 【原创】when.js2.7.1源码解析

    现在,用回调处理一些复杂的逻辑,显得代码臃肿,难于阅读,特别是异步,嵌套. 解决这样的问题,可以是之前所说的Backbone.Events的pubsub,或者是今天要说的when.js所实现的prom ...

  7. HDU 2521 反素数 模拟题

    解题报告:水题,直接附上代码,只是觉得这题的作者是不是吃饱了饭撑的,反素数的概念跟这题一点关系都没有. #include<cstdio> int judge1(int k) { ; ;i& ...

  8. Anaconda+django写出第一个web app(八)

    今天来实现网站的登入和登出功能. 首先我们需要在urls.py中添加路径,注意此处的路径和在导航栏中设置的文字路径保持一致: from django.urls import path from . i ...

  9. MongoDB 之 数据类型 最无聊! But 最有用! MongoDB - 3

    MongoDB的新篇章开始啦 - 数据类型 https://www.cnblogs.com/xuzhaocai/p/8048177.html 一.MongoDB 之 丰富多彩的数据类型世界 首先我们要 ...

  10. 【干货】查看windows文件系统中的数据—利用簇号查看文件与恢复文件

    前面我们使用这个软件发现了很多删除掉的数据,今天来看看簇.FAT文件系统中,存在一个簇的链接,我知道了簇1在哪里就可以顺藤摸瓜恢复所有的信息. 这里使用FAT 12为例子,FAT其他万变不离其宗,甚至 ...