通过seajs实现JavaScript的模块开发及按模块加载

seajs实现了JavaScript 的 模块开发及按模块加载。用来解决繁琐的js命名冲突,文件依赖等问题,其主要目的是令JavaScript开发模块化并可以轻松愉悦进行加载。

首先看看seajs是怎么进行模块开发的。使用seajs基本上只有一个函数“define”

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

使用define函数来进行定义一个模块,根据 CMD (Common Module Definition)模块定义规范。一个文件就是一个模块。所以一个js文件中只有一个define,即一个文件是一个模块,SeaJS中模块的概念有点类似于面向对象中的类——模块可以拥有数据和方法,数据和方法可以定义为公共或私有,公共数据和方法可以供别的模块调用。

官方实例中,define只传入一个参数: 一个工厂函数

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

在看参数之前,我们先看看define是如何处理参数的:

fn.define = function(id, deps, factory)

define可以接收的参数分别是模块ID,依赖模块数组及工厂函数;

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

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

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

根据官方实例,建议还是根据官方的来就传递一个参数,即只有factory参数,这样的话模块id默认为js文件路径。

在来看看工厂函数的参数:

require, exports, module

  • require——模块加载函数,用于记载依赖模块。通过这个参数来进行对其他模块的加载。
  • exports——接口点,将数据或方法定义在其上则将其暴露给外部调用。通过这个参数,来将这个模块的方法进行暴露
  • module——模块的元数据。其是一个对象,有属性:
    • module.id——模块的ID。
    • module.dependencies——一个数组,存储了此模块依赖的所有模块的ID列表。
    • module.exports——与exports指向同一个对象。

使用factory的参数的使用:

