RequireJS SeaJSjavascript
CommonJS的规范: 根据CommonJS规范,一个单独的文件就是一个模块。加载模块使用require方法,该方法读取一个文件并执行,最后返回文件内部的exports对象html
在 SeaJS 里,模块只有一种书写格式前端
define(function(require, exports, module) { var A = require('a'); A.do(); return function () {}; });
在 RequireJS 里,模块有多种书写格式,推荐的是java
define(['dep1', 'dep2'], function (dep1, dep2) { //Define the module value by returning a value. dep1.do(); return function () {}; });
如今RequireJS 也提供了CMD的写法
模块的依赖能够像 CommonJS 同样「就近定义」
PS 二者都是以文件作为模块 一个文件一个模块node
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 推崇 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'); } }; });
写法上可能更易读 「就近」书写app
http://www.zhihu.com/question/20342350异步
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 是一个基于 Node 模块化方案的浏览器端版本
browserify查找语法树种global域下的require和module变量,对其调用进行变形替换。这是静态分析,像module[‘exp‘+’ort’] = {} , require('path'+'to'+‘file')目前还没法被正确替换。
Browserify的出现,不单单是让NPM(或者说以前适用于Node.js)上的代码能够给浏览器端使用。更重要的意义,是Browserify代码组织更符合CommonJS规范,让浏览器前端代码也能够经过预编译实现CommonJS规范
browserify不须要 define(function(require, exports, module) {...}) 。代码更符合CommonJS模块化规范,能够和nodejs共同require同一个文件,以及node_modules里的库
依赖分析时机不同:SeaJS是在客户端运行时解析依赖,能够说是“运行时”解析;而Browserify是在服务端就依赖分析打包成单个文件,能够说是“预编译”