首页 > 其他分享 >什么是前端模块化

什么是前端模块化

时间:2024-08-26 10:58:17浏览次数:9  
标签:CommonJS 模块化 前端 AMD 模块 什么 加载

面试中,关于打包工具的相关知识是非常常见的考题,无可避免的可能会被问到,为什么需要使用到打包工具、或前端工程化的实现,而要回答这些问题前,需要先了解的就是前端模块化。所以在本篇笔记中,会让大家了解前端模块化的演进和功用。

文末有我帮助500多人拿到前端offer的文章 !!!

什么是模块化?

开发人员将代码或系统分割为不同模块的过程,就称为模块化。每个模块就代表一个完整的小程序或小功能,所有模块组装起来成为一个整体,进而完成整个系统的功能要求。

Node.js 几乎一开始就支持模块化,相比之下 Web 开发,模块化应用进展慢了许多,但到今日也出现了许多支持前端模块化的工具。

为什么需要前端模块化?

我们先来想像如果今天不用打包工具、模块化语法,要如何在浏览器上执行 JavaScript?

  • 方法一:每个功能就是一个 JavaScript script 文件并加载。但此方法会让代码难以扩展,加载太多 script 也会导致网络瓶颈,并且也有加载先后顺序的相依性问题。
  • 方法二:使用一个统一的大 .js 文件,将所有功能都包含在其中,但这会导致维护、易读性方面的问题。

模块化工具出现之前,会通过一些方案来解决上述的做法问题,最常见的就是通过立即执行函数 (IIFE),它其实是利用函数的闭包特性来实践数据私有化和共享方法,如下示例

const muduleB = (function () {
  return {
    number: 200,
  };
})();

const moduleA = (function (otherModule) {
  let number = 100;

  function getNumber() {
    console.log(number + otherModule.number);
  }

  return { getNumber };
})(muduleB);

我们可以通过moduleA拿到getNumber方法,并且实践number变量的私有化,防止外部调用,此外moduleA也可以引入其他module,通过这种方式,我们就可以在 moduleA 中使用其他模块,进而解决很多问题。

moduleA.getNumber(); // 300
moduleA.number; // undefined

IIFE 的做法也成为现在模块化的概念来源。但随着前端对模块需求越来越大,逐渐出现了一些模块化解决方案、并演变成了通用的规范,从 CommonJS 到现在的 ES Module(ESM)。下个段落会介绍各个通用的模块化规范

JS 模块化规范

CommonJS

当 Node.js 发布时,它带来了新的挑战。因为 JavaScript 不是在浏览器中运行,因此没有可以添加到其中的 html 文件和脚本标签,那么 Node 应用程序应该如何加载不同的代码呢?- 通过 CommonJS。 CommonJS 规范在 2009 年被社区开发出来,引入了 require 和 export 声明模块的语法,一个文件就是一个模块,是以同步的方式加载模块,因此适合服务器端的开发。

AMD(Async Module Definition)

AMD 在中文是非同步模块定义的意思。它起源于 Dojo 工具箱(一套 JavaScript Web 应用程序库)。同时, AMD 一开始就是为浏览器而设计的,目前为止,最受欢迎的 AMD 实现是 RequireJS (一个 JavaScript 模块加载器)。 AMD 可以自动决定相依关系,模块是以非同步方式加载,避免阻塞的问题,并且可以把多个模块定义在同一个文件中。

CMD(Common Module Definition)

CMD 的出现较晚一些, Sea.js 在 2012 年开始推广,它汲取了 CommonJS 和 AMD 规范的优点,也是专门用于浏览器的异步模块加载。在规范中,一个文件就是一个模块。

UMD(Universal Module Definition)

AMD 和 CommonJS 是最受欢迎的两套模块标准,也各有优缺点,通常开发者会根据自己的需求选择不同的标准。但是,我们也有可能会去使用到不同标准所开发出来的代码,这可能就会造成问题。一种解决方案就是 UMD,它可以让 AMD 和 CommonJS 使用同一份文件。

ES Module(ESM)

ES6 发布之后,终于实现了模块的功能,并结合了 CommonJS 和 AMD 的两者优点

  • 类似 CommonJS,引入简单的语法如 export 和 import,并且也是一个文件为一个模块
  • 类似于 AMD 也有支持非同步加载

模块打包工具 (Module Bundler) 的作用

上个段落介绍了不同模块规范,以及 RequireJS 等模块加载工具被创建,让我们能在浏览器中使用模块。然而,虽然有这些模块化工具,因为各家浏览器支持度不同等问题,导致有时候如果你想用别人写好的模块 (例如 npm 上的包),很可能没办法顺利引用。

因为有浏览器模块机制相容性、兼容性的问题,前端业界后来发展出 webpack 等工具,协助开发者打包模块,所以假如你的代码中,有使用某个 npm 的包,webpack 会协助你打包,让他变得像是你自己写的模块,这有效解决浏览器模块功能支持度的问题。

