第三阶段: AMD规范(Asynchronous Module Definition:异步模块定义) | |
|
|
| AMD标准中,定义了下面两个API: 1.require([module], callback) 2.define(id, [depends], callback) 即通过define来定义一个模块,然后使用require来加载一个模块。 并且,require还支持CommonJS的模块导出方式。 |
| require.js 主要解决两个问题:
|
| 定义模块
|
| 使用模块
|
| data-main
|
| require.config
|
| require.config({ //默认情况下从这个文件开始拉去取资源 baseUrl: 'scripts/app', //如果你的依赖模块以pb头,会从scripts/pb加载模块。 paths: { pb: '../pb', }, // load backbone as a shim,所谓就是将没有采用requirejs方式定义 // 模块的东西转变为requirejs模块 shim: { backbone: { deps: ['underscore'], exports: 'Backbone', }, }, }); |
| 优点:
|
| 缺点:
|
| 特点:
|
// 文件名: foo.js
define(['jquery', 'underscore'], function ($, _) {
// 方法
function a(){}; // 私有方法,因为没有被返回(见下面)
function b(){}; // 公共方法,因为被返回了
function c(){}; // 公共方法,因为被返回了
// 暴露公共方法
return {
b: b,
c: c
}
});
// Demo目录
|-js
|-libs
|-require.js
|-modules
|-article.js
|-user.js
|-main.js
|-index.html
// user.js文件
// 定义没有依赖的模块
define(function() {
let author = ‘Fly'
function getAuthor() {
return author.toUpperCase()
}
return { getAuthor } // 暴露模块
})
// article.js文件
// 定义有依赖的模块
define(['user'], function(user) {
let name = 'SeriousLose'
function consoleMsg() {
console.log(`${name} by ${user.getAuthor()}`);
}
// 暴露模块
return { consoleMsg }
})
// main.js
(function () {
require.config({
baseUrl: 'js/', // 基本路径 出发点在根目录下
paths: {
//映射: 模块标识名: 路径
article: './modules/article', // 此处不能写成article.js,会报错
user: './modules/user'
}
})
require(['article'], function (alerter) {
article.consoleMsg()
})
})()
// 需要引入第三方库,则需要在 main.js 文件中引入
(function() {
require.config({
baseUrl: 'js/',
paths: {
article: './modules/article',
user: './modules/user',
// 第三方库模块
jquery: './libs/jquery-1.10.1'// 注意:写成jQuery会报错
}
})
require(['article'], function(alerter) {
article.consoleMsg()
})
})()
// index.html文件
<!DOCTYPE html>
<html>
<head>
<title>Modular Demo</title>
</head>
<body>
<!-- 引入require.js并指定js主文件的入口 -->
<script data-main="js/main" src="js/libs/require.js"></script>
</body>
</html>