五、 requirejs
5.1 体验requirejs
requirejs
是第一个模块化开发框架,提出了module transports
规范, 基于前段模型的规范(加载时都是异步的),又借鉴于nodejs
,也支持comminjs
规范,建议我们使用module transports
规范
1 | requirejs是基于AMD规定 |
根目录:
1 | 如果没有data-main属性, 默认是以html文件为根目录 |
引入requirejs
会向全局暴露3个变量
require
和requirejs
是一样的
这里的require
方法和seajs
中seajs
对象一样
引入requirejs
的script
标签上有一个data-main
属性,它可以引入项目的入口文件
1 | <script type="text/javascript" data-main="js/main.js" src="js/require.js"></script> |
除了以上方式还有另外一种方式可以引入项目的入口文件
require
方法和seajs.use
方法一样的,它也可以引入入口文件
接受两个参数:
第一个参数是模块的依赖集合
- 必须是数组
第二个参数是回调函数
回调函数中的参数就是前面模块向外暴露的功能 (一一对应的)
作用域是
window
requirejs
对js
文件敏感,因此可以省略.js
后缀
1 | <script type="text/javascript"> |
5.2 定义模块
requirejs
和seajs
一样, 都有一个define
方法,用来定义模块
可以传递一个参数:
值类型 不能字符串
对象 require也支持
函数
此时函数遵循commonjs规范,requirejs提供了参数注入的技术,想要使用哪个模块就要注入哪个模块
向外暴露功能一定是基于commonjs规范
如果没有注入参数
- 作用域是window
如果注入参数
- 作用域是向外暴露功能的对象
可以传递两个参数:
第一个参数是一个字符串
第一个参数还可以是数组
第二个参数加载模块的函数
如果第一个参数是字符串,表示模块的id,此时函数遵循commonjs规范(与上面传递函数的表现形式一致)
如果第一个参数是数组, 表示模块的依赖集合, 此时函数遵循的是module transports规范
如果想要使用哪个模块,就必须在依赖集合中注入哪个模块,包括内置模块(require, exports, module),此时函数中的参数是和前面模块向外暴露的接口是一一对应。
如果注入exports和module
- 作用域指向向外暴露功能的对象
如果没有注入exports和module
- 作用域是window
可以传递三个参数:
第一个参数是字符串,表示模块的id
第二个参数是数组,表示模块的依赖集合
第三个参数是回调函数,此时的函数遵循module transports 规范
在module transports规范中,定义的任何模块文件,都不要与内置模块的名称相同(require, exports, module)
在工作中,最后一种方式是最常用的(id一定要与模块路径统一)
1 | // 定义模块 |
5.3 引入具有id的模块
当一个模块没有id的时候可以直接引入
当一个模块有id,此时无法直接引入
第一步要在模块依赖集合中加载模块文件
第二步通过require方法指定id(require是异步方法)
comminjs规范不能加载具有id的模块
1 | // 加载具有id的模块 |
dom.js
1 | define("myId", { |
5.4 模块的覆盖关系
如果一个模块文件中有两个没有id的模块,前面的覆盖后面的模块
如果模块文件中有两个相同id的模块, 前面的覆盖后面的模块
如果一个模块文件中有两个不同id的模块,是可以同时存在的
1 | // 两个没有id的模块 |
5.5 接口定义
在seajs中定义接口的方式:
1 | exports.接口 |
以上方式都是基于commonjs规范, requirejs同样适用
1 | return 值类型 |
以上三种方式,是基于(module transports
)规范的,因为不依赖于 require
, exports
, module
开发更灵活
define
可以接受值类型,不能接受字符串
除了以上十种方式,当模块函数中注入exports
和module
的时候,作用域是向外暴露功能的对象
因为可以通过this
向外暴露接口
1 | // 定义模块 |
5.6 模块对象
id: 表示的是模块的id, 默认值与uri不一致
uri: 模块的文件地址, 是相对于html文件目录
如果没有data-main属性, 路径的前面会多一个
./
config: 配置模块信息的
exports: 暴露功能的接口对象