转: seajs手册与文档之--模块定义
模块定义
在 SeaJS 中,所有 JavaScript 文件都应该用模块的形式来书写,并且一个文件只包含一个模块。
define
使用全局函数 define 来定义模块:
define(id?, dependencies?, factory);
id
当前模块的唯一标识。该参数可选。如果没有指定,默认为模块所在文件的访问路径。如果指定的话, 必须是顶级或绝对标识(不能是相对标识)。~~一般由优化工具生成
dependencies
当前模块所依赖的模块,是一个由模块标识组成的数组。该参数可选。如果没有指定,模块加载器会从 factory.toString() 中解析出该数组。~~~factory.toString()中用正则匹配require(..),提取依赖模块,所以一般不用传入dependencies
** 注意:强烈推荐不要设定 id 和 dependencies 参数。 在开发阶段,模块加载器会自动获取这两个参数。部署上线时,则可以通过优化工具来提取这两个参数。
factory
模块的工厂函数。模块初始化时,会调用且仅调用一次该工厂函数。factory 可以是函数, 也可以是对象、字符串等任意值,这时 module.exports 会直接设置为 factory 值。
factory 函数在调用时,会始终传入三个参数: require、exports 和 module, 这三个参数在所有模块代码里可用。 ~~~factory参数可以为字符串?
define(function(require, exports, module) {
// The module code goes here
});
exports
exports 用来向外提供模块的 API. ~~~注意 module.exports 和 exports指向同一对象, exports不能在模块定义代码中被重写 如 exports = { foo:function(){..}, bar:200 }
define(function(require, exports) {
// snip...
exports.foo = 'bar';
exports.doSomething = function() {};
});
除了给 exports 对象增加成员,还可以使用 return 直接向外提供 API.
define(function(require, exports) {
// snip...
return {
foo: 'bar',
doSomething: function() {};
};
});
如果 return 语句是模块中的唯一代码,可简化为:~~~直接传json到define(json)中
define({
foo: 'bar',
doSomething: function() {};
});
上面这种格式特别适合定义 JSON 数据。
** 注意:下面这种写法是错误的!
define(function(require, exports) {
// snip...
exports = { // 错误! exports 和 module.exports 无关联了,只是对象字面量而已
foo: 'bar',
doSomething: function() {};
};
});
模块加载器不能获取到新赋给 exports 变量的值。 请使用 return 或 module.exports 。
require
require 函数用来访问其他模块提供的 API. ~~~用require函数加载依赖模块 require(moduleID)
define(function(require) {
var a = require('./a');
a.doSomething();
});
它接受 模块标识 作为唯一参数。
请牢记,为了使静态分析能成功获取到模块依赖信息,在书写模块时,需要遵循一些简单的 规则。
require.async
该方法可用来异步加载模块,并在加载完成后执行回调函数。
define(function(require, exports, module) {
// 加载一个模块
require.async('./b', function(b) {
b.doSomething();
});
// 加载多个模块
require.async(['./c', './d'], function(c, d) {
// do something
});
});
require.resolve
使用 require() 的内部机制来解析并返回模块路径。该函数不会加载模块,只返回解析后的路径。
require.load
该方法可用来异步加载脚本,并在加载完成后,执行指定的回调函数。开发插件时, 可以通过覆盖该方法来实现自定义的资源加载。
require.constructor
有时候,我们需要给所有 require 参数对象添加一些公用属性或方法。这时, 使用 require.constructor 来实现会非常方便。
module
module 参数存储模块的元信息。拥有以下成员:
module.id
当前模块的唯一标识。 require(module.id) 必然返回此模块的 exports 。
define(function(require, exports, module) {
console.log(module.id); // http://path/to/this/file.js
console.log(require(module.id) === exports); // true
});
module.dependencies
module.dependencies 是一个数组,表示当前模块的依赖列表。
该数组只读:模块加载完成后,修改该数组不会有任何效果。
module.exports
exports 对象由模块系统创建,这不能满足开发者的所有需求, 有时候会希望 exports 是某个类的实例。 这时可用 module.exports 来实现:
define(function(require, exports, module) {
console.log(module.exports === exports); // true
module.exports = new SomeClass();
console.log(module.exports === exports); // false
});
注意,对 module.exports 的赋值需要同步执行,它不能放在回调函数里。 下面这样是不行的:
x.js:
define(function(require, exports, module) {
setTimeout(function() {
module.exports = { a: "hello" };
}, 0);
});
y.js:
define(function(require, exports, module) {
var x = require('./x');
console.log(x.a); // undefined
});
module.constructor
有时候,我们需要给所有 module 参数对象添加一些公用属性或方法。在这种情况下, 使用 module.constructor 可以很好地满足需求。
extend.js:
define(function(require, exports, module) {
var Module = module.constructor;
Module.prototype.filename = function() {
var id = this.id;
var parts = id.split('/');
return parts[parts.length - 1];
};
});
a.js:
define(function(require, exports, module) {
exports.filename = module.filename();
});
--------------------------------------------------------------------------------
那么,加载路径就是HelloSeaJS/assets/scripts/application/application.js(SeaJS会自动加上.js后缀)
如果你对你的程序有完全的控制权,建议使用data-main的方式,这样整个页面就只有一段script标签!作为一名前端开发人员,我不得不惊叹:干净、完美!
SeaJS在2.0之前,是采用SPM作为压缩合并工具的,到了2.0,改为Grunt.js,SPM变为包管理工具,类似NPM(不知道NPM?Google一下吧)
……
Grunt最核心的就两个部分,package.json、Gruntfile.js。
转: seajs手册与文档之--模块定义的更多相关文章
- 转: seajs手册与文档之 -- 模块标识
目录 模块标识 相对标识 顶级标识 普通路径 文件后缀的提示 模块标识 模块标识是一个字符串,用来标识模块.在 require. require.async 等加载函数中,第一个参数都是模块标识.de ...
- 转: seajs手册与文档之 -- require规则
require 规则 正确拼写 不要修改 使用直接量 动态依赖的小提示 书写规则 使用 SeaJS 书写模块代码时,需要遵循一些简单规则: 1. 正确拼写 在模块代码中,第一个参数 必须 命名为 re ...
- 转: seajs手册与文档之 -- 配置选项
config alias preload debug map base charset timeout noConflict config 可以使用 config 方法来配置seajs. seajs. ...
- 转: seajs手册与文档之 -- 快速参考 ( ~~useful )
目录 快速参考 seajs.use seajs.config define require require.async exports module.exports 快速参考 该页面列举了 SeaJS ...
- Sea.js 手册与文档
Sea.js 手册与文档 首页 | 索引 目录 何为 CommonJS 何为 CommonJS 模块 为何封装模块 何为 CommonJS? CommonJS 是一个有志于构建 JavaScript ...
- Winform开发框架中的内容及文档管理模块功能介绍
在开发项目的时候,我们有一些场景需要编辑一些HTML文档,作为内容发布系统的一部分,有时候也需要对一些文档如WORD文档进行编辑管理,这样需要我们对这些内容及文档进行合适的管理.本文主要介绍在WInf ...
- Seajs教程 配置文档
seajs.config Obj alias Obj 别名配置,配置之后可在模块中使用require调用require('jQuery'); seajs.config({ alias:{ 'jquer ...
- 三言两语聊Python模块–文档测试模块doctest
doctest是属于测试模块里的一种,对注释文档里的示例进行检测. 给出一个例子: splitter.pydef split(line, types=None, delimiter=None): &q ...
- Python(文件、文件夹压缩处理模块,shelve持久化模块,xml处理模块、ConfigParser文档配置模块、hashlib加密模块,subprocess系统交互模块 log模块)
OS模块 提供对操作系统进行调用的接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目 ...
随机推荐
- CSS3学习----选择器、字体
属性选择器: [att*=val]{}若att元素属性值包括val指定字符,则使用该样式 [att^=val]{}若att元素属性值开头字符为val,则使用该样式 [att&=val]{ ...
- POJ 2823 Sliding Window 【单调队列】
题目链接:http://poj.org/problem?id=2823 题目大意:给出一组数,一个固定大小的窗体在这个数组上滑动,要求出每次滑动该窗体内的最大值和最小值. 这就是典型的单调队列,单调队 ...
- HDU1506 ( Largest Rectangle in a Histogram ) [dp]
近期情绪太不稳定了.可能是由于在找实习这个过程碰壁了吧.第一次面试就跪了,可能是我面的是一个新公司,制度不完好,我感觉整个面试过程全然不沾编程,我面试的还是软件开发-后来我同学面试的时候.说是有一道数 ...
- linux多线程示例
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <pthread.h& ...
- js字面量
以前一直对js字面量模棱两可. '字面量是一种表示值的记法.' js字面量(literal) 分为以下几个 number literal 8 就是数字字面量 string liter ...
- HDU2008-数值统计
描述: 统计给定的n个实数中,负数.零和正数的个数. 代码: #include<stdio.h> #include<string.h> #include<iostream ...
- 技术是容易学会的(Copy)
1)自信第一.自信这东西很是奇怪,人有可能一开始会莫明其妙的自信,但一切都从这开始的.你觉得自己行你就一定会变得行,反之,如果觉得自已不行,那一定会不行.信心是我们转动飞轮的第一步,有了这一步我们的能 ...
- elasticsearch-5.0.0初见
基础概念 Elasticsearch有几个核心概念.从一开始理解这些概念会对整个学习过程有莫大的帮助. 接近实时(NRT) Elasticsearch是一个接近实时的搜索平台.这意味着,从索引一个文档 ...
- C文件操作(转载)
/*1.文件的打开(fopen函数)fopen函数用来打开一个文件,其调用的一般形式为:文件指针=fopen(文件名,文件操作方式):例如:FILE *fpinfpin=fopen("c:\ ...
- 07-C语言流程控制if、switch
目录: 一.流程控制 条件分支 if else 二.流程控制 开关分支 switch 回到顶部 一.流程控制 条件分支 1.语法格式:if(表达式1){ //表达式1为真(非0时),执行的语句部分. ...