对比requirejs更好的理解seajs
seajs遵循CMD规范,requirejs遵循AMD规范。AMD规范是预加载,CMD规范是赖加载。
下文举例假设有文件 b.js, c.js如下
//b.js
define(function(require, exports, module){
console.log('b is loaded') function run(){
console.log('b run');
}
exports.run = run;
}) //c.js
define(function(require, exports, module){
console.log('c is loaded') function run(){
console.log('c run');
}
exports.run = run;
})
1. seajs对依赖模块只加载不执行,requirejs对依赖模块既加载也执行
运行代码:
// seajs
<!DOCTYPE html>
<html>
<head>
<title>seajs</title>
<script type="text/javascript" src="./sea.min.js"></script>
</head>
<body>
<button id="btn">OK</button>
<script type="text/javascript">
seajs.use('./a.js')
</script>
</body>
</html> // requirejs
<!DOCTYPE html>
<html>
<head>
<title>requirejs</title>
<script type="text/javascript" src="./require.js"></script>
</head>
<body>
<button id="btn">OK</button>
<script type="text/javascript">
require(['a'])
</script>
</body>
</html> // a.js
define(['b'], function(){
})
运行结果:
seajs:

控制台无输出
requirejs:

控制台:
2. seajs ,requirejs在 require文件时既加载也执行
//a.js
define(function(require, exports, module){
var b = require('b')
})
requirejs:

控制台:b is loaded
seajs:

控制台:b is loaded
3. seajs可以在任意处直接require文件,无需提前写依赖模块;一旦提前写了任意一个依赖模块,下面的所有require的使用必须保证也有其对应的依赖模块
seajs可以直接如下使用,无需写依赖['b']:
//a.js
define(function(require, exports, module){
var b = require('b')
}) 或
define(['b'], function(require, exports, module){
var b = require('b')
})
运行结果:

控制台:b is loaded
假如 a.js 依赖了另一个 c.js,则在 a.js 中使用 require('b') 时必须也写上依赖['b'],否则b.js将因为查找不到而不会加载
define(['c'], function(require, exports, module){
var b = require('b')
})
运行结果:

控制台无输出(不会输出c is loaded, 因为没有require('c') )
如果此时我们执行b.run()
define(['c'], function(require, exports, module){
var b = require('b')
b.run()
})
控制台将会报错,因为此时b为null:

此时正确写法应该写上依赖 ['b']:
define(['c', 'b'], function(require, exports, module){
var b = require('b')
b.run()
})
运行结果:


结论:
对于seajs,如果不写依赖那就一个都不要写,一旦写了,下面所有require的地方都需要提前在头部写上依赖
但对require.ascnc例外,可以如下写法:
//a.js
define(['c'], function(require, exports, module){
var b = require.async('b');
})
此时c.js, b.js都被加载,只有 b.js 被执行
下一点将会介绍require.async
requirejs的依赖写法如下:
define(['c', 'b'], function(c, b){
var b = require('b')
b.run()
})
或
define(function(require, exports, module){
var b = require('b')
b.run()
})
//错误写法
define(['c'], function(c){
var b = require('b')
b.run()
})
4. seajs的require.async在执行到使用位置的时候才去异步加载
seajs:
如下例:
// a.js
define(function(require, exports, module){
document.getElementById('btn').addEventListener('click', function(){
document.getElementById('btn').innerHTML = 'btn is clicked'
init()
}) function init(){
var b = require('b');
b.run()
}
})
运行结果:

控制台无输出

点击OK按钮, b.js 加载并执行b.js和run方法:

大家注意到,在未点击按钮之前,虽然没有执行init方法,但b.js依然被提前加载了进来,但没有被执行(没有输出b is loaded)。
很多时候我们想在执行init方法的时候再去加载b.js,而不是提前在页面加载的时候就把b,js加载。
这时候就需要用到require.async,如下:
//a.js
define(function(require, exports, module){
document.getElementById('btn').addEventListener('click', function(){
document.getElementById('btn').innerHTML = 'btn is clicked'
init()
}) function init(){
require.async('b', function(b){
b.run()
});
}
})
这时候运行结果:
b.js没有被加载:

控制台无输出:

点击OK按钮:
b.js被加载

控制台输出:

