Sea.js入门教程

来源:互联网 发布:tomcat设置域名访问 编辑:程序博客网 时间:2024/06/02 04:42

下载与安装

要在项目中使用SeaJS,你所有需要做的准备工作就是下载sea.js然后放到你项目的某个位置。
SeaJS项目目前托管在GitHub上,主页为 https://github.com/seajs/seajs/ 。可以到其Git库的build目录下下载sea.js(已压缩)或sea-debug.js(未压缩)。
下载完成后放到项目的相应位置,然后在页面中通过<script>标签引入,你就可以使用SeaJS了。

SeaJS基本开发原则

使用SeaJS开发JavaScript的基本原则就是:一切皆为模块。引入SeaJS后,编写JavaScript代码就变成了编写一个又一个模块,SeaJS中模块的概念有点类似于面向对象中的类——模块可以拥有数据和方法,数据和方法可以定义为公共或私有,公共数据和方法可以供别的模块调用。
另外,每个模块应该都定义在一个单独js文件中,即一个对应一个模块。
下面介绍模块的编写和调用。

Sea.js的配置

<script src="sea.js"></script><script>    seajs.use("main");</script>

用script标签引入 sea.js,然后用seajs.use进行配置。
seajs.use主要用于载入入口模块。入口模块相当于C程序的main函数,同时也是整个模块依赖树的根。上面在TinyApp小例子中,init就是入口模块。seajs.use用法如下:

