Js模块话编程思想

为什么出现JavaScript的模块化编程思想

原因是在于之前的简单的直接式编程会导致
  • 逻辑混乱
  • 页面复杂
  • 可维护性差
  • 全局变量暴露等问题
所以就有大佬提出了很多的解决方案,其中之一就是JavaScript的模块化思想编程。
那么模块话思想又有什么有点值得我们学习:
  • 解决项目中的全局变量污染的问题。
  • 开发效率高,有利于多人协同开发。
  • 职责单一,方便代码复用和维护 。
  • 解决文件依赖问题,无需关注引用文件的顺序
说到js的模块化就不得不说是谁创建 了这个规范了那就是Commonjs社区的大佬了,他们制定了以下的这些规则
  • 模块的标识应遵循的规则(书写规范)。
  • 定义全局函数require,通过传入模块标识来引入其他模块,执行的结果即为别的模块暴露出来的API。
  • 如果被require函数引入的模块中也包含依赖,那么依次加载这些依赖。
  • 如果引入模块失败,那么require函数应该报一个异常。
  • 模块通过变量exports来向外暴露API,exports只能是一个对象,暴露的API须作为此对象的属性。
那么根据CommonJs规范我们可以知道,每个文件就是一个私有的作用于,是一个独立的模块,这个模块里面的方法,数据,属性全部都是私有的不对外开放的。也就是说外部的模块是无法访问到我们模块内的东西的,除非你将这个变量设置成全局的变量。

举个例子:

const a = 1;
const addA = function(value) {
  return value + a;
}
global.b = 1;

例如上面的代码中我们可以看到使用const定义的a变量和addA方法都是私有的外部是无法访问和使用的,当然b变量使用global定义,就成了全局的变量,此时外部是可以访问的。

那么我们应该怎么将私有的变量开放出去让大家都可以访问呢?

很简单

const addA = function(value) {
  return value + a;
}

module.exports.addA = addA;

像上面的代码这样,module.exports将我们这个方法开放出去,那么外部所有的模块便都能访问到我们这个模块的方法了。

那么外部如何访问呢

var example = require('./addA.js');
console.log(example.addA(1));  //2

外部文件访问这个方法的时候需要使用require方法访问,说白了CommonJS规范解决是解决之前的问题,但却不是一个很好的办法,它还存在着许多的问题,如它只可以在服务端使用,不可以在浏览器端使用,所有这时又出现了另一个规范那就是

AMD规范

AMD叫做异步模块定义。它采用了异步的方式来加载模块,然后在回调函数中执行主逻辑,因此模块的加载不影响它后面的模块的运行。

那么AMD也有自己的规范

  • 用全局函数define来定义模块;
  • id为模块标识,遵从CommonJS Module Identifiers规范
  • dependencies为依赖的模块数组,在factory中需传入形参与之一一对应
  • 如果dependencies的值中有"require"、“exports"或"module”,则与commonjs中的实现保持一致
  • 如果dependencies省略不写,则默认为[“require”, “exports”, “module”],factory中也会默认传入require,exports,module
  • 如果factory为函数,模块对外暴漏API的方法有三种:return任意类型的数据、exports.xxx=xxx、module.exports=xxx
  • 如果factory为对象,则该对象即为模块的返回值

具体分析AMD,我们通过require.js来进行。

require.js是一个非常小巧的JavaScript模块载入框架,是AMD规范最好的实现者之一,require.js的出现主要是来解决两个问题:

  • 实现JavaScript文件的异步加载,避免网页失去响应。
  • 管理模块的依赖性,管理模块的相互独立性,也就是我们常说的低耦合,这有利于代码的编写与维护。

那么AMD如何使用

define({
    method1: function() {},
    method2: function() {},
});
//等价于
define(function () {
    return {
        method1: function() {},
        method2: function() {},
    }
});

以上是AMD将方法开放出去的方式,使用define

那么外部接收的时候和commonjs一样使用require接收

require([module], callback);

其中两个参数一个module一个callback

module:表示一个数组,里面的成员就是需要加载的模块

callback:就是回调函数

虽然AMD模式的require实现了异步的模块化,但是依然有缺点,就是我们在调用这个方法的时候必须先加载才能调用,而不是想要加载了再调用,不科学,而且会导致初次加载模块的时候会很慢。

这个是就出现了救星了:

CMD 通用模块

CMD称作通用模块定义,由蚂蚁金服的大佬—玉伯提出,实现的js库成为sea.js。

简单的说他就是在AMD的有点上将缺点给摒弃了,也就是说改良了先加载再调用的缺点,sea.js可以实现需要时再加载库,且他还有两大特点:

  • Sea.js 遵循 CMD 规范,可以像 Node.js 一般书写模块代码。
  • 依赖的自动加载、配置的简洁清晰。

在CMD规范中,每一个文件都是自身独立的模块。

模块用define()来定义如:

// 所有模块都通过 define 来定义
define(function(require, exports, module) {

  // 通过 require 引入依赖
  var $ = require('jquery');
  var Spinning = require('./spinning');

  // 通过 exports 对外提供接口
  exports.doSomething = ...

  // 或者通过 module.exports 提供整个接口
  module.exports = ...

});

由上面代码可以看出,我们模块用define来定义一个模块,然后里面生成一个function的接口,这个接口有三个形参分别是require, exports, module

require:用来引入依赖

exports:对外提供一个接口

module:将整个模块的接口暴露出去

此时我们将AMD和CMD做个对比

// AMD规范
define(['./a', './b'], function(a, b) {  // 依赖必须一开始就写好  
   a.doSomething()    
   // 此处略去 100 行    
   b.doSomething()    
   ...
});
// CMD规范
define(function(require, exports, module) {
   var a = require('./a')   
   a.doSomething()   
   // 此处略去 100 行   
   var b = require('./b') 
   // 依赖可以就近书写   
   b.doSomething()
   // ... 
});

不难看出其实两个很像,基本就是一个?生的,整个代码中也就获取依赖的时候不一样,AMD一开始就必须先将依赖获取了才能进行下一步的操作,而CMD则是当我们需要的时候才获取依赖,这样就相当于在AMD的优点上,又去掉了人家的缺点。

亲亲这边建议学CMD就够了哦

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
完整版:https://download.csdn.net/download/qq_27595745/89522468 【课程大纲】 1-1 什么是java 1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3-1 java语言基础入门 3-2 数据的分类 3-3 标识符、关键字和常量 3-4 运算符 3-5 表达式 3-6 顺序结构和选择结构 3-7 循环语句 3-8 跳转语句 3-9 MyEclipse工具介绍 3-10 java基础知识章节练习 4-1 一维数组 4-2 数组应用 4-3 多维数组 4-4 排序算法 4-5 增强for循环 4-6 数组和排序算法章节练习 5-0 抽象和封装 5-1 面向过程的设计思想 5-2 面向对象的设计思想 5-3 抽象 5-4 封装 5-5 属性 5-6 方法的定义 5-7 this关键字 5-8 javaBean 5-9 包 package 5-10 抽象和封装章节练习 6-0 继承和多态 6-1 继承 6-2 object类 6-3 多态 6-4 访问修饰符 6-5 static修饰符 6-6 final修饰符 6-7 abstract修饰符 6-8 接口 6-9 继承和多态 章节练习 7-1 面向对象的分析与设计简介 7-2 对象模型建立 7-3 类之间的关系 7-4 软件的可维护与复用设计原则 7-5 面向对象的设计与分析 章节练习 8-1 内部类与包装器 8-2 对象包装器 8-3 装箱和拆箱 8-4 练习题 9-1 常用类介绍 9-2 StringBuffer和String Builder类 9-3 Rintime类的使用 9-4 日期类简介 9-5 java程序国际化的实现 9-6 Random类和Math类 9-7 枚举 9-8 练习题 10-1 java异常处理 10-2 认识异常 10-3 使用try和catch捕获异常 10-4 使用throw和throws引发异常 10-5 finally关键字 10-6 getMessage和printStackTrace方法 10-7 异常分类 10-8 自定义异常类 10-9 练习题 11-1 Java集合框架和泛型机制 11-2 Collection接口 11-3 Set接口实现类 11-4 List接口实现类 11-5 Map接口 11-6 Collections类 11-7 泛型概述 11-8 练习题 12-1 多线程 12-2 线程的生命周期 12-3 线程的调度和优先级 12-4 线程的同步 12-5 集合类的同步问题 12-6 用Timer类调度任务 12-7 练习题 13-1 Java IO 13-2 Java IO原理 13-3 流类的结构 13-4 文件流 13-5 缓冲流 13-6 转换流 13-7 数据流 13-8 打印流 13-9 对象流 13-10 随机存取文件流 13-11 zip文件流 13-12 练习题 14-1 图形用户界面设计 14-2 事件处理机制 14-3 AWT常用组件 14-4 swing简介 14-5 可视化开发swing组件 14-6 声音的播放和处理 14-7 2D图形的绘制 14-8 练习题 15-1 反射 15-2 使用Java反射机制 15-3 反射与动态代理 15-4 练习题 16-1 Java标注 16-2 JDK内置的基本标注类型 16-3 自定义标注类型 16-4 对标注进行标注 16-5 利用反射获取标注信息 16-6 练习题 17-1 顶目实战1-单机版五子棋游戏 17-2 总体设计 17-3 代码实现 17-4 程序的运行与发布 17-5 手动生成可执行JAR文件 17-6 练习题 18-1 Java数据库编程 18-2 JDBC类和接口 18-3 JDBC操作SQL 18-4 JDBC基本示例 18-5 JDBC应用示例 18-6 练习题 19-1 。。。
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值