define(function(require,
exports, module) {
var a = require('./a');//引入a模块
exports.fun2= function(){
alert("fun2");
a.dosomething();
  } 

}

使用require对象来进行加载模块,其实使用正则表达式进行验证加载的,所以其参数必须是特定的字符串,不能是表达式。

seajs会自动在require的参数中加入".js"来进行加载,即不需要写上后缀名,但是在某些情况下,seajs不会为其添加“.js”:

1.载入css:    

require("./module1-style.css");

2.路径中含有“?”: 

require(<a href="http://example/js/a.json?b=func" rel="external nofollow" >http://example/js/a.json?cb=func</a>);

3.路径以“#”结尾:

require(http://example/js/a.json#);

使用exports来向外部暴露方法,或者属性。暴露属性有几种方式,如上面中的例子是一种方式,另外还有:

使用return:

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

直接返回json对象:

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

页面中调用seajs

前面说了seajs用来解决模块开发,和繁琐的文件依赖问题,所以所有的文件依赖都是通过require对象进行加载,或者可以使用require.async(“./a”)来进行异步加载,即当使用到的时候才进行加载,

注:无论是require()还是require.async()都可以有第二个参数为回调函数,当文件加载成功时调用:

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

有了这个加载依赖的方式,我们无需再页面上书写大量的<script ></script>标签,而仅仅使用一个

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

即可,其中data-main="./init" 为入口模块,表示加载这个模块,在进行迭代加载其所依赖的模块,使用这个属性可以省略seajs.use。这个后面说。

使用seajs.config进行全局配置:

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

这是对seajs进行全局配置,

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

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

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

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

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

使用seajs.use 载入入口模块,相当于java的main函数,

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

下面可以看其官方给的simple例子中的页面怎么写的,基本上就明白了sea.js 是怎么用的了:

<script src="../sea-modules/seajs/seajs/2.2.0/sea.js"></script>
<script>
// Set configuration
seajs.config({
base: "../sea-modules/",
alias: {
"jquery": "jquery/jquery/1.10.1/jquery.js"
}
});
// For development
if (location.href.indexOf("?dev") > 0) {
seajs.use("../static/hello/src/main");
}
// For production
else {
seajs.use("examples/hello/1.0.0/main");
}
</script>

//mian.js

//hello/mian.js
define(function(require) {
var Spinning = require('./spinning');
var s = new Spinning('#container');
s.render();
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Seajs源码详解分析

    近几年前端工程化越来越完善,打包工具也已经是前端标配了,像seajs这种老古董早已停止维护,而且使用的人估计也几个了.但这并不能阻止好奇的我,为了了解当年的前端前辈们是如何在浏览器进行代码模块化的,我鼓起勇气翻开了Seajs的源码.下面就和我一起细细品味Seajs源码吧. 如何使用seajs 在看Seajs源码之前,先看看Seajs是如何使用的,毕竟刚入行的时候,大家就都使用browserify.webpack之类的东西了,还从来没有用过Seajs. <!-- 首先在页面中引入sea.js,也可

  • seajs模块压缩问题与解决方法实例分析

    本文实例讲述了seajs模块压缩问题与解决方法.分享给大家供大家参考,具体如下: 在优化整理项目代码时,想使用seajs来把代码模块化.看了下官方5分钟上手教程,觉得很不错,也没多想就一直开发下去了,也没出什么问题.等一同事说把代码打包个放到设备上去测试一下,发现怎么也跑不起来,郁闷了. 于是单步调试一把,发现模块一直加不进来.看了一下seajs的原码,明白了是怎么回事. define模块解析依赖有两种途径,一种是从define(id, deps, factory)中的deps来:还有一种是解析

  • seajs实现强制刷新本地缓存的方法分析

    本文实例讲述了seajs实现强制刷新本地缓存的方法.分享给大家供大家参考,具体如下: 1.为什么 由于每次上传js文件到服务器后用户本机存在本地缓存,导致用户需要强制清除缓存或者等待缓存失效才能使用新功能,极其不友好. 2.原理 seajs配置参数中有map属性为文件映射功能,其作用是通过seajs加载的文件映射为一个新的名称加载,形如 var version="0.0.1"; seajs.config({//seajs配置声明 map:[ [".js","

  • seaJs使用心得之exports与module.exports的区别实例分析

    本文实例讲述了seaJs使用心得之exports与module.exports的区别.分享给大家供大家参考,具体如下: 1. exports 是 module.exports 的 辅助对象,exports对外提供api 时需要用return 返回exports 对象 2. module.exports 也可直接向外提供api 参考 : https://github.com/seajs/seajs/issues/242 exports Object exports 是一个对象,用来向外提供模块接口

  • seajs模块之间依赖的加载以及模块的执行

    本文介绍的是seajs模块之间依赖的加载以及模块的执行,下面话不多说直接来看详细的介绍. 入口方法 每个程序都有个入口方法,类似于c的main函数,seajs也不例外.系列一的demo在首页使用了seajs.use() ,这便是入口方法.入口方法可以接受2个参数,第一个参数为模块名称,第二个为回调函数.入口方法定义了一个新的模块,这个新定义的模块依赖入参提供的模块.然后设置新模块的回调函数,用以在loaded状态之后调用.该回调函数主要是执行所有依赖模块的工厂函数,最后在执行入口方法提供的回调.

  • seajs中模块依赖的加载处理实例分析

    本文实例讲述了seajs中模块依赖的加载处理.分享给大家供大家参考,具体如下: 最近在做项目的时候发现一些关于模块依赖问题,特记录下: 比如现有3个文件: /*init.js*/ define(function(require, exports, module){ require('jquery'); require('jquery.plugA'); }) /*jquery.plugA.js*/ define(function(require, exports, module){ require

  • seajs下require书写约定实例分析

    本文实例讲述了seajs下require书写约定.分享给大家供大家参考,具体如下: require 书写约定 使用 Sea.js 书写模块代码时,需要遵循一些简单规则. 只是书写和调试时的规范!!!构建后的代码完全不需要遵循下面的约定!!!!!! 1. 正确拼写 模块 factory 构造方法的第一个参数 必须 命名为 require . // 错误! define(function(req) { // ... }); // 正确! define(function(require) { // .

  • 通过seajs实现JavaScript的模块开发及按模块加载

    seajs实现了JavaScript 的 模块开发及按模块加载.用来解决繁琐的js命名冲突,文件依赖等问题,其主要目的是令JavaScript开发模块化并可以轻松愉悦进行加载. 首先看看seajs是怎么进行模块开发的.使用seajs基本上只有一个函数"define" fn.define = function(id, deps, factory) { //code of function- } 使用define函数来进行定义一个模块,根据 CMD (Common Module Defin

  • Android开发中Listview动态加载数据的方法示例

    本文实例讲述了Android开发中Listview动态加载数据的方法.分享给大家供大家参考,具体如下: 最近在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数据如果一次性全部加载到arraylist,然后再加载到Listview中.我们必然会去单独开线程来做,这样造成的结果就是会出现等待时间很长,用户体验非常不好.我的想法是动态加载数据,第一次加载十条,然后往下面滑动的时候再追加十条,再往下面滑动的时候再去追加,这样大大减少了用户等待的时间,同时给处理数据留下了时间.网上看到了这样一

  • Android开发之底图局部加载移动的方法示例

    本文实例讲述了Android开发之底图局部加载移动的方法.分享给大家供大家参考,具体如下: public class MapMgr { public static MapMgr mapMgr = null; private int map_num = 28; private int b_x = 0; private int b_y = 0; private int width = 0; private int height = 0; private Bitmap bmpView = null;

  • Android开发实现自定义新闻加载页面功能实例

    本文实例讲述了Android开发实现自定义新闻加载页面功能.分享给大家供大家参考,具体如下: 一.概述: 1.效果演示: 2.说明:在新闻页面刚加载的时候,一般会出现五种状态 未知状态(STATE_UNKNOW).空状态(STATE_EMPTY).加载中(STATE_LOADING).错误(STATE_ERROT).成功(STATE_SUCCESS) 因为每个Detail页面都会出现,所以我们可以把他们封装成一个LoadPage的自定义view,可以复用 二.实现: 1.首先的定义三个布局,为什

  • iOS开发中UIWebView的加载本地数据的三种方式

    UIWebView是IOS内置的浏览器,可以浏览网页,打开文档 html/htm pdf docx txt等格式的文件. safari浏览器就是通过UIWebView做的. 服务器将MIME的标识符等放入传送的数据中告诉浏览器使用那种插件读取相关文件. uiwebview加载各种本地文件(通过loadData方法): UIWebView加载内容的三种方式: 1 加载本地数据文件 指定文件的MIMEType 编码格式使用@"UTF-8" 2加载html字符串(可以加载全部或者部分html

  • Android 开发中fragment预加载问题

    我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在这个activity刚创建的时候就变成需要初始化大量资源.这样的结果,我们当然不会满意.那么,能不能做到当切换到这个fragment的时候,它才去初始化呢? 答案就在Fragment里的setUserVisibleHint这个方法里.请看关于Fragment里这个方法的API文档(国内镜像地址:ht

  • Android开发实现ListView异步加载数据的方法详解

    本文实例讲述了Android开发实现ListView异步加载数据的方法.分享给大家供大家参考,具体如下: 1.主Activity public class MainActivity extends Activity { private ListView listView; private ArrayList<Person> persons; private ListAdapter adapter; private Handler handler=null; //xml文件的网络地址 final

  • Android 开发使用Activity实现加载等待界面功能示例

    本文实例讲述了Android 开发使用Activity实现加载等待界面功能.分享给大家供大家参考,具体如下: 实现加载等待界面我用了两种方式,一种是用PopupWindow实现,另一种便是用Activity实现.用PopupWindow实现方法请见我的另一篇博客: android使用PopupWindow实现加载等待界面 好了,下面开始.先上效果: 基本原理就是在主界面点击按钮(以登录按钮为例)之后,打开一个新的Activity,此Activity以对话框形式展示.首先,主界面(一个登录按钮以及

  • Android 开发使用PopupWindow实现加载等待界面功能示例

    本文实例讲述了Android 开发使用PopupWindow实现加载等待界面功能.分享给大家供大家参考,具体如下: 实现加载等待界面我用了两种方式,一种是用PopupWindow实现,另一种便是用Activity实现.用Activity实现方法请见我的另一篇博客: Android 使用Activity实现加载等待界面 首先看效果: 用PopupWindow实现此功能还是比较简单的,首先我们写一个布局,只有一个登录按钮,用于触发等待界面: <?xml version="1.0" e

  • 详解JavaScript两个实用的图片懒加载优化方法

    目录 一.方法一 二.方法二 InterSectionObserver 一.方法一 重点: 1.getBoundingClientRect().top > window.innerHeight 图片未出现 2.getBoundingClientRect().top < window.innerHeight 图片出现了 HTML: <ul> ...... <li>2222222222</li> <li>2222222222</li> &

随机推荐