除此之外,webpack 这类的不只帮助我们加载管理代码的模块。它进一步扩展到可以支持不同的资源加载,让各种不同资源都可以变成一个模块 (如:图像、字体和样式表)。此外,它可以有其他优化,提供更好的使用者和开发者体验。

偏爱前端的晓羽:称作2024很强的前端面试场景题,成功帮助532人拿到offer

给你们推荐一篇我帮助500+名同学完成改造的文章,希望大家看完以后都可以领取到心仪的offer哦

标签:CommonJS,模块化,前端,AMD,模块,什么,加载
From: https://blog.csdn.net/2401_84489283/article/details/141496323

相关文章

  • 什么是锚文本?
    什么是锚文本?锚文本是链接中可见的可点击文本。它通常以与周围文本不同的颜色显示,并且通常带有下划线。好的链接文本会告诉读者点击链接后会得到什么。使用正确的锚文本会增加用户点击链接的机会,并通过提供上下文来帮助搜索引擎。锚文本为你的页面和你链接的内容之间的关系提......
  • GO语言从前端传来的表格数据和表格标题导出到Excel表格中
    提示:使用Go将前端表格数据和标题导出到Excel表格中,你可以使用第三方库,如"xlsx"。数据的操作流程遵循:分析数据格式→确定数据对象→解析→构建表格→生成文件。以下是一个简单的示例,展示了如何在Gin框架中实现该功能:文章目录一、表格样式二、使用步骤1.引入库2.创建路......
  • 大模型如何赚钱,杀手级应用是什么、创业机会在哪里?
    除了通义大模型外,MiniMax、月之暗面、智谱AI、猎户星空、零一万物、百川智能六家大模型厂商已经与钉钉达成合作。目前,钉钉生态伙伴总数超过5600家,其中AI生态伙伴已经超过100家;钉钉AI每天调用量超1000万次。在下午的圆桌对话环节,硅星人创始人骆轶航、金沙江创投主管合伙......
  • 前端宝典二十:高频算法之双指针、滑动窗口、二叉树
    一、前言学好算法的根基是:刷题!刷题!刷题!本文将深入探讨高频算法中的双指针、滑动窗口以及二叉树。题目均来源于https://leetcode.cn/。重点关注每种题目的解题思路和总结,通过详尽的解答,包括解答思路和每一步的代码实现,以帮助读者快速理解并掌握这些算法。二、双指针双指......
  • 全面解析:前端调用接口常见HTTP状态码及其含义
    前端在调用接口时,通常会遇到不同的HTTP状态码。每个状态码都代表了服务器对客户端请求的不同响应。以下是常见的HTTP状态码及其含义:1xx信息响应100Continue:服务器已经接收到请求头,客户端应继续发送请求主体。101SwitchingProtocols:服务器同意客户端请求切换协议。......
  • 为什么说 Swoole 是 PHP 程序员技术水平的分水岭?
    大家好,我是码农先森。谈到这个话题有些朋友心中不免会有疑惑,为什么是Swoole而不是其他呢?因为Swoole是基于C/C++语言开发的高性能异步通信扩展,覆盖的特性足够的多,有利于PHP程序员接触更全面的技术知识点。大多数的朋友踏入到PHP的大门都是因其简单的语法及其弱类型的特......
  • 异源数据同步 → DataX 为什么要支持 kafka?
    开心一刻昨天发了一条朋友圈:酒吧有什么好去的,上个月在酒吧当服务员兼职,一位大姐看上了我,说一个月给我10万,要我陪她去上海,我没同意朋友评论道:你没同意,为什么在上海?我回复到:上个月没同意前情回顾关于DataX,官网有很详细的介绍,鄙人不才,也写过几篇文章异构数据源同步之数据......
  • FastAdmin前端开发——词条生成二维码
    一、前端开发基础文件序号文件路径功能1application/index/controller控制器文件2application/index/lang/zh-cn语言包3application/index/model模型文件4application/index/view/common/sidenav.html左侧菜单栏5application/index/view/index.html右侧列表视图6application/i......
  • 本科毕业答辩老师会问什么问题?
    本科毕业答辩中,老师可能会问的问题通常围绕以下几个方面:1. 论文内容理解:你对论文的主要观点和论点有何理解?你如何定义论文中的关键术语或概念?2. 研究方法:你为何选择这种方法进行研究?你的研究设计是如何的?它的优势和局限性是什么?3. 数据分析:你是如何收集和分析数据的......
  • idea控制vue项目启动(前后端分离中的前端)(自用
    EditControl…… npm 选中vue的package.json(后端注意设置端口为8080之外的) scripts选serve 启动时不要使用debug模式 ......