| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> 前端模块化详解(CommonJS、AMD、CMD、ES Module) -> 正文阅读 |
|
[JavaScript知识库]前端模块化详解(CommonJS、AMD、CMD、ES Module) |
写在前面随着前端项目的不断复杂,代码日益膨胀,项目的维护难度随之越来越大,此时模块化也就相继的出现了,本篇文章将会介绍如下内容:
模块化的概念以及演变过程什么是模块化模块化就是将一个复杂的程序依据一定的规则或者说是规范,将其封装成几个单独的块(这里的块指的就是文件),在使用的时候将其组合在一起。 块内部的数据是私有的,只是向外部暴露一些接口或者说是一些方法,让其与其他模块进行通信。 模块化的演变过程早期的前端技术标准根本没有预料到前端会有现在一个规模,所以说很多设计上遗留的问题就导致了现在去实现前端模块化的时候会遇到很多的困难。 虽然说模块化现在已经被一些标准或者工具去解决了,但是它的一个演变过程还是值得我们去思考的。 模块化演变的过程其实就是前端领域的实践过程,这个过程大致可以分为四个阶段: 文件划分方式文件划分方式是最原始的模块系统,具体做法就是将一个功能以及它相关的一些状态单独存在不同的文件中,每一个文件就代表一个模块。使用这个模块就是将这个模块文件引入页面文件中,一个
使用这种方式的缺点很明显,如下:
命名空间方式命名空间方式就是在第一个阶段的基础上约定每一个模块只暴露一个全局对象,所有模块的成员都挂载到这个对象的下面。 示例代码如下:
通过这种方式减少了命名冲突的可能,但是仍然没有私有空间,且模块之间的依赖关系还是没有进行解决。 IIFE模式所谓的IIFE模式就是使用立即执行函数去创建闭包,这种方式为模块提供了私有空间。 具体的做法就是将模块中每一个成员都放在一个函数提供的私有作用域当中,对于需要暴露给外部的成员可以通过挂载到全局对象上的方式去实现。这种方式实现了私有成员的概念,就是说模块的私有成员只能在模块内部通过闭包的方式去访问而在外部,是没有办法去使用使用的这样就确保了私有成员的安全。 示例代码如下:
发展到这个阶段,就已经实现了私有成员的概念了,但是模块间的依赖关系还是没有解决。 IIFE依赖参数我们通过为立即执行函数添加参数的形式可以实现模块间的依赖,示例代码如下:
以上4个阶段就是早期开发者在没有工具和规范的情况下,对模块下进行的落地方式。 但是这种方式还是存在问题的,如下:
接下来我们来介绍一下现在开发过程中使用的模块化规范。 CommonJSCommonJS在Node.js中广泛应该,Node.js是CommonJS的实践者。CommonJS规范指出一个单独的文件就是一个模块,它采用的是同步加载模块,也就是说模块加载的顺序就是代码中编写的顺序是一致的,而加载的文件资源大多数都存储在服务器中,所以说加载速度没有什么问题。但是这种方案不适用与浏览器端,由于网络原因,更合理的方案是采用异步加载(CMD、AMD和ESmodule)。 基本语法暴露模块使用
模块加载机制我们现在来讲解一下上面代码,讲解上面代码的过程中就了解的CommonJS的模块加载机智。 首先通过 我们上面的代码中通过 当我们通过 AMDAMD是"Asynchronous Module Definition "的缩写。它与CommonJS不同,它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。 AMD规范的最佳实践者是require.js,现在我们来看一下require.js怎么用。 首选我们通过
CMDCMD规范是在sea.js推广中形成的,与AMD类似,不同点在于:AMD 推崇依赖前置、提前执行,CMD推崇依赖就近、延迟执行。 目前CMD已经不再用了,这里就不在介绍了。 ES Module概述在ES6之前, JavaScript一直没有一个官方提供的模块化的体系,所使用的都是社区所提供的,例如CommonJS和AMD等。但是在ES6的时候,ECMA提出了ESmodule规范,即原生的模块化体系。但是原生提供的模块化体系的兼容性并不是很好,下图展示了ESModule的浏览器兼容性 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HJvZjvV3-1639636102254)(image/01_ESmodule%E5%85%BC%E5%AE%B9%E6%80%A7.png)] 从上图中我们可以看到,IE浏览器完全不支持(虽然现在IE几乎已经死掉了),随着时间的推移,想Webpack这种打包工具的流行,慢慢的,ESmodule就进入大家的视野了。 语法特性如果想要在HTML中使用使用ES Module的话,需要为 ES Module有主要以下几个特性:
导入和导出导出成员可以通过
值得注意的是,批量导出成员的写法并不是导出一个对象,而是固定的语法,导出多个成员必须使用花括号包裹,如果想要导出对象,可以使用默认语法,示例代码如下:
使用ES Module导出成员,导出的是值得引用 ,也就是说如果模块内部的成员发生改变,所有引用该模块的地方都会发生改变。 我们也可以对导出成员通过
导入成员使用
值得注意的是,我们无法修改导入的成员的值,如果修改则会抛出异常示例代码如下:
异常信息为 如果我们只想要执行某个模块,并不需要模块内部的成员,可以直接通过 如果我们想要动态的引入某个成员,可以将
我们可以将导入的模块直接导出,示例代码如下:
在Node.js中使用ES Module如果我们想要在Node.js中使用ES Module,需要将后缀名改为
CommonJS的差异如果在Node中使用ES Module,是不能使用
写在最后本篇文章介绍了前端模块化的发展过程,以及常用的模块化规范。但是这么多模块规范,有的已经成为了历史,在浏览器端以及全部采用ES Module,而服务端现在用的比较多的还是CommonJS,但是在服务端可是可以使用ES Module。 也就是说模块化已经成为了前端开发者的必备技能了。 往期推荐 |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 9:29:16- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |