• sea.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>

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

    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';
        }
    });

    上面是一种比较“正宗”的模块定义模式。除了将公共数据和方法附加在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!");
        }
    );
  • 相关阅读:
    zabbix 微信告警
    mongodb 的数据备份与还原
    Templates
    Rsyslog 基本结构
    matplotlib绘图学习
    pyhon 简介
    Pygame (Python编程从入门到实践)
    AttributeError: 'pygame.Surface' object has no attribute 'rect'
    PYTHON CLIENT API
    SALT.STATES.CMD模块
  • 原文地址:https://www.cnblogs.com/yangheng/p/6143676.html
Copyright © 2020-2023  润新知