这是因为当执行一个js时,seajs会先去查找匹配require,然后加载相应资源,但不执行。匹配到require.async时不加载。
所以,require.async达到了用到时再去异步加载并执行的目的。
小问题:
如果是requirejs执行下面代码:
//a.js
define(function(require, exports, module){
document.getElementById('btn').addEventListener('click', function(){
document.getElementById('btn').innerHTML = 'btn is clicked'
init()
}) function init(){
var b = require('b');
b.run()
}
})
资源如何加载?控制台又会输出什么呢?点击ok按钮又会输出啥?
答:资源加载了a.js, b.js, 控制台输出:b is loaded, 点击OK按钮控制台继续输出:b run
(选择“答”后面的部分查看答案)
总结: 1. seajs对依赖模块只加载不执行,requirejs对依赖模块加载并执行 2. seajs ,requirejs在 require具体文件时既加载也执行 3. seajs可以在任意处直接require文件,无需提前写依赖模块;一旦提前写了任意一个依赖模块,下面的所有require的使用必须保证也有其对应的依赖模块 4. seajs的require.async在执行到使用位置的时候才去异步加载
本文demo:
https://github.com/saysmy/seajs-requirejs-demo
对比requirejs更好的理解seajs的更多相关文章
- seaJS 简单例子,理解seaJS
学习心得: 记得第一次学underscore的时候,去的官网(不管什么都是官网好),呼啦一长列语法,我就一个个看,看完也不知道underscore是做什么的.就是现在underscore我也用不上,学 ...
- 通过Ruby On Rails 框架来更好的理解MVC框架
通过Ruby On Rails 框架来更好的理解MVC框架 1.背景 因为我在学习软件工程课程的时候,对于 MVC 框架理解不太深入,只是在理论层面上掌握,但是不知道如何在开发中使用 MVC ...
- dimensionality reduction动机---visualization(将数据可视化帮助我们更好地理解数据)
如果我们能更好地理解我们的数据,这样会对我们开发高效的机器学习算法有作用,将数据可视化(将数据画出来能更好地理解数据)出来将会对我们理解我们的数据起到很大的帮助. 高维数据如何进行显示 GDP: gr ...
- 嗯 第二道线段树题目 对左右节点和下标有了更深的理解 hdu1556
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 帮助你更好的理解Spring循环依赖
网上关于Spring循环依赖的博客太多了,有很多都分析的很深入,写的很用心,甚至还画了时序图.流程图帮助读者理解,我看了后,感觉自己是懂了,但是闭上眼睛,总觉得还没有完全理解,总觉得还有一两个坎过不去 ...
- 技术干货 | 基于MindSpore更好的理解Focal Loss
[本期推荐专题]物联网从业人员必读:华为云专家为你详细解读LiteOS各模块开发及其实现原理. 摘要:Focal Loss的两个性质算是核心,其实就是用一个合适的函数去度量难分类和易分类样本对总的损失 ...
- jquery, jquery-ui, requirejs, bootstrap 的关系理解
jquery 是 基于 javascript 的一个语法衍生,更方便操作dom, 事件,css 整体来说更好用,更简洁. jquery-ui 是基于 jquery 实现的各种更好看,交互更友好的的界面 ...
- Redux/Mobx/Akita/Vuex对比 - 选择更适合低代码场景的状态管理方案
近期准备开发一个数据分析 SDK,定位是作为数据中台向外输出数据分析能力的载体,前端的功能表现类似低代码平台的各种拖拉拽.作为中台能力的载体,SDK 未来很大概率会需要支持多种视图层框架,比如Vue2 ...
- 【转】七个例子帮你更好地理解 CPU 缓存
我的大多数读者都知道缓存是一种快速.小型.存储最近已访问的内存的地方.这个描述相当准确,但是深入处理器缓存如何工作的"枯燥"细节,会对尝试理解程序性能有很大帮助. 在这篇博文中,我 ...
随机推荐
- JSP向后台传递参数的四种方式
Jsp页面传值的方法 一.通过Form表单提交传值 客户端通过Form表单提交到服务器端,服务器端通过 Java代码 request.getParameter(String xx); 来取得参数(xx ...
- jquery插件封装
HTML <!DOCTYPE html> <html> <head> <title></title> <style> .page ...
- 页面json 格式化+颜色高亮
背景 应答为json,为了更好的展示在前端页面,需要对其格式化加颜色高亮 效果图 步骤 js中添加 function output(inp) { document.body.appendChild(d ...
- 人生苦短 我用Python 第二周的第一天 (数据类型)
数字: 整形 int 长整形(Python3里面把整形.长整形和到一起啦) 浮点型( float) 1.3 5.2 等等 科学技术发表示 1.3e-3=0.0013 e的代表10. bin是二 ...
- Android笔记: 实现手机震动效果
1.震动是系统的服务,首先需添加震动权限 <uses-permission android:name="android.permission.VIBRATE" /> 2 ...
- 使用Coding.net+Hexo+node.js+git来搭建个人博客
使用Coding.net来搭建基于Hexo的博客 一.准备工作 什么是Coding.net Coding可以说,就是国产的Github,但是,有一个功能使它似乎超越了GitHub-那就是 Web ID ...
- MySQL DNS反查导致连接缓慢
场景 机器A上的一个模块连接机器B上的MySQL,在实验室网络环境下正常:同样A.B两台机器,网络环境切换为与外界隔离的一个小型局域网环境,A上的模块与B上MySQL建立连接非常慢. 环境 SuS ...
- Jmeter遇到的坑
一.分布式获取不到结果需要改配置文件 在jmeter.properties文件找到mode=Standard去掉# 二.有一个请求要循环查询进度,当进度为100为,跳出循环.这个要怎么操作? ${ ...
- vue echarts 遇到的bug之一 无法渲染的问题
图表示这样的 页面上有很多个图表,由于没有查询按钮,就只是点击发送ajax数据,所以把所有图表的方法放在updated中, 功能是实现了没问题,但是加载页面的时候会发送很多的ajax请求,而且点击修改 ...
- Info模式下的隐形杀手(SpringMVC同时使用<mvc:resources.../>和FormattingConversionServiceFactoryBean时出现的问题)
天气一天比一天变的凉快了,而我一天天踩的坑更加贱了,首先在北京向各位问好,也给身边献身教育事业的亲朋好友们补上一句节日快乐! 今天早上手贱把项目误删了,不得不去SVN上去乞求了.我个人习惯项目运行的时 ...