CMD是一种前端模块化规范,由SeaJS提出,核心是就近依赖、延迟执行、按需加载;通过define定义模块、require同步获取依赖、seajs.use异步启动,支持动态路径外的字符串字面量依赖分析与条件加载。

CMD(Common Module Definition)是一种前端模块化规范,由 SeaJS 提出并实现,核心目标是让 JavaScript 模块**就近依赖、延迟执行、按需加载**。它不强制同步加载,也不要求所有依赖提前声明,而是通过 define 定义模块、require 同步获取依赖、seajs.use 异步启动应用,天然支持浏览器端的按需加载。
模块定义:就近书写依赖,不预解析
CMD 要求依赖写在 define 工厂函数内部,且通常紧邻使用位置。SeaJS 不会在定义时立即解析或加载依赖,而是在模块真正执行到 require('xxx') 时才触发加载。
- 模块格式示例:
define(function(require, exports, module) { var $ = require('jquery'); // 用时才加载 jquery var util = require('./util'); // 相对路径,自动补全 .js var api = require('api/main'); // 可配置别名,映射到实际路径 exports.init = function() { ... }; }); - 与 AMD 的区别:AMD 要求依赖数组前置(如
define(['a','b'], function(a,b){})),即使某依赖只在条件分支中用到,也会提前加载;CMD 则按实际执行流动态加载,更利于按需。
按需加载:从 use 开始,链式触发
SeaJS 的按需加载以 seajs.use 为入口,只加载传入的模块及其运行时遇到的 require 依赖,未被引用的模块完全不会下载。
- 典型用法:
seajs.use('./main', function(main) { main.start(); // 执行时才会 require 其依赖 }); - 加载过程是异步、并发、带缓存的:首次
require('a')触发 HTTP 请求,后续同模块调用直接返回已缓存的exports对象。 - 支持条件加载:
if (needChart) { var chart = require('charts/echarts'); chart.render(...); }此时charts/echarts.js仅在needChart为真时才加载。
路径解析与配置:让按需更可控
SeaJS 通过 seajs.config 支持别名、基础路径、插件扩展等,使按需加载适配真实项目结构。
- 常用配置示例:
seajs.config({ base: './js/', alias: { 'jquery': 'lib/jquery/1.12.4/jquery.min', 'underscore': 'lib/underscore/1.8.3/underscore-min' }, preload: ['./lib/compat'] // 全局兼容模块,始终优先加载 }); - 配合构建工具(如 spm)可将模块打包成 combo 文件(如
?a.js&b.js&c.js),减少请求数,同时保持开发期的按需调试能力。
注意边界:不是所有 require 都能按需
CMD 的按需基于静态可分析的字符串字面量。若 require 参数为变量或表达式,SeaJS 无法预判依赖,将跳过该路径的自动加载,可能报错或返回 undefined。
- ❌ 不支持:
var name = 'utils/' + type; require(name); // 运行时才知道,SeaJS 不处理
- ✅ 替代方案:
// 方案一:显式列出可能依赖,按需 require if (type === 'date') require('utils/date'); if (type === 'string') require('utils/string'); // 方案二:用 seajs.use 动态加载(返回 Promise) seajs.use('utils/' + type, function(mod) { ... });
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











