小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
requirejs
体验requirejs
requirejs是第一个模块化开发框架,提出了module transports规范, 基于前段模型的规范(加载时都是异步的),又借鉴于nodejs,也支持comminjs规范,建议我们使用module transports 规范
requirejs是基于AMD规定
require.js官网
requirejs.org
requirejs.cn
使用requirejs跟seajs一样要在页面中引入文件才可以使用
根目录:
如果没有data-main属性, 默认是以html文件为根目录
如果使用data-main属性, 默认是以data-main属性值为根目录
seajs是以seajs所在的文件目录为根目录
requirejs是以引入html文件的目录为根目录
引入requirejs会向全局暴露3个变量
require和requirejs是一样的
这里的require方法和seajs中seajs对象一样
引入requirejs的script标签上有一个data-main属性,它可以引入项目的入口文件
<script type="text/javascript" data-main="js/main.js" src="js/require.js"></script>
除了以上方式还有另外一种方式可以引入项目的入口文件
require方法和sejas.use方法一样的,它也可以引入入口文件
接受两个参数
第一个参数是模块的依赖集合
必须是数组
第二个参数是回调函数
回调函数中的参数就是前面模块向外暴露的功能 (一一对应的)
作用域是window
requirejs对js文件敏感,因此可以省略.js后缀
<script type="text/javascript">
// 引入入口文件
require(["js/main.js"], function(main) {
console.log(this);
console.log(main);
})
</script>
定义模块
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一定要与模块路径统一)
举例:
// 定义模块
// 值类型
define(1);
// 这种方式是不允许的
define("abc");
define(true);
// 传入对象
define({
color: "red"
})
// 传递函数
define(function(require, exports, module) {
console.log(this);
console.log(arguments);
this.color = "red";
})
// 传递两个参数,第一参数是字符串
define("dom", function(require, exports, module) {
console.log(this);
console.log(arguments);
})
// 传递两个参数,第一个参数是数组
define(["color", "require", "exports", "module"], function(color, require, exportsm, module) {
console.log(this);
console.log(arguments);
this.color = "blue";
})
// 传递三个参数
define("dom", ["color", "require", "exports", "module"], function(color, require, exports, module) {
console.log(this);
console.log(arguments);
})