1.Sea.Js是什么
seajs相对于RequireJs与LabJS就比较年轻,2010年玉伯发起了这个开源项目,SeaJS遵循CMD规范,与RequireJS类似,同样做为模块加载器。示例
// File:greet.js define(function (require, exports) { function helloPython() { document.write("Hello,Python"); } function helloJavaScript() { document.write("Hello,JavaScript"); } exports.helloPython = helloPython; exports.helloJavaScript = helloJavaScript; }); // File:usegreet.js sea.use("greet", function (Greet) { greet.helloJavaScript(); });
2.Sea.Js使用指南
模块定义的三种方式
a.
define(function(require, exports, module) { // 模块代码 // 使用require获取依赖模块的接口 // 使用exports或者module来暴露该模块的对外接口 })
b.
define(function(require, exports) { var Vango = require('vango') exports.drawCircle = function () { var vango = new Vango(document.body, 100, 100) vango.circle(50, 50, 50, { fill: true, styles:{ fillStyle:"red" } }) } })
c.
define(function(require, exports, module) { var Vango = require('vango'); module.exports = { drawCircle: function () { var vango = new Vango(document.body, 100, 100); vango.circle(50, 50, 50, { fill: true, styles:{ fillStyle:"red" } }); } }; });
注意:必须保证参数的顺序,即需要用到require, exports不能省略;在模块中exports对象不可覆盖,如果需要覆盖请使用module.exports
的形式。
d.“具名模块”:Sea.js从用于生产的角度来说,必须支持具名模块,因为开发时模块拆得太小,生产环境必须把这些模块文件打包为一个文件,这时再use相应的模块时,需要通过ID来指向。针对此需求,Seajs基本约定原则:ID 和路径一致原则
define('drawCircle', ['vango'], function(require, exports) { var Vango = require('vango'); exports.drawCircle = function () { var vango = new Vango(document.body, 100, 100); vango.circle(50, 50, 50, { fill: true, styles:{ fillStyle:"red" } }); }; })
SeaJs环境配置:
Sea.js通过.config
API来进行配置。你甚至可以在多个地方调用seajs.config来配置,配置多个之后,相关属性合并起来
base:String,在解析绝对路径标识的模块时所使用的base路径,使用base配置,根本上可以分离静态文件的位置,比如使用CDN(如何把静态文件分布到CDN上?)
paths:Object,如果目录太深,可以使用paths这个配置项来缩写,可以在require时少写些代码。
alias:Object,本质上看不出和paths有什么区别,区别就在使用的概念上。
preload:
配置项可以让你在加载普通模块之前提前加载一些模块
模块的使用:
a. seajs.use(id)
seajs.use('./main')
b.seajs.use(ids, callbacks)
seajs.use('./main', function(main) { main.init() })
Sea.js执行ids中的所有模块,然后传递给callback使用。
SeaJs的Plugin
importStyle
,动态地向页面中插入css;Plugin的运行机制:
模块打包:SPM