JS模块化编程规范1——require.js
1. 概述
require.js是各种网络APP中非常常见的JS依赖库,它其实不仅仅是个模块加载器那么简单。它背后蕴含了一个非常重要的设计,也就是JS模块化编程。模块化是任何一个编程语言都会支持的设计,通过模块化能够将一个重要的问题拆分成一个个小的问题,并且模块与模块之间不关联(或者弱关联),减小的程序的开发难度。
最开始的时候,每个JS框架都会设计自己的模块加载方案,每次使用不同的JS的框架就得理解不同的模块加载方案。后来随着require.js的推广和使用,就逐渐形成了AMD(The Asynchronous Module Definition),也就是"异步模块加载机制"。这样,如果大家都约定使用同样的模块化规范设计,从一个框架到另外一个框架就没有成本,并且可以互相加载引入。
这里通过一个计算幂运算的例子,详细论述require.js的使用。
2. 详论
AMD模块规范听起来很高大上,但实际上并不是很复杂。模块化设计就是为了方便模块之间交互性,那么接口必然是统一而简约的,我们只要按照约定的规则来使用它即可。
2.1. 定义
模块化设计当然应该先定义一个模块了,这里定义一个乘法函数模块(Multiply.js):
//自定义模块
define(function () {
"use strict";
var Multiply = function(x, y) {
return x * y;
};
return Multiply;
})
再定义一个数学函数库模块,当然里面只有一个求幂运算函数(MyMath.js):
//自定义模块
define(["./Multiply"], function(Multiply){
"use strict";
function MyMath(){
}
MyMath.prototype.pow = function(base, exponent){
let result = 1;
for(let i = 0; i < exponent; i++){
result = Multiply(result, base);
}
return result;
}
var myMath = new MyMath();
return myMath;
})
这里两个例子说明了定义模块是通过define方法定义模块的,其中第一个参数可以是一个数组,指明该模块的依赖:
define([tools], function(){});
2.2. 调用
接下来在主函数(main.js)中调用自定义的数学函数库模块:
//函数立即执行,避免污染全局作用域
(function(){
"use strict";
require.config({
paths: {
"jquery": "./3rdParty/jquery-3.5.1",
"MyMath": "./MyMath"
}
});
//调用模块
require(["jquery", "MyMath"],function($, MyMath){
$("button").click(function () {
var base = $("#base").val();
var exponent = $("#exponent").val();
var result = MyMath.pow(base, exponent);
$("#result").val(result);
});
})
})()
这里加载了JQuery库,因为JQuery库是按照AMD标准规范来构建的,所以可以通过require.js来引入。
require.config是用来配置导入的库文件,用来给模块定义配置真正的路径和简短的名称。
通过require方法去加载自定义的数学库模块和JQuery模块,其中第一个参数定义了需要加载的模块;第二个参数则是加载成功之后的回调函数:
require(['modules'], callback);
2.3. 入口
接下来就是定义HTML页面脚本加载的入口了(RequireJSTest.html):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>RequireJS-AMD规范</title>
</head>
<body>
<div>
<div>
<label>求幂运算:</label>
</div>
<div>
<label>底数:</label>
<input type="number" value="2" id = "base">
</div>
<div>
<label>指数:</label>
<input type="number" value="8" id = "exponent">
</div>
<div>
<button type="button">结果为:</button>
<input type="number" id = "result">
</div>
</div>
<script src="3rdParty/require.js" data-main="main"></script>
</body>
</html>
其中,<script src="3rdParty/require.js" data-main="main"></script> 这句代码定义了脚本的加载入口,src当然是require.js的源代码,而data-main则会默认的将dota-main指定的js路径为根路径。
关于dota-main属性,mozilla.org的具体说明如下:data-* 全局属性 是一类被称为自定义数据属性的属性,它赋予我们在所有 HTML 元素上嵌入自定义数据属性的能力,并可以通过脚本在 HTML 与 DOM 表现之间进行专有数据的交换。
这里还要注意的是AMD规范的脚本加载是异步的,同时会预先加载所有的依赖模块的脚本直到完成,再进入本脚本内容。
3. 结果
运行结果如下,输入底数和指数后,点击按钮就会生成正确的结果:

