重要的链接
SeaJS的一个step by step教程,已经过期,仅供参考
node的模块加载规则
为了通过对比,加深对seajs模块加载规则的理解,本文也介绍一下node的模块加载规则
node和seajs一样,实现的都是CommonJS的module spec,所以概念上也基本一致。有2种模块标识,分别是top-level identifier和relative identifier
如下代码:
require("http");
require("mongo");
都是top-level,不以../,./,/开头,如果是http这样的核心模块,就从node的lib目录加载,如果是mongo这样的第三方模块,则沿着目录树依次查找node_modules,直到/node_modules,如果没有找到则报错
如下代码:
require("./hello");
require("../hello");
require("/hello");
都是relative,则相对于当前模块的路径查找,比如:
// /home/test/a.js
require("./b");// 加载/home/test/b.js
上面就是node的模块路径解析规则,非常简单
seajs的模块加载规则和模块标识
关于seajs的模块标识,强烈建议一定要仔细读一下这2篇文档:
基本上,seajs的模块标识也分为top-level和relative,但是seajs是运行在浏览器环境的module loader,所以比起node,还多了一种解析规则,称为“普通路径”
top-level
类似于这样:
require("path/to/file");
和node中一样,不以../,./,/开头的标识,是顶级标识,将 相对于seajs base路径来解析,seajs base是sea.js文件本身加载的路径,如:
// seajs_test/app/index.html
<script src="../dist/3rd-lib/sea.js"></script>
在index.html页面中加载了sea.js,所以sea.js的加载路径是seajs_test/dist/3rd-lib/sea.js,所以默认的 seajs base是seajs_test/dist/3rd-lib
刚才这段代码:
require("path/to/file");
解析后的路径是seajs_test/dist/3rd-lib/path/to/file.js
不过可以配置seajs base,代码是:
// seajs_test/app/index.html
seajs.config({
base: "../dist" // set base to seajs_