RequireJS 和 SeaJS
RequireJS SeaJS
CMD规范
CommonJS的规范: 根据CommonJS规范,一个单独的文件就是一个模块。加载模块使用require方法,该方法读取一个文件并执行,最后返回文件内部的exports对象
SeaJS定义模块方式
在 SeaJS 里,模块只有一种书写格式
define(function(require, exports, module) {
var A = require('a');
A.do();
return function () {};
});
RequireJS定义模块方式
在 RequireJS 里,模块有多种书写格式,推荐的是
define(['dep1', 'dep2'], function (dep1, dep2) {
//Define the module value by returning a value.
dep1.do();
return function () {};
});
现在RequireJS 也提供了CMD的写法
模块的依赖可以像 CommonJS 一样「就近定义」
PS 两者都是以文件做为模块 一个文件一个模块
AMD执行策略
http://imququ.com/post/amd-simplified-commonjs-wrapping.html
AMD 运行时核心思想是「Early Executing」 也就是提前执行依赖 尽早执行
define(['a', 'b'], function(A, B) {
//运行至此,a.js 和 b.js 已下载完成(运行于浏览器的 Loader 必须如此);
//A、B 两个模块已经执行完,直接可用(这是 AMD 的特性);
return function () {};
});
CMD的执行策略
按需执行 CMD 推崇 as lazy as possible.
[只是执行时间晚了 但是加载和RequireJS是一样的]
//main.js
define(function(require, exports, module) {
//运行至此,mod1.js 和 mod2.js 已经下载完成;
console.log('require module: main');
var mod1 = require('./mod1'); //这里才执行 mod1
mod1.hello();
var mod2 = require('./mod2'); //这里才执行 mod2
mod2.hello();
return {
hello: function() {
console.log('hello main');
}
};
});
写法上可能更易读 「就近」书写
SeaJS RequireJS 区别 知乎篇
http://www.zhihu.com/question/20342350
- requirejs:一个模块的factory函数执行是紧跟随在define(也就是Evaluate Script脚本模块文件)之后
- seajs: 执行一个模块的factory函数需要等待所有模块define完毕。
- RequireJS的异步模块加载迎合了浏览器端JS程序员固有的异步思维,学习成本低
- RequireJS和Sea.js在资源加载的时间点都是一样的,所以论“懒”的程度都是一样的。差别仅仅在于加载的脚本什么时候执行。RequireJS的依赖模块在回调函数执行前执行完毕,而Sea.js的依赖模块在回调函数执行require时执行。
- 对于非AMD规范的js插件,require js提供了shim支持,非常方便。RequireJS早有了Shim等支持,不需要修改第三方类库就可以完全支持.如Ember,JQuery等引用,都直接可以异步加载为一个模块.
- requirejs目前支持了sourcemap,配合grunt,简直爽爆了。
SeaJS与RequireJS最大的区别 豆瓣篇
http://www.douban.com/note/283566440/
这篇文章的结论似乎有误 作者最开头也已经注明了
作者一开始认为requeireJS有bug 实际上不是
原因是即使是RequireJS采用了CMD的写法
实际上还是的执行还是不变 也就是预先加载并执行了依赖
关于豆瓣的这个例子 在这篇博文中也有说明
http://imququ.com/post/amd-simplified-commonjs-wrapping.html
结论
RequireJS的做法是并行加载所有依赖的模块, 并完成解析后, 再开始执行其他代码, 因此执行结果只会"停顿"1次, 完成整个过程是会比SeaJS要快.
而SeaJS一样是并行加载所有依赖的模块, 但不会立即执行模块, 等到真正需要(require)的时候才开始解析(也就是执行),
评论
AMD
我个人感觉requirejs更科学,所有依赖的模块要先执行好。被依赖的模块必须先于当前模块执行,而没有依赖关系的模块,可以没有先后。
AMD规范了"依赖提前加载提前执行"的根本
合并
RequireJS 有 r.js SeaJS 有spm 来合并
为什么不直接用grunt的concat呢 因为这两者有个要求就是一个模块对应一个文件
Browserify
Browserify 是一个基于 Node 模块化方案的浏览器端版本
browserify查找语法树种global域下的require和module变量,对其调用进行变形替换。这是静态分析,像module[‘exp‘+’ort’] = {} , require('path'+'to'+‘file')目前还无法被正确替换。
Browserify的出现,不仅仅是让NPM(或者说之前适用于Node.js)上的代码可以给浏览器端使用。更重要的意义,是Browserify代码组织更符合CommonJS规范,让浏览器前端代码也可以通过预编译实现CommonJS规范
SeaJS和Browserify
browserify不需要 define(function(require, exports, module) {...}) 。代码更符合CommonJS模块化规范,可以和nodejs共同require同一个文件,以及node_modules里的库
依赖分析时机不一样:SeaJS是在客户端运行时解析依赖,可以说是“运行时”解析;而Browserify是在服务端就依赖分析打包成单个文件,可以说是“预编译”
RequireJS 和 SeaJS的更多相关文章
- RequireJS与SeaJS模块化加载示例
web应用越变的庞大,模块化越显得重要,尤其Nodejs的流行,Javascript不限用于浏览器,还用于后台或其他场景时,没有Class,没有 Package的Javascript语言变得难以管理, ...
- RequireJS和seaJS的区别与联系
RequireJS和seaJS的区别与联系联系:都是模块加载器,倡导模块化开发理念,核心价值是让 JavaScript 的模块化开发变得简单自然. RequireJS(除了是 ...
- 从Java的角度理解前端框架,nodejs,reactjs,angularjs,requirejs,seajs
[前端神秘的面纱] 对后端开发来说,前端是神秘的, 眼花缭乱的技术,繁多的框架, 如果你还停留在前端等于只用jquery做开发,那么你out了, 本文从Java的角度简述下目前前端流行的一些框架. 水 ...
- LABjs、RequireJS、SeaJS 哪个最好用?为什么?
感谢玉伯在知乎的奉献,下面全文转载:http://www.zhihu.com/question/20342350/answer/14828786 LABjs 的核心是 LAB(Loading and ...
- LABjs、RequireJS、SeaJS 哪个最好用?为什么?- 玉伯的回答
LABjs 的核心是 LAB(Loading and Blocking):Loading 指异步并行加载,Blocking 是指同步等待执行.LABjs 通过优雅的语法(script 和 wait)实 ...
- requirejs和seajs使用感受
这几天看了下前端模块化的知识,主要是requirejs和seajs相关的知识,还未看es6的模块化知识. 由于目前项目组内的开始推广使用vue,并且开始简单的封装组件,但发现组件js的使用方式依然是原 ...
- RequireJS 与 SeaJS 的异同
相同之处 RequireJS 和 SeaJS 都是模块加载器,倡导的是一种模块化开发理念,核心价值是让 JavaScript 的模块化开发变得更简单自然. 不同之处 两者的区别如下: 定位有差异.Re ...
- 模块化以及requirejs和seajs
我们用模块化的思想进行网页的编写是为了更好的管理我们的项目 模块与模块之间是独立存在的,每个模块可以独立的完成一个子功能. 模块化所涉及的规范commonjs,AMD,CMD,UMD 其中的commo ...
- RequireJs 与 SeaJs的相同之处与区别
相同之处: RequireJS 和 Sea.js 都是模块加载器,倡导模块化开发理念,核心价值是让 JavaScript 的模块化开发变得简单自然. 不同之处: 定位有差异.RequireJS 想成为 ...
随机推荐
- dubbo+zookeeper+spring+springMVC+mybatis的使用
读前声明:由于本人水平有限,有错误或者描述不恰当的地方请指出来,勿喷!第一次写博客. 源码下载链接:http://files.cnblogs.com/files/la-tiao-jun-blog/du ...
- Linux学习之查看远端的端口是否通畅
以80端口为例解答 法一:此法常被用来检测是个远端端口是否通畅 [root@oldboy ~]# telnet baidu.com Trying 123.125.114.144... Connecte ...
- js返回值
看下js变量.作用域.内存文档. 1. <script type="text/javascript"> function c(){ return 23; } var a ...
- js 中 setTimeout()的用法
setTimeout()在js类中的使用方法 setTimeout (表达式,延时时间)setTimeout(表达式,交互时间)延时时间/交互时间是以豪秒为单位的(1000ms=1s) setTi ...
- latex列表
枚举.列举和描述 \begin{list_type} \item The first item \item The second item \item The third etc \ldots\end ...
- CSS自学笔记(4):CSS样式表的使用
当浏览器读到一个样式表时,浏览器会根据这个样式表来格式化html文档,从而表现出各式各样的网页. 想要浏览器读到样式表,有三种方法: 1.外部样式表 外部样式表可以理解为.CSS文件.当多个页面使用同 ...
- 谈谈文件增量同步算法:RSYNC和CDC
谈谈文件增量同步算法:RSYNC和CDC 分类: 数据同步 增量备份 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在研究文件的增量同步问题,着重研究了文件差异编码部分,因为这个其实是文件 ...
- nodejs上传图片模块做法;
服务端代码: var express = require('express'); var swig = require('swig'); //1.引入multer模块 var multer = req ...
- Dynamics CRM 2013 初体验(1):系统的安装
最近收到Microsoft的Dynamics CRM 2013 beta测试邀请,终于让我掀开了它神秘的面纱.自从去年的Dynamics CRM 2012 December补丁包发布后,系统就添加了很 ...
- ASP.NET MVC4 ASP.NET Web API路由规则
using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Web.Ht ...