SeaJS 与 RequireJS 的差异对比  更新时间:2014年12月08日 10:35:10   投稿:junjie   这篇文章主要介绍了SeaJS 与 RequireJS 的差异对比,本文主要对CMD规范和AMD规范的弊端做了对比,并做出了一个总结,需要的朋友可以参考下 “历史不是过去,历史正在上演。随着 W3C 等规范、以及浏览器的飞速发展,前端的模块化开发会逐步成为基础设施。一切终究都会成为历史,未来会更好。”——引用玉伯原文最后一段话,我个人也非常赞同。既然谈到了“未来”,我个人认为:前端 js 模块如果继续发展,其模块格式很可能会成为未来 WEB 一种标准规范,产生多种实现方式。就好比 JSON 格式一样,最终成为标准、被浏览器原生实现。 谁更有能成为未来的异步模块标准?SeaJS 遵循 CMD 规范,RequireJS 遵循 AMD 规范,先从这两种不同的格式说起。 CMD CMD 模块依赖声明方式: 复制代码 代码如下: define(function (require) {     var a = require(‘./a’);     var b = require(‘./b’);     // more code .. }) CMD 依赖是就近声明,通过内部require方法进行声明。但是因为是异步模块,加载器需要提前加载这些模块,所以模块真正使用前需要提取模块里面所有的依赖。无论是加载器即时提取,还是通过自动化工具预先提取,CMD 的这种依赖声明格式只能通过静态分析方式实现,这也正是 CMD 的弊端所在。 CMD 规范的弊端 不能直接压缩:require是局部变量,意味着不能直接的通过压缩工具进行压缩,若require这个变量被替换,加载器与自动化工具将无法获取模块的依赖。 模块书写有额外约定:路径参数不能进行字符串运算,不能使用变量代替,否则加载器与自动化工具无法正确提取路径。 规范之外的约定意味着更多的文档说明,除非它们也是规范中的一部分。 注:SeaJS 静态分析实现是把模块包toString()后使用正则提取require部分得到依赖的模块路径。 AMD AMD 模块依赖声明方式: 复制代码 代码如下: define([‘./a’, ‘./b’], function (a, b) {     // more code .. }) AMD 的依赖是提前声明。这种优势的好处就是依赖无需通过静态分析,无论是加载器还是自动化工具都可以很直接的获取到依赖,规范的定义可以更简单,意味着可能产生更强大的实现,这对加载器与自动化分析工具都是有利的。 AMD 规范的弊端 依赖提前声明在代码书写上不是那么友好。 模块内部与 NodeJS 的 Modules 有一定的差异。 关于第二点的问题需要特别说明下。其实无论是 CMD 还是 AMD 的异步模块,都无法与同步模块规范保持一致(NodeJS 的 Modules),只有谁比谁更像同步模块而已。AMD 要转换为同步模块,除了去掉define函数的包裹外,需要在头部使用require把依赖声明好,而 CMD 只需要去掉define函数的包裹即可。 总结 从规范上来说,AMD 更加简单且严谨,适用性更广,而在 RequireJS 强力的推动下,在国外几乎成了事实上的异步模块标准,各大类库也相继支持 AMD 规范。 但从 SeaJS 与 CMD 来说,也做了很多不错东西: 1、相对自然的依赖声明风格 2、小而美的内部实现 3、贴心的外围功能设计 4、更好的中文社区支持 如果有可能,我希望看到 SeaJS 也支持 AMD,与前端社区大环境保持一致最终幸福的是广大开发者。 您可能感兴趣的文章: LABjs、RequireJS、SeaJS的区别 详解Require.js与Sea.js的区别 seajs下require书写约定实例分析 把jQuery的类、插件封装成seajs的模块的方法 深入探寻seajs的模块化与加载方式 seajs中模块的解析规则详解和模块使用总结 seaJs的模块定义和模块加载浅析 JavaScript的模块化开发框架Sea.js上手指南 Seajs 简易文档 提供简单、极致的模块化开发体验 seajs和requirejs模块化简单案例分析 SeaJS RequireJS 相关文章 详解Angular cli配置过程记录 这篇文章主要介绍了详解Angular cli配置过程记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 2019-11-11 AngularJS模块管理问题的非常规处理方法 这篇文章主要介绍了AngularJS模块管理问题的非常规处理方法,算是一个无奈之举,分享给小伙伴,大家可以参考下。 2015-04-04 对angularJs中ng-style动态改变样式的实例讲解 今天小编就为大家分享一篇对angularJs中ng-style动态改变样式的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 2018-09-09 初学者AngularJS的环境搭建过程 这篇文章主要介绍了初学者AngularJS的环境搭建过程,在文章给大家提到了Angular-cli的特性,大家一起看看吧 2017-10-10 AngularJS 模型详细介绍及实例代码 本文主要介绍 AngularJS模型,这里详细介绍了AngularJS 模型中的知识点,并提供实例代码,有需要的小伙伴可以参考下 2016-07-07 一种angular的方法级的缓存注解(装饰器) 本篇文章主要介绍了一种angular的方法级的缓存注解(装饰器),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 2018-03-03 解决angularJS中input标签的ng-change事件无效问题 今天小编就为大家分享一篇解决angularJS中input标签的ng-change事件无效问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 2018-09-09 详谈AngularJs 控制器、数据绑定、作用域 下面小编就为大家带来一篇详谈AngularJs 控制器、数据绑定、作用域。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧 2017-07-07 详解Angular组件之中间人模式 设计一个组件时,组件应该是内聚的,应该不依赖外部已经存在的组件,要实现这种松耦合的组件要使用中间人模式。 2021-05-05 详解angular2采用自定义指令(Directive)方式加载jquery插件 本篇文章主要介绍了详解angular2采用自定义指令(Directive)方式加载jquery插件 ,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。 2017-02-02 最新评论

“历史不是过去,历史正在上演。随着 W3C 等规范、以及浏览器的飞速发展,前端的模块化开发会逐步成为基础设施。一切终究都会成为历史,未来会更好。”——引用玉伯原文最后一段话,我个人也非常赞同。既然谈到了“未来”,我个人认为:前端 js 模块如果继续发展,其模块格式很可能会成为未来 WEB 一种标准规范,产生多种实现方式。就好比 JSON 格式一样,最终成为标准、被浏览器原生实现。

谁更有能成为未来的异步模块标准?SeaJS 遵循 CMD 规范,RequireJS 遵循 AMD 规范,先从这两种不同的格式说起。

CMD

CMD 模块依赖声明方式:

复制代码 代码如下:

define(function (require) {

    var a = require(‘./a’);

    var b = require(‘./b’);

    // more code ..

})

CMD 依赖是就近声明,通过内部require方法进行声明。但是因为是异步模块,加载器需要提前加载这些模块,所以模块真正使用前需要提取模块里面所有的依赖。无论是加载器即时提取,还是通过自动化工具预先提取,CMD 的这种依赖声明格式只能通过静态分析方式实现,这也正是 CMD 的弊端所在。

CMD 规范的弊端

不能直接压缩:require是局部变量,意味着不能直接的通过压缩工具进行压缩,若require这个变量被替换,加载器与自动化工具将无法获取模块的依赖。
模块书写有额外约定:路径参数不能进行字符串运算,不能使用变量代替,否则加载器与自动化工具无法正确提取路径。
规范之外的约定意味着更多的文档说明,除非它们也是规范中的一部分。

注:SeaJS 静态分析实现是把模块包toString()后使用正则提取require部分得到依赖的模块路径。

AMD

AMD 模块依赖声明方式:

复制代码 代码如下:

define([‘./a’, ‘./b’], function (a, b) {

    // more code ..

})

AMD 的依赖是提前声明。这种优势的好处就是依赖无需通过静态分析,无论是加载器还是自动化工具都可以很直接的获取到依赖,规范的定义可以更简单,意味着可能产生更强大的实现,这对加载器与自动化分析工具都是有利的。

AMD 规范的弊端

依赖提前声明在代码书写上不是那么友好。
模块内部与 NodeJS 的 Modules 有一定的差异。
关于第二点的问题需要特别说明下。其实无论是 CMD 还是 AMD 的异步模块,都无法与同步模块规范保持一致(NodeJS 的 Modules),只有谁比谁更像同步模块而已。AMD 要转换为同步模块,除了去掉define函数的包裹外,需要在头部使用require把依赖声明好,而 CMD 只需要去掉define函数的包裹即可。

总结

从规范上来说,AMD 更加简单且严谨,适用性更广,而在 RequireJS 强力的推动下,在国外几乎成了事实上的异步模块标准,各大类库也相继支持 AMD 规范。

但从 SeaJS 与 CMD 来说,也做了很多不错东西:

1、相对自然的依赖声明风格
2、小而美的内部实现
3、贴心的外围功能设计
4、更好的中文社区支持

如果有可能,我希望看到 SeaJS 也支持 AMD,与前端社区大环境保持一致最终幸福的是广大开发者。

您可能感兴趣的文章:

  • LABjs、RequireJS、SeaJS的区别
  • 详解Require.js与Sea.js的区别
  • seajs下require书写约定实例分析
  • 把jQuery的类、插件封装成seajs的模块的方法
  • 深入探寻seajs的模块化与加载方式
  • seajs中模块的解析规则详解和模块使用总结
  • seaJs的模块定义和模块加载浅析
  • JavaScript的模块化开发框架Sea.js上手指南
  • Seajs 简易文档 提供简单、极致的模块化开发体验
  • seajs和requirejs模块化简单案例分析
张贴在3