seajs学习笔记

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

二、模块的定义和编写

fn.define = function(id, deps, factory) {
    //code of function…
}

如果只有一个参数,则赋值给factory。

如果有两个参数,第二个赋值给factory;第一个如果是array则赋值给deps,否则赋值给id。

如果有三个参数,则分别赋值给id,deps和factory。

但是,包括SeaJS的官方示例在内几乎所有用到define的地方都只传递一个工厂函数进去,类似与如下代码:

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

id是一个模块的标识字符串,define只有一个参数时,id会被默认赋值为此js文件的绝对路径。

没有特别的必要建议不要传入id。deps一般也不需要传入,需要用到的模块用require加载即可。

三、工厂函数
三个参数:

  1. require——模块加载函数,用于记载依赖模块。
  2. exports——接口点,将数据或方法定义在其上则将其暴露给外部调用。
  3. module——模块的元数据。

下面说一下module。module是一个对象,存储了模块的元信息,具体如下:

  1. module.id——模块的ID。
  2. module.dependencies——一个数组,存储了此模块依赖的所有模块的ID列表。
  3. module.exports——与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‘;
    }
});

第二种:和上面的模式功能相同

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

第三种:如果模块定义没有其它代码,只返回一个对象,还可以有如下简化写法:对于定义纯JSON数据的模块非常合适。

define({
    data: 1,
    func: function() {
        return ‘hello‘;
    }
});

五、模块的载入和引用

上文说过一个模块对应一个js文件,而载入模块时一般都是提供一个字符串参数告诉载入函数需要的模块,所以就需要有一套从字符串标识到实际模块所在文件路径的解析算法。

根据应用场景的不同,SeaJS提供了三个载入模块的API,分别是seajs.use,require和require.async

1.seajs.use

seajs.use主要用于载入入口模块。

//单一模式
seajs.use(‘./a‘);

//回调模式
seajs.use(‘./a‘, function(a) {
  a.run();
});

//多模块模式
seajs.use([‘./a‘, ‘./b‘], function(a, b) {
  a.run();
  b.run();
});

SeaJS会顺着入口模块解析所有依赖模块并将它们加载。如果入口模块只有一个,也可以通过给引入sea.js的script标签加入”data-main”属性来省略seajs.use

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

2.require

require是SeaJS主要的模块加载方法,当在一个模块中需要用到其它模块时一般用require加载:

SeaJS的自动加载机制。上文说过,使用SeaJS后html只要包含sea.js即可,那么其它js文件是如何加载进来的呢?SeaJS会首先下载入口模块,然后顺着入口模块使用正则表达式匹配代码中所有的require,再根据require中的文件路径标识下载相应的js文件,对下载来的js文件再迭代进行类似操作。整个过程类似图的遍历操作(因为可能存在交叉循环依赖所以整个依赖数据结构是一个图而不是树)。

传给require的路径标识必须是字符串字面量,不能是表达式,如下面使用require的方法是错误的:

3.require.async

SeaJS会在html页面打开时通过静态分析一次性记载所有需要的js文件,如果想要某个js文件在用到时才下载,可以使用require.async:

require.async(‘/path/to/module/file‘, function(m) {
    //code of callback...
});

六、seajs全局配置

SeaJS提供了一个seajs.config方法可以设置全局配置,接收一个表示全局配置的配置对象。具体使用方法如下:

seajs.config({
    base: ‘path/to/jslib/‘,
    alias: {
      ‘app‘: ‘path/to/app/‘
    },
    charset: ‘utf-8‘,
    timeout: 20000,
    debug: false
});

其中base表示基址寻址时的基址路径

alias可以对较长的常用路径设置缩写。

charset表示下载js时script标签的charset属性。

timeout表示下载文件的最大时长,以毫秒为单位。

debug表示是否工作在调试模式下。

时间: 2024-10-29 04:26:28

seajs学习笔记的相关文章

seaJs学习笔记2 – seaJs组建库的使用

原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最近在学习seaJs和AngualrJs的指令和服务,感觉angularjs实在太强大了,好吧,步入主题,今天在深入了解seaJs的时候发现了一款神器,不过这款神奇貌似没有更新和维护了,但我测试了一下,还是可以用的. 这款神奇就是SeaJS 组件库 ,Sea.js 是一个适用于 Web 浏览器端的模块

seajs学习笔记一

一.模块化管理的重要性     1.解决冲突问题 2.解决性能问题 3.解决依赖问题 二.为何选择seajs 1.有完整的中文文档 2.符合中国国情 三.seajs如何使用 1.引入seajs库文件 2.如何变成模块 define /*引入好seajs后如何将js文件变成模块*/ define(function(require,exports,module){ /*require,exports,module-seajs规定写法不可修改,变值,重命名*/ /*exports:对外接口 */ fu

seajs学习笔记(基础)

一:前端开发中常遇到的问题       如果我们的网站简单的时候,结构上也许不会有什么问题,但是如果我们的网站越来复杂的时候(比如功能越来越多的时候,加入项目的人越来越多的时候),我们书写的代码就会遇到下面的两个问题: 1. 恼人的命名冲突 比如我们多人开发一个项目,事先由我自己写好了一个共公的组件库common.js供大家调用,里面的包括 function tab(){ 实现代码: }; function drag(){ 实现代码: }; function dialog(){ 实现代码: };

seajs 学习笔记

seajs的作者是玉伯,具体好处优点等详见官方网址 介绍 1 模块定义define define(function(require,exports,module){ //require 引入需要的模块如jquery等 //var $ = require('./jquery'); //exports可以把方法或属性暴露给外部 exports.name = 'hi'; exports.hi = function(){ alert('hello'); } //module提供了模块信息 }); 2 使

seajs教程之seajs学习笔记 seajs.use用法

seajs.use 用来在页面中加载模块.通过 use 方法,可以在页面中加载任意模块. 实例地址:http://www.android100.org/html/201405/23/12807.html 实例中有BUG,修复后的代码见附件  附件下载地址 --------------------------------------------------- 关于seajs.use的用法如下: SeaJS之use函数 原文地址:http://www.cnblogs.com/ada-zheng/p/

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

jQuery学习笔记(一):入门

jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操作如下: 1 document.getElementById('info').value = 'Hello World!'; 使用JQuery时获取DOM文本操作如下: 1 $('#info').val('Hello World!'); 嗯,可以看出,使用JQuery的优势之一是可以使代码更加简练,使开

[原创]java WEB学习笔记93:Hibernate学习之路---Hibernate 缓存介绍,缓存级别,使用二级缓存的情况,二级缓存的架构集合缓存,二级缓存的并发策略,实现步骤,集合缓存,查询缓存,时间戳缓存

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------