seajs教程
本文介绍 require.js(AMD) 的近亲 sea.js(CMD) 的基本使用,其基于 CMD(Common Module Definition)规范。该规范明确了模块的基本书写格式和基本交互规则。
至于为什么要使用模块化管理器,这里就不再说明了,自从 require.js 出现后,前端开发再一次发生了巨大变化,让原本无模块化系统的浏览器具备了模块化的功能,页面中<script>标签的引用不再是瀑布式的扑面而来,各模块之间的依赖关系管理变得轻而易举。随后不久,支付宝的 玉伯 开发出了基于 CMD规范 的 sea.js,其与 require.js 有着很大的不同之处,比如 require.js 对模块文件加载方式是 预先加载 ,而 sea.js 则是 按需加载。在使用方式上也存在不同。
获取方式
- 从 github 下载 seajs
模块系统
Sea.js 是一个适用于 Web 浏览器端的模块加载器。在 Sea.js 里,一切皆是模块,所有模块协同构建成模块系统。Sea.js 首要要解决的是模块系统的基本问题:
模块是什么?
模块之间如何交互?
在前端开发领域,一个模块,可以是 JS 模块,也可以是 CSS 模块,或是 Template 等模块。在 Sea.js 里,我们专注于 JS 模块(其他类型的模块可以转换为 JS 模块):
模块是一段
JavaScript代码,具有统一的基本书写格式。模块之间通过基本交互规则,能彼此引用,协同工作。
把上面两点中提及的基本书写格式和基本交互规则描述清楚,就能构建出一个模块系统。对书写格式和交互规则的详细描述,就是模块定义规范(Module Definition Specification)。比如 CommonJS 社区的 Modules 1.1.1 规范,以及 NodeJS 的 Modules 规范,还有 RequireJS 提出的 AMD 规范等等。
Sea.js 遵循的是 CMD 规范,会在接下来的文档中详细阐述。
define 函数定义模块
seajs 使用 define 函数来定义一个模块。
1 | define(function( require, exports , module ){ |
define() 函数的详细介绍请参考: seajs之define函数 。
对外导出接口
seajs 中,对外导出接口的方式有 3 种。
- 使用
exports导出接口。
1 | // foo.js |
如上所示,foo 模块向外提供了 foo.hello() 方法。
- 使用
module.exports导出接口。
1 | // bar.js |
如上所示,bar 模块向外提供了 bar.say() 方法。
- 使用
return导出接口。
还可以像 requirejs 那样,直接使用 return 向外提供接口。
1 | // baz.js |
如上所示,baz 模块向外导出了一个对象,其包含了一个 name 属性。
seajs.use() 方法加载指定模块
seajs 使用 seajs.use 方法加载一个模块。
1 | seajs.use('./main') |
如上代码,加载 main 模块。
seajs.config 配置
seajs 也是可配置的,使用 seajs.config() 函数进行配置。
1 | seajs.config({ |
具体的配置项信息,请参考:seajs之config。
非CMD模块处理
没错,sea.js 同样会面对那些非 CMD 规范的模块引用问题,解决方式如下。
- 在
sea.js-2.1.0之前的版本,可以使用shim插件来解决非 CMD 模块引用问题。例如:jquery,其使用的是标准的 AMD 模块定义方式,所以想要使用sea.js加载她,那么你必须对其进行特殊处理。
1 | // seajs.config.js |
配置好后,便可以在其他模块使用 require() 函数通过别名 jquery 引用她。
1 | define(function( require, exports, module ){ |
- 在
sea.js-2.1.0之后的所有版本中,seajs不再支持shim插件的用法,原因是,这种用法使得各模块之间的依赖关系变得极其复杂,代码量剧增,后期维护变得困难,为此玉伯放弃并剔除了这种用法,提出,我们可以对非 CMD 模块进行手动包装一层define函数再进行使用。
还是以 jquery 为例:
1 | define(function(){ |
如此,你也可以在其他模块直接引入她。
1 | define(function( require, exports , module ){ |
看到这里,相信你跟我一样,对
seajs的热度瞬间冰封,因为其对非 CMD 模块的支持度太低? 没错,就是这么现实,随着大前端的不断发展,像seajs包括requirejs必然会被历史淘汰,耶稣都拉不回来,我说的!
最佳实践
在多页面应用中,每个页面都会对应一个主逻辑文件,那如果,我们每次都在 *.js 文件头部写配置信息的话,那就太蠢了。效率低下而不优雅。
所以,在项目根目录下,创建一个 seajs.config.js 文件,将配置信息写在这个文件中。当然,文件名你可以随便定义,最好能够区分她是谁的配置文件。
对于多页应用来说,通常我们会有如下项目结构:
1 |
|
那么我们会这样使用模块化。
demo.html
1 |
|
seajs.config.js
1 |
|
demo.js
1 |
|