个人博客

A web front-end programmer's personal blog.

seajs笔记

简单记录下自己学习seajs的笔记,方便以后能快速使用。

PS:seajs使用要在服务器环境下


####简单快速开始

1、下载seajs,了解各个目录里文件,点击这里下载

NOTE:

  • dist – sea.js 等压缩好的文件,直接可用
  • docs – 使用文档
  • lib – 给 Node.js 用的版本
  • src – 源码
  • tests – 测试集
  • Makefile – 可执行构建、测试等命令

2、seajs简单使用

// seajs 的简单配置
seajs.config({
  base: "../sea-modules/",
  alias: {
    "jquery": "jquery/jquery/1.10.1/jquery.js"
  }
})  
// 加载入口模块
seajs.use("../static/hello/src/main")

加载一段模块代码示例

//main.js
// 所有模块都通过 define 来定义
define(function(require, exports, module) {
  // 通过 require 引入依赖
  var $ = require('jquery');
  var Spinning = require('./spinning'); 
  // 通过 exports 对外提供接口
  exports.doSomething = ... 
  // 或者通过 module.exports 提供整个接口
  module.exports = ...  
});

更多详细的使用参考官网

####下面整理下自己测试时的问题和代码

1、如何使用模块和加载其他模块依赖方法

正常开发一个模块代码,如果我们想使用该模块直接seajs.use就可以了,代码如下

//模块person.js
define(function(require, exports, module){
    function Person(name,age){
        this.name = name;
        this.age = age;
    }
    Person.prototype.say = function(){
        console.log('hello my name is '+this.name+', my age is '+this.age);
    }
    //向外暴露person接口
    exports.person = Person;
});
//使用
seajs.use('./js/person.js',function(exports){
    var Person = exports.person;
    var p1 = new Person('blue',23);
    p1.say(); 
});

会看到在控制台中输出 hello my name is blue,my age is 23 ,如果一个模块依赖另一个模块时,可分为两种情况,第一种为普通的js代码如jquery或另外一个人写的普通js代码,第二种为另外的seajs的模块依赖:

//模块model1.js
define(function(require, exports, module){
    //引入外部的js,第一种
    require('jquery');
    //引入seajs模块 person.js,第二种
    var Person = require('person').person;
    $('#btn').click(function() {
        var p = new Person('Tom',25);
        p.say();
    });
    //继续向外暴露接口
    exports.main = main;
});

如果想在grunt中方便构建,实现前端自动化等可以在前面加入模块依赖的标志数组,注意模块中有几个require,数组要对应几个,如下:

//模块modle1.js,依赖jquery和person.js
define(['jquery.js','person.js'],function(require, exports, module){
    //由于person中暴露的接口不能直接使用所以需要重新require
    var Person = require('person').person;
    $('#btn').click(function() {
        var p = new Person('Tom',25);
        p.say();
    });
    exports.main = main;
})

这样控制台就输出Tom 25了。

2、示例代码 代码示例如下:

######require.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>require</title>
</head>
<script src="sea/sea.js"></script>
<body>
    <button id="btn">click</button> 
</body>
<script>
    seajs.config({
        alias: {
            'jquery': 'sea-plugins/jquery.min',
            'person': '../js/person.js'
        }
    });
    seajs.use('./js/module1.js');
</script>
</html>

######module1.js

define(['jquery','person'],function(require,exports,module){
    var Person = require('person').person;
    $('#btn').click(function() {
        var p = new Person('Tom',25);
        p.say();
    });
});

######目录结构

.
├── exports.html
├── js
│   ├── module1.js
│   └── person.js
├── require.html
└── sea
    ├── sea.js
    └── sea-plugins
        ├── jquery.min.js
        └── underscore.min.js
3 directories, 7 files

3.加载一些模板文件配合underscore生成前端页面,要注意模板使用要配合seajs的插件sea-text.js,下载请点击这里,另外,需要注意只能在页面中的script 标签中加载,模板文件如果要使用[],参数表明依赖方便grunt的话要单独写路径,代码如下:

######module1.js

//model1.js
define(function(require,exports,module){
    require('jquery');
    require('underscore');
    var Person = require('person').person;
    var tpl = require('../template/tmp.tpl');
    var json = {
        title : 'Sea',
        content: 'Hello, this is a sea + underscore file'
    };
    $('#btn').click(function() {
        var p = new Person('Tom',25);
        p.say();
        $('#box').html(_.template(tpl)(json));
    });
});
//或者添加依赖标志
define(['jquery','person','underscore','../template/tmp.tpl'],function(require,exports,module){
    
    var Person = require('person').person;
    var tpl = require('../template/tmp.tpl');
    
    var json = {
        title : 'Sea',
        content: 'Hello, this is a sea + underscore file'
    };
    $('#btn').click(function() {
        var p = new Person('Tom',25);
        p.say();
        $('#box').html(_.template(tpl)(json));
    });
});

######require.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>require</title>
</head>
<script src="sea/sea.js"></script>
<script src="sea/sea-plugins/seajs-text.js"></script>
<body>
    <button id="btn">click</button>
    <div id="box"></div>
</body>
<script>
    seajs.config({
        // 配置路径
        alias: {
            'jquery': 'sea-plugins/jquery.min',
            'person': '../js/person.js',
            'underscore':'sea-plugins/underscore.min'
        },
        // 调试,防止缓存
        map:[
            ['.js','.js?'+Date.now()]
        ]
    });
    seajs.use('./js/module1.js');
</script>
</html>

######tmp.tpl

<h1><%= title %></h1>
<p><%= content %></p>

######全部目录结构

.
├── exports.html
├── js
│   ├── module1.js
│   └── person.js
├── require.html
├── sea
│   ├── sea.js
│   └── sea-plugins
│       ├── jquery.min.js
│       ├── seajs-text.js
│       └── underscore.min.js
└── template
    └── tmp.tpl
4 directories, 9 files

4、seajs-combo减少请求插件,一般配合seajs-flush插件一起使用,使用方法查看这里,seaj-flush使用点这里,目前本人测试seajs-combo,起作用了,但会导致页面出现语法错误,原因不详。