前言
"htmlcode">
/** * Defines a module. * @param {string=} id The module id. * @param {Array.|string=} deps The module dependencies. * @param {function()|Object} factory The module factory function. */ fn.define = function(id, deps, factory) { //code of function… }
define可以接收的参数分别是模块ID,依赖模块数组及工厂函数。
"htmlcode">
define(function(require,exports,module){ //code of the module })
个人建议遵循SeaJS官方示例的标准,用一个参数的define定义模块。那么id和deps会怎么处理呢?
"http://example.com/a.js">http://example.com/a.js ,没有特别的必要建议不要传入id。deps一般也不需要传入,需要用到的模块用require加载即可。
工厂函数factory解析
"htmlcode">
define(function(require,exports,module){ var a=require('a'); var b=require('b'); //引入模块 var data1=1; //私有数据 var fun1=function(){//私有方法 return a.run(data1); } exports.data2=2; //公有数据 exports.fun2=function(){ return 'hello'; } })
上面是一种比较“正宗”的模块定义模式。除了讲公共数据和方法附加在exports上,也可以直接返回一个对象表示模块,如下面的代码与上面的代码功能相同:
define(function(require){ var a=require('a'); var b=require('b'); //引入模块 var data1=1; var fun1=function(){ return a.run(data1); } return{ data2:2, fun2:function(){ return 'hello'; } } })
如果模块定义没有其他代码,只返回一个对象,还可以有如下简化写法:
define({ data2:2, fun2:function(){ return 'hello'; } })
第三种写法对于定义纯JSON数据的模块非常合适。
根据应用场景的不同,SeaJS提供了三个载入模块的API,分别是:seajs.use,require和require.async。
seajs.use
seajs.use主要用于载入入口模块。入口模块相当于C语言的main函数,同时也是整个模块依赖树的根。seajs.use
的用法如下:
//第一模式 seajs.use('./a'); //回调模式 seajs.use('./a',function(a){ a.run(); }) //多模块模式 seajs.use(['./a','./b'],function(a,b){ a.run(); b.run(); })
其中多模块的用法和KISSY中的模块加载方法类似,不亏是一个人写的啊!
一般seajs.use只用在页面载入入口模块,SeaJS会顺着入口模块解析所有依赖模块并将它们加载。如果入口模块只有一个,也可以通过给引入seajs的script标签加入“data-main”属性来省略seajs.use,例如一下写法:
<!DOCTYPE HTML> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>TinyApp</title> </head> <body> <p class="content"></p> <script src="/UploadFiles/2021-04-02/sea.js">require是seajs主要的模块加载方法,当在一个模块中需要用到其他模块时一般用require加载:
var m=require('./a'); require.async上文说过seajs会在html页面打开时通过静态分析一次性记载所有需要的js文件,如果想要某个js文件在用时才加载,可以使用require.async。
这样只有在用到这个模块时,对应的js文件才会被下载,也就实现了JavaScript代码的按需加载。
SeaJS的全局配置
seajs提供了一个seaj.configd的方法可以设置全局配置,接收一个表示全局配置的配置对象,具体方法如下:
seajs.config({ base:'path', alias:{ 'app':'path/app/' }, charset:'utf-8', timeout:20000, debug:false })其中,
"color: #ff0000">Seajs如何与现有的JS库配合使用
要将现有的JS库与seajs一起使用,只需根据seajs的模块定义规则对现有库进行一个封装。例如,下面是对jQuery的封装方法:
define(function(){ /* 此处为jquery源码 */ })一个完整的例子:
上文说了那么多,知识点比较分散,所以最后我打算用一个完整的SeaJS例子把这些知识点串起来,方便朋友们归纳回顾。这个例子包含如下文件:
"htmlcode">html: <!DOCTYPE HTML> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div id="content"> <p class="author"></p> <p class="blog"><a href="#">Blog</a></p> </div> <script src="/UploadFiles/2021-04-02/sea.js">请注意:
1.请讲jquery.js源码文件包含在seajs模块加载代码中;
2.在Sea.js < 2.3.0版本之前是可以加载css文件的,新版本中此功能移除,为了兼容考虑,加载css功能将作为一个插件存在。
使用方法
•可以在sea.js标签后引入这个插件使用
•也可以将插件代码混入sea.js当中
•和seajs-style的区别 •seajs-css是使 Sea.js 能够加载一个css文件,和link标签一样
•seajs-style是指提供一个seajs.importStyle方法用于加载一段 css 字符串以上内容是小编给大家分享的JavaScript模块化开发之SeaJS,希望对大家学习javascript模块化开发有所帮助,谢谢大家一直以来对网站的支持。!