amd模块化

news/2024/11/29 8:47:52/

一、amd定义及规范说明

  • AMD(Asynchronous Module Definition):异步模块加载机制,是一个在浏览器端模块化开发的规范。
  • 什么是异步模块加载机制:JavaScript在浏览器中被解析和执行时具有阻塞的特性,当JavaScript代码执行时,页面的解析、渲染以及其他资源的下载都要停下来等待脚本执行完毕。
  • 模块化的标准规范函数:异步加载模块require.js,依赖前置:在一开始就将所有依赖项加载完全 ,
  • API—define():具有异步性。当define函数执行时,它首先会异步的去调用第二个参数中列出的依赖模块,当所有的模块被载入完成之后,如果第三个参数是一个回调函数则执行,然后告诉系统模块可用,也就通知了依赖于自己的模块自己已经可用

   1、RequireJs  介绍

    requireJs主要解决两个问题

     (1)多个js文件可能有依赖关系,被依赖的文件需要早于依赖它的文件加载到浏览器,即依赖性最大的文件有一定要放在最后面加载【解决:管理每个模块之间的依赖,便于维护】

      (2)js加载的时候浏览器会停止页面渲染,加载文件越多,页面失去响应时间越长【解决:实现js文件的异步加载,避免网页失去响应】

     requireJs 使用

    (1)require.js下载下来之后引包,放在目录上。

<script src="js/require.js"></script>

    (2)定义模块

    每个模块都有自己独立的作用域,在定义模块的时候,使用requirejs提供的函数define()来定义,语法函数如下:

define("模块名称", ["模块的依赖项"], function(){函数体:模块的具体实现,模块中所有的代码全都放在该函数中})

(3)在require.js中,使用require.js提供的函数 require()来引用一个模块

require(["模块文件的路径(不带.js后缀的)"], function(){模块加载成功之后的回调函数模块的加载是异步的,在模块加载完成之后,才能使用模块的相关功能})

   requireJs 案例及详解

下面代码定义了一个alpha模块,并且依赖于内置的require,exports模块,以及外部的beta模块。可以看到,第三个参数是回调函数,可以直接使用依赖的模块,他们按依赖声明顺序作为参数提供给回调函数。这里的require函数让你能够随时去依赖一个模块,即取得模块的引用,从而即使模块没有作为参数定义,也能够被使用;exports是定义的alpha 模块的实体,在其上定义的任何属性和方法也就是alpha模块的属性和方法。通过exports.verb = ...就是为alpha模块定义了一个verb方法。例子中是简单调用了模块beta的verb方法。

