为什么还要学习 Sea.js?(学习价值)

前,先明确它的价值:

  1. 理解模块化思想:Sea.js 是 CMD (Common Module Definition) 规范的代表,学习它能让你深刻理解“模块是什么”、“模块如何定义”、“模块之间如何依赖”以及“模块如何加载”这些核心问题。
  2. 了解前端发展史:Sea.js 和 Require.js 是早期前端模块化双雄,了解它是理解 Webpack、Vite 等现代构建工具发展脉络的关键。
  3. 维护旧项目:国内仍有大量使用 Sea.js 的老项目在维护,掌握它是工作刚需。
  4. 概念相通:Sea.js 的 requireexportsmodule.exports 等概念与 Node.js 和后来的 ES Module 高度相似,学会一个触类旁通。

视频教程精选

由于 Sea.js 的热度已经下降,新的系统化视频教程非常少,大部分资源都集中在 2025-2025 年,以下是经过筛选的、质量较高的视频教程。

基础入门类(首选)

  • Bilibili - 廖雪峰的 Sea.js 教程
    • 简介:这是目前能找到的最系统、最清晰的中文 Sea.js 入门视频之一,由著名技术博主廖雪峰录制,讲解通俗易懂,非常适合初学者。
    • 从环境搭建、模块定义、模块引入、配置、插件等方面进行了全面介绍。
    • 链接Bilibili 搜索 “廖雪峰 Sea.js”
    • 建议:这是你的首选学习资源,务必先看完这个系列。

实战项目类

  • Bilibili - 使用 Sea.js 和 jQuery 开发一个简单的单页应用
    • 简介:这个教程更侧重于实战,它将 Sea.js 与 jQuery 结合,演示如何构建一个简单的单页应用(SPA),包括页面切换、数据加载等。
    • 优点:能让你看到 Sea.js 在真实项目中的使用方式,将理论知识落地。
    • 链接Bilibili 搜索 “Sea.js jQuery 实战”
    • 建议:在看完廖雪峰的基础教程后,可以找这类实战视频来巩固学习。

综合教程(可能包含部分内容)

  • Bilibili - 前端框架/工具类课程
    • 简介:一些早期的“前端全栈”、“前端工程化”等课程中,会包含 Sea.js 作为模块化方案的一章进行讲解。
    • 搜索关键词前端工程化 Sea.js模块化加载器 Sea.js
    • 建议:这类视频可能不够深入,但可以作为补充参考。

核心概念与学习路径(图文版)

如果视频不能满足你的需求,可以结合以下核心概念进行学习。

学习路径

  1. 环境准备:一个本地 Web 服务器(因为 Sea.js 是异步加载的,需要 HTTP 环境,不能直接用 file:// 协议打开),可以使用 VS Code 的 Live Server 插件,或者 http-server 等。
  2. 引入 Sea.js:在 HTML 页面中通过 <script> 标签引入 sea.js 文件。
  3. 定义模块:学习如何使用 define 关键字来定义一个模块。
  4. 使用模块:学习如何使用 require 来依赖和使用其他模块。
  5. 模块配置:学习如何配置 seajs.config 来设置别名、路径等。
  6. 模块入口:学习如何使用 seajs.use 来启动应用,加载主模块。

核心概念详解

模块定义 (define)

Sea.js 推荐使用 CMD 规范来定义模块,一个模块就是一个文件。

// 定义一个名为 `myModule` 的模块
// id 是模块名,一般省略,由文件名决定
// deps 是依赖的模块列表,也常省略,在 require 中声明
// factory 是模块的主体,是一个函数,返回值就是模块的导出内容
define(function(require, exports, module) {
    // 1. 引入依赖(按需引入,懒加载)
    var $ = require('jquery');
    var util = require('./util.js');
    // 2. 定义模块内容
    function myFunc() {
        console.log('Hello from myModule!');
        $('body').css('background-color', 'red');
        util.doSomething();
    }
    // 3. 暴露模块接口(通过 return 或 exports)
    // 方式一:return 推荐
    return {
        myFunc: myFunc
    };
    // 方式二:exports
    // exports.myFunc = myFunc;
});

特点推崇依赖就近require 可以写在函数的任何位置,只有当代码执行到 require 时,才会真正去加载依赖模块,这被称为“懒加载”。

模块使用 (requireseajs.use)

  • require:在模块内部使用,用于引入其他模块。
  • seajs.use:在主 HTML 文件或入口模块中使用,用于启动整个应用。

HTML 文件 (index.html)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">Sea.js Demo</title>
    <!-- 1. 引入 sea.js -->
    <script src="path/to/sea.js"></script>
</head>
<body>
    <h1>Sea.js Demo</h1>
    <button id="btn">Click Me</button>
    <!-- 2. 使用 seajs.use 启动应用 -->
    <script>
        seajs.use(['./js/main.js'], function(main) {
            // main.js 模块加载完成后执行的回调
            main.init();
        });
    </script>
</body>
</html>

入口模块 (js/main.js)

define(function(require, exports, module) {
    // 引入业务模块
    var myModule = require('./myModule.js');
    function init() {
        console.log('App initialized!');
        document.getElementById('btn').onclick = function() {
            myModule.myFunc();
        };
    }
    // 暴露 init 方法给 seajs.use 的回调
    exports.init = init;
});

模块配置 (seajs.config)

为了避免写很长的相对路径,可以使用 seajs.config 进行配置。

// 在 seajs.use 之前调用
seajs.config({
    // 设置别名
    alias: {
        'jquery': 'path/to/jquery.min.js',
        'util': 'path/to/util.js'
    },
    // 设置基础路径
    base: '/assets/js/',
    // 预加载模块
    preload: []
});
seajs.use(['./main.js']);

官方文档与补充资源

  • Sea.js 官方文档https://seajs.github.io/seajs/docs/
    • 必读! 文档是最权威、最准确的资料,虽然有些旧,但核心概念永不过时,特别是 API 文档教程 部分。
  • GitHub 仓库https://github.com/seajs/seajs

    可以查看源码,了解其实现原理。

  • Require.js vs Sea.js:了解 AMD 和 CMD 的区别是前端模块化进阶的重要一步,可以搜索相关文章进行对比。

总结与建议

  1. 主攻视频:优先观看 廖雪峰的 Sea.js 教程,建立整体认知。
  2. 结合文档:视频看完后,遇到具体 API 不理解时,立刻查阅 官方文档
  3. 动手实践不要只看不练! 自己搭建一个最简单的项目,定义几个模块,用 requireseajs.use 把它们串起来,这是检验学习成果的唯一标准。
  4. 理解思想:重点理解 CMD 的“按需加载”依赖就近 思想,而不是死记 API,这对你后续学习任何模块化方案都有巨大帮助。

虽然 Sea.js 已不再是主流,但它所承载的模块化思想是前端工程化的基石,花一点时间学习它,绝对是一项高回报的投资,祝你学习顺利!