4. 参考
JS模块化编程规范1——require.js的更多相关文章
- Javascript模块化编程之路——(require.js)
转自:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html Javascript模块化编程(一):模块的写法 随着网站逐渐变成&q ...
- require.js实现js模块化编程(一)
1.认识require.js: 官方文档:http://requirejs.org/RequireJS是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一.最新版本的Requ ...
- 初步理解require.js模块化编程
初步理解require.js模块化编程 一.Javascript模块化编程 目前,通行的Javascript模块规范共有两种:CommonJS和AMD. 1.commonjs 2009年,美国程序员R ...
- require.js实现js模块化编程(二):RequireJS Optimizer
require.js实现js模块化编程(二):RequireJS Optimizer 这一节,我们主要学习一下require.js所提供的一个优化工具r.js的用法. 1.认识RequireJS Op ...
- JS模块化编程(四)--require应用
获取&使用require.js 下载最新版的Require.JS.下载之后,把它放在项目的脚本文件夹下,比如 js 文件夹下,项目结构看上去应该是: 要充分使用Require.JS,将html ...
- 从273二手车的M站点初探js模块化编程
前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...
- js模块化编程之彻底弄懂CommonJS和AMD/CMD!
先回答我:为什么模块很重要? 答:因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块.但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写 ...
- 好文推荐系列-------(5)js模块化编程
本文主要来源于阮一峰的<Javascript模块化编程>系列文章整合,原文地址:http://www.ruanyifeng.com/blog/2012/10/javascript_modu ...
- JS模块化编程(二)
背景 我们常在页面引用js遇到下面情况 <script src="1.js"></script> <script src="2.js&quo ...
- [转]js模块化编程之彻底弄懂CommonJS和AMD/CMD!
原文: https://www.cnblogs.com/chenguangliang/p/5856701.html ------------------------------------------ ...
随机推荐
- MySQL PXC集群大事务提交超限
研发人员在测试大事务提交时遇见了错误: Got error 5 - 'Transaction size exceed set threshold' during COMMIT 测试了几次都是1200S ...
- XX-net安装
1.下载https://github.com/XX-net/XX-Net 2. 3. 4.运行google浏览器 5.找到安装XX-net的位置,点击即可访问google ps:校园网用户可以直接使用 ...
- 银河麒麟V10 修改文件夹权限
并不建议修改系统文件夹的权限,防止终端失效 指令:获取所有权限 指令:写入可执行权限 chmod +x filename//filename 是文件路径 TRANSLATE with x Englis ...
- Windows虚拟机环境下Linux设置固定IP地址
Linux 设置固定IP地址 安装环境是VMware Workstation Pro 15 安装完linux之后需要做的第一件事就是配置网络,有了网络我们可以下载插件,使用xshell工具连接等等 i ...
- [Python急救站课程]太阳花的绘制
太阳花的绘制 from turtle import * color('red', 'yellow') # 分别定义填充颜色 begin_fill() while True: forward(200) ...
- 自然语言处理历史史诗:NLP的范式演变与Python全实现
本文全面回顾了自然语言处理(NLP)从20世纪50年代至今的历史发展.从初创期的符号学派和随机学派,到理性主义时代的逻辑和规则范式,再到经验主义和深度学习时代的数据驱动方法,以及最近的大模型时代,NL ...
- SQL改写案例2
postgresql 并没有像 oracle .dm 有这么丰富的 hint,在不改 sql 的情况下能干预执行计划. 如果想学好 postgresql.kingbase.MySQL 的sql 调优 ...
- mobaxterm软件的使用
MobaXterm是一款功能强大的多功能远程计算机管理软件,可以在Windows操作系统下运行,支持SSH.Telnet.RDP.VNC等协议 一.软件下载与安装 下载地址:https://mobax ...
- XOR加密
coding=utf-8 md5算法 import hashlib h_md5 = hashlib.md5() x = input("输入需要加密的数据:") print( &qu ...
- 运行tomcat之后报一个:"Address localhost:1099 is already in use"错误
一.解决方案 1.错误原因 "地址 localhost:1099 已在使用中",是1099程序被占用,把1099程序后台停止掉即可. 2.解决方案 1.快捷键win+R打开CMD运 ...