define("alpha", ["require", "exports", "beta"], function (require, exports, beta) {
exports.verb = function() {
return beta.verb();//或者:return require("beta").verb();}});

  匿名模块

define 方法允许你省略第一个参数,这样就定义了一个匿名模块,这时候模块文件的文件名就是模块标识。如果这个模块文件放在a.js中,那么a就是模块名。可以在依赖项中用"a"来依赖于这个匿名模块。匿名模块是高度可重用的。拿来一个匿名模块,随便放在一个位置就可以使用它,模块名就是它的文件路径

define(["alpha"], function (alpha) {
return {
verb: function(){
return alpha.verb() + 2;
}
};
});

以上代码就定义了一个依赖于alpha模块的匿名模块:

仅有一个参数的define

define的前两个参数都是可以省略的。第三个参数有两种情况,一种是一个JavaScript对象,另一种是一个函数。如果是一个对象,那么它可能是一个包含方法具有功能的一个对象;也有可能是仅提供数据。后者和JSON-P非常类似,因此AMD也可以认为包含了一个完整的 JSON-P实现。模块演变为一个简单的数据对象,这样的数据对象是高度可用的,而且因为是静态对象,它也是CDN友好的,可以提高JSON-P的性能。

例如:一个提供中国省市对应关系的JavaScript对象,如果以传统JSON-P的形式提供给客户端,它必须提供一个callback函数名,根据这个函数名动态生成返回数据,这使得标准JSON-P数据一定不是CDN友好的。但如果用AMD,可以生成一个数据文件。

define({
provinces: [
{
name: '上海名',
areas: ['浦东新区', '徐汇区']},
{
name: '江苏',
cities: ['南京', '南通']}//.....]
});

假设这个文件名为china.js,那么如果某个模块需要这个数据,只需要:

define(['china'], function(china){
//在这里使用中国省市数据});

如果参数是一个函数,其用途之一是快速开发实现。适用于较小型的应用,你无需提前关注自己需要什么模块,自己给谁用。在函数中,可以随时require自己需要的模块。例如:

define(function(){
var p = require('china');//使用china这个模块});

即你省略了模块名,以及自己需要依赖的模块。这不意味着你无需依赖于其他模块,而是可以让你在需要的时候去require这些模块。define方法在执行的时候,会调用函数的toString方法,并扫描其中的require调用,提前帮助你载入这些模块,载入完成之后再执行。这使得快速开发成为可能。需要注意的一点是,Opera不能很好的支持函数的toString方法,因此,在浏览器中它的适用性并不是很强。但如果你是通过build工具打包所有的 JavaScript文件,这将不是问题,构建工具会帮助你扫描require并强制载入依赖的模块。


http://www.ppmy.cn/news/749331.html

相关文章

区分计算机和服务器的内存条,AMD专用内存是什么意思 AMD专用内存和普通内存条的区别及真相...

相信一些用户在网上在购买内存的时候找到一些低价位的内存,看描述上写有“AMD专用内存”,AMD专用内存是什么意思?那么对于这种称为AMD专用内存的不难理解,肯定intel平台是使用不了的,而只有AMD平台能够使用,今天装机之家来给大家说说AMD专用内存和普通内存条的区别及真相…

amd支持服务器内存,amd专用内存和普通的内存有什么区别?

相信大家都知道内存对于电脑来说是一个非常重要的作用,不知道大家有没有听说过amd专用内存条?对这方面不太熟悉的朋友不妨进来看看,为了防止以后给一些不良的商家欺骗,赶紧进来学习一下吧。 AMD专用内存简介 AMD专用内存是指那些采用服务器内存标准,或者干脆直接从废旧服务…

amd支持服务器内存,AMD专用内存和普通内存的区别是什么?

AMD专用内存和普通内存的区别是什么?很多伙伴在购买内存的时候,可能会看到“AMD专用内存”字样,那么AMD专用内存是什么意思呢?当然就是只有AMD平台能够使用,对于intel平台是使用不了的。由于很多伙伴都在疑惑AMD专用内存和普通内存有什么区别,下面小编就给大家说说吧! 一…

AMD规范

在读某第三方的源代码时&#xff0c;发现一个define()方法&#xff0c;随即开始了AMD语法的学习&#xff0c;随将学习成果分享如下&#xff1a; 一&#xff0c;ADM规范背景调查 前端技术在不断的发展之中&#xff0c;很多公司会开发自己的框架来用。开发一个自己会用的框架并…

SpringMVC JDK17 SpringFramework6x Tomcat10遇到的找不到资源404问题以及SercletException

发生资源找不到异常 本人使用Tomcat9 与 jdk17 时无任何冲突可以随便使用 Springframework6x系列 对应的应该时tomcat10版本 在使用过程中遇到两个问题 1.依赖问题 <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</a…

【浏览器篇】记录下浏览器保存PDF文件不同方式的小区别

【浏览器篇】记录下浏览器保存PDF文件不同方式的小区别 以前不太注意这些&#xff0c;最近搞文档比较多才发现为何保存的一部分PDF文件里面字体可以复制可以搜索&#xff0c;一部分保存的PDF里面的字体却无法复制、无法搜索等&#xff0c;发现是不同保存方式得到的文档权限不一…

鼠标禁用光标,禁用鼠标样式

鼠标禁用光标,禁用鼠标样式 是一个红圈加斜杠的鼠标光标 cursor: not-allowed;

关闭笔记本电脑的鼠标区

针对笔记本电脑没有鼠标快捷关闭的电脑。 1、打开控制面板 2、打开硬件和声音 3、打开鼠标选项卡&#xff0c;如图 4、去掉启用Touchpad前面的勾&#xff0c; 5、如果没有Touchpad选项卡&#xff0c;去网上下载Touchpad驱动&#xff0c;重启电脑继续上面步骤即可