Sea.js模块开发指南:define定义、依赖加载与全局配置详解

作者:函数茶馆时间:2026-10-23 08:04:30浏览:390

本文详细介绍Sea.js如何实现JavaScript模块化开发。重点解析define函数的参数处理机制,包括模块ID、依赖数组及工厂函数的用法。深入讲解require、exports和module三个核心参数的作用,以及如何通过seajs.config进行全局配置。最后演示seajs.use加载入口模块及异步加载技巧,帮助开发者解决命名冲突与文件依赖问题。

Sea.js概述与核心目标

Sea.js旨在实现JavaScript的模块化开发与按需加载,主要解决复杂的JS命名冲突及文件依赖问题,核心目标是让JavaScript开发更加模块化且加载过程轻松便捷。

模块定义与CMD规范

首先了解Sea.js的模块开发方式,其核心仅涉及一个关键函数“define”。


fn.define
= function(id,
deps, factory) {
//code of function…
}

通过define函数定义模块,遵循CMD(Common Module Definition)规范。在Sea.js中,一个文件即代表一个模块,每个JS文件中仅包含一个define。模块概念类似面向对象中的类,可包含公共或私有的数据与方法,其中公共部分可供其他模块调用。

官方示例中,define通常只接收一个参数:即工厂函数。


define(function(require,
exports, module) {
//code of the module...
});

在分析参数前,先查看define对参数的处理逻辑:


fn.define = function(id, deps, factory)

define接收的参数包括模块ID、依赖模块数组以及工厂函数。

若仅传入一个参数,该参数将被赋值给factory。

若传入两个参数,第二个参数赋值给factory;若第一个参数为数组,则赋值给deps,否则赋值给id。

若传入三个参数,则分别对应赋值给id、deps和factory。

依据官方示例,建议遵循官方规范仅传递一个参数(即factory),此时模块ID默认等同于JS文件路径。

工厂函数参数详解

接下来分析工厂函数的参数:

包含require、exports和module。

  • require是模块加载函数,用于加载依赖模块,通过该参数实现对其他模块的引入。
  • exports作为接口点,将数据或方法挂载其上即可暴露给外部调用,通过此参数实现模块方法的对外暴露。
  • module——模块的元数据,是一个包含以下属性的对象:
    • module.id表示模块的ID。
    • module.dependencies是一个数组,存储了当前模块依赖的所有模块ID列表。
    • module.exports与exports指向同一对象。

以下是factory参数使用方式的示例:


define(function(require,
exports, module) {
var a = require('./a');//引入a模块 
exports.fun2= function(){
alert("fun2");
a.dosomething();
  } 

}

使用require对象加载模块时,其参数需通过正则表达式验证,因此必须是特定字符串,不能是表达式。

Sea.js会自动在require参数后添加“.js”后缀进行加载,即无需手动书写后缀名。但在某些特定情况下,Sea.js不会自动添加“.js”:

1. 加载CSS文件时:


require("./module1-style.css");

2. 路径中包含“?”时:


require(<a href="http://example/js/a.json?b=func" rel="external nofollow" >http://example/js/a.json?cb=func</a>);

3. 路径以“#”结尾时:


require(http://example/js/a.json#);

使用exports可向外部暴露方法或属性。除上述示例外,还有以下几种暴露属性的方式:

使用return语句:


define(function(require)
{
var data1 = 1; //私有数据
var func1 = function() { //私有方法
returna.run(data1);
}
//暴露
return{
data2: 2,
func2:function() {
return'hello';
}
}; 
});

直接返回JSON对象:


define({
data: 1,
func:function() {
return'hello';
}
});

模块加载与全局配置

在页面中调用Sea.js。

前文提及Sea.js用于解决模块开发和繁琐的文件依赖问题,因此所有文件依赖均通过require对象加载。也可使用require.async(“./a”)进行异步加载,即仅在用到时才加载。

注意:无论是require()还是require.async(),均可接收第二个参数作为回调函数,当文件加载成功时触发调用:


require.async('/path/to/module/file',function(m) {
//code of callback...
});

借助这种依赖加载方式,页面无需书写大量<script></script>标签,仅需使用一个:


<script src="./sea.js" data-main="./init"></script>

即可。其中data-main="./init"指定入口模块,表示加载该模块并迭代加载其依赖的模块。使用此属性可省略seajs.use,具体见后文说明。

使用seajs.config进行全局配置:


seajs.config({
base:'path/to/jslib/',
alias: {
'app':'path/to/app/'
},
charset:'utf-8',
timeout: 20000,
debug:false
});

这是对Sea.js进行全局配置的配置对象。

base表示基址寻址时的基址路径。

alias用于为较长且常用的路径设置缩写。

charset表示下载JS时script标签的charset属性。

timeout表示下载文件的最大时长,单位为毫秒。

debug表示是否工作在调试模式下。

使用seajs.use载入入口模块,其作用相当于Java的main函数:


//单模块模式
seajs.use('./a');
//回调模式
seajs.use('./a',function(a)
{
a.dosomething();
});
//多模块模式
seajs.use(['./a','./b'],function(a,
b) {
a.dosomething();
b.dosomething();
});

参考官方提供的simple例子中的页面代码,即可基本掌握Sea.js的使用方法:


<script src="../sea-modules/seajs/seajs/2.2.0/sea.js"></script>
<script>
// Set configuration
seajs.config({
base: "../sea-modules/",
alias: {
"jquery": "jquery/jquery/1.10.1/jquery.js"
}
});
// For development
if (location.href.indexOf("?dev") > 0) {
seajs.use("../static/hello/src/main");
}
// For production
else {
seajs.use("examples/hello/1.0.0/main");
}
</script>

//mian.js


//hello/mian.js
define(function(require) {
var Spinning = require('./spinning');
var s = new Spinning('#container');
s.render();
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

作者最新文章