//单一模式seajs.use('./a');//回调模式seajs.use('./a', function(a) {  a.run();});//多模块模式seajs.use(['./a', './b'], function(a, b) {  a.run();  b.run();});

      一般seajs.use只用在页面载入入口模块,SeaJS会顺着入口模块解析所有依赖模块并将它们加载。

      如果入口模块只有一个,也可以通过给引入sea.js的script标签加入”data-main”属性来省略seajs.use,例如上面的代码也可以改为如下写法:

      <script src="sea.js" data-main="main.js"></script>
      • 1
      • 1

      不过我一直没有成功过,具体原因不明。

      seajs.config seajs.config(options)

      用来进行配置的方法。

      seajs.config({

      // 别名配置
      alias: {
      ‘es5-safe’: ‘gallery/es5-safe/0.9.3/es5-safe’,
      ‘json’: ‘gallery/json/1.0.2/json’,
      ‘jQuery’: ‘jquery/jquery/1.10.1/jquery’
      },

      // 路径配置
      paths: {
      ‘gallery’: ‘https://a.alipayobjects.com/gallery’
      },

      // 变量配置
      vars: {
      ‘locale’: ‘zh-cn’
      },

      // 映射配置
      map: [
      [‘http://example.com/js/app/‘, ‘http://localhost/js/app/‘]
      ],

      // 预加载项
      preload: [
      Function.prototype.bind ? ” : ‘es5-safe’,
      this.JSON ? ” : ‘json’
      ],

      // 调试模式
      debug: true,

      // Sea.js 的基础路径
      base: ‘http://example.com/path/to/base/‘,

      // 文件编码
      charset: ‘utf-8’
      });

      支持以下配置选项:
      alias Object

      当模块标识很长时,可以使用 alias 来简化。

      seajs.config({
      alias: {
      ‘jquery’: ‘jquery/jquery/1.10.1/jquery’,
      ‘app/biz’: ‘http://path/to/app/biz.js‘,
      }
      });

      define(function(require, exports, module) {

      var $ = require(‘jquery’);
      //=> 加载的是 http://path/to/base/jquery/jquery/1.10.1/jquery.js

      var biz = require(‘app/biz’);
      //=> 加载的是 http://path/to/app/biz.js

      });

      使用 alias,可以让文件的真实路径与调用标识分开,有利于统一维护。
      paths Object

      当目录比较深,或需要跨目录调用模块时,可以使用 paths 来简化书写。

      seajs.config({
      paths: {
      ‘gallery’: ‘https://a.alipayobjects.com/gallery‘,
      ‘app’: ‘path/to/app’,
      }
      });

      define(function(require, exports, module) {

      var underscore = require(‘gallery/underscore’);
      //=> 加载的是 https://a.alipayobjects.com/gallery/underscore.js

      var biz = require(‘app/biz’);
      //=> 加载的是 path/to/app/biz.js

      });

      paths 配置可以结合 alias 配置一起使用,让模块引用非常方便。
      vars Object

      有些场景下,模块路径在运行时才能确定,这时可以使用 vars 变量来配置。

      seajs.config({
      vars: {
      ‘locale’: ‘zh-cn’
      }
      });

      define(function(require, exports, module) {

      var lang = require(‘./i18n/{locale}.js’);
      //=> 加载的是 path/to/i18n/zh-cn.js

      });

      vars 配置的是模块标识中的变量值,在模块标识中用 {key} 来表示变量。
      map Array

      该配置可对模块路径进行映射修改,可用于路径转换、在线调试等。

      seajs.config({
      map: [
      [ ‘.js’, ‘-debug.js’ ]
      ]
      });

      define(function(require, exports, module) {

      var a = require(‘./a’);
      //=> 加载的是 path/to/a-debug.js

      });

      更多用法可参考:调试实践
      preload Array

      使用 preload 配置项,可以在普通模块加载前,提前加载并初始化好指定模块。

      // 在老浏览器中,提前加载好 ES5 和 json 模块
      seajs.config({
      preload: [
      Function.prototype.bind ? ” : ‘es5-safe’,
      this.JSON ? ” : ‘json’
      ]
      });

      preload 中的空字符串会被忽略掉。

      注意:preload 中的配置,需要等到 use 时才加载。比如:

      seajs.config({
      preload: ‘a’
      });

      // 在加载 b 之前,会确保模块 a 已经加载并执行好
      seajs.use(‘./b’);

      preload 配置不能放在模块文件里面:

      seajs.config({
      preload: ‘a’
      });

      define(function(require, exports) {
      // 此处执行时,不能保证模块 a 已经加载并执行好
      });

      debug Boolean

      值为 true 时,加载器不会删除动态插入的 script 标签。插件也可以根据 debug 配置,来决策 log 等信息的输出。
      base String

      Sea.js 在解析顶级标识时,会相对 base 路径来解析。详情请参阅 模块标识

      注意:一般请不要配置 base 路径,把 sea.js 放在合适的路径往往更简单一致。
      charset String | Function

      获取模块文件时,

      模块的定义及编写

      模块定义函数define

      SeaJS中使用“define”函数定义一个模块。define可以接收三个参数:
      复制代码 代码如下:

      上面是我从SeaJS源码中摘录出来的,define可以接收的参数分别是模块ID,依赖模块数组及工厂函数。

      define对于不同参数个数的解析规则如下:
      如果只有一个参数,则赋值给factory。
      如果有两个参数,第二个赋值给factory;第一个如果是array则赋值给deps,否则赋值给id。
      如果有三个参数,则分别赋值给id,deps和factory。
      但是,包括SeaJS的官方示例在内几乎所有用到define的地方都只传递一个工厂函数进去,类似与如下代码:
      复制代码 代码如下:

      define(function(require, exports, module) {
      //code of the module…
      });

      个人建议遵循SeaJS官方示例的标准,用一个参数的define定义模块。那么id和deps会怎么处理呢?
      id是一个模块的标识字符串,define只有一个参数时,id会被默认赋值为此js文件的绝对路径。如example.com下的a.js文件中使用define定义模块,则这个模块的ID会赋值为 http://example.com/a.js ,没有特别的必要建议不要传入id。deps一般也不需要传入,需要用到的模块用require加载即可。

      工厂函数factory解析

      工厂函数是模块的主体和重点。在只传递一个参数给define时(推荐写法),这个参数就是工厂函数,此时工厂函数的三个参数分别是:
      1.require——模块加载函数,用于记载依赖模块。
      2.exports——接口点,将数据或方法定义在其上则将其暴露给外部调用。
      3.module——模块的元数据。
      这三个参数可以根据需要选择是否需要显示指定。
      下面说一下module。module是一个对象,存储了模块的元信息,具体如下:
      1.module.id——模块的ID。
      2.module.dependencies——一个数组,存储了此模块依赖的所有模块的ID列表。
      3.module.exports——与exports指向同一个对象。

      三种编写模块的模式

      第一种定义模块的模式是基于exports的模式:
      复制代码 代码如下:

      define(function(require, exports, module) {    var a = require('a'); //引入a模块    var b = require('b'); //引入b模块    var data1 = 1; //私有数据    var func1 = function() { //私有方法        return a.run(data1);    }    exports.data2 = 2; //公共数据    exports.func2 = function() { //公共方法        return 'hello';    }});
        • 14
        • 15
        • 16

        上面是一种比较“正宗”的模块定义模式。除了将公共数据和方法附加在exports上,也可以直接返回一个对象表示模块,如下面的代码与上面的代码功能相同:
        复制代码 代码如下:
        define(function(require) {
        var a = require(‘a’); //引入a模块
        var b = require(‘b’); //引入b模块

        var data1 = 1; //私有数据var func1 = function() { //私有方法    return a.run(data1);}return {    data2: 2,    func2: function() {        return 'hello';    }};

        });

        如果模块定义没有其它代码,只返回一个对象,还可以有如下简化写法:
        复制代码 代码如下:
        define({
        data: 1,
        func: function() {
        return ‘hello’;
        }
        });

        第三种方法对于定义纯JSON数据的模块非常合适。

        简单的实例

        helloworld.html源码如下:

        <!doctype html><html><head><meta charset="utf-8"><title>Hello Sea.js</title></head><body><script src="sea.js"></script><script>    seajs.use("main");</script></body></html>

            main.js源代码如下:

            define(    "main", //可以不要    [], //可以不要    function test() {               alert("Hello world!");    });
                (function () {('pre.prettyprint code').each(function () { var lines = (this).text().split(\n).length;varnumbering = $('
                  ').addClass('pre-numbering').hide(); (this).addClass(hasnumbering).parent().append(numbering); for (i = 1; i
                  2 0
                  原创粉丝点击