seajs的价值
原生javascript的一个弱项,就是不支持模块化,说白了就是没有其他语言的import,include等语句。所以开发者就只有2个选择:把所有的东西写到一起,或者通过全局变量来交互 这至少造成以下几个问题: 1、污染全局变量,容易发生命名空间冲突,难以维护 2、无法按需加载 由于javascript官方迟迟未能解决这些问题,所以就有民间的社区提出标准,希望能自行解决,弥补语言的不足。主要有2种规范,一种是 CommonJS提出的CMD规范,另一种是AMD规范,server端的node就是CMD的一种实现,seajs实现的也是CMD规范。所以熟悉 node的用户会发现,seajs的API和node的API非常类似,这就是因为它们是同一种规范的不同实现 关于seajs的价值,这篇帖子说得更加详细: why seajsseajs的例子
官网上的5分钟入门例子也很简单,不过本文再简化一点,用一个更简单的例子进行说明: 目录结构简化后是这样的:
- <!doctype html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>Hello Sea.js</title>
- </head>
- <body>
- <div id="thediv">
- <p>hello world</p>
- </div>
- <script src="../javascript/sea.js"></script>
- <script>
- seajs.config({
- alias: {
- "jquery": "jquery-debug.js"
- }
- });
- seajs.use("../javascript/main");
- </script>
- </body>
- </html>
- seajs.use("../javascript/main");
- define(function (require, exports, module) {
- var module1 = require("./module1");
- alert(module1.add(1, 2));
- })
- define(function (require, exports, module) {
- exports.add = function (a, b) {
- return a + b;
- }
- var $ = require("jquery");
- $("#thediv").click(function () {
- alert("on click");
- });
- })
- define(function () {
- return {sayHello: function () {
- alert("hi there");
- }};
- });
与node module的比较
基本上是一致的,包括exports和module.exports的表现,还有require后立刻执行的行为,还有require的结果也同样会被cache起来
集成jQuery的一个坑
我下载了官网的例子,然后只是稍微移动了文件的路径,结果发现这行代码:
- var $ = require("jquery");
seajs的设计思想是,路径即ID。一般在调用define()方法时,如果只传递一个factory function,那么这个模块就是个匿名模块;或者传递define(module_id, dependency, factory),这个模块就是个具名模块
如果一个文件就是一个模块,那么匿名模块就可以了。但是在生产环境中,往往会把多个模块放到一个文件里,但是路径只有一个,如何知道要加载哪个 模块呢?这时候就需要给其中一个模块赋予module_id,和path保持一致,seajs就知道应该加载这个ID和path匹配的模块了
如果具名模块的id和require的path参数不匹配,就会返回null,这就是我出现这个错误的原因:
- var $ = require("jquery-debug");// path是"jquery-debug"
- define("jquery/jquery/1.10.1/jquery-debug", [], function () { return jQuery; } );// module_id是"jquery/jquery/1.10.1/jquery-debug"
把jQuery中的代码改成:
- define("jquery-debug.js",[],function(){return jQuery});
- define(function(){return jQuery});