前端Javascript模块化

news2024/11/25 15:19:41

 🎬 岸边的风:个人主页

 🔥 个人专栏 :《 VUE 》 《 javaScript 》

⛺️ 生活的理想,就是为了理想的生活 !

在这里插入图片描述

目录

引言

前端模块化的发展历程

1.全局函数式编程

2.命名空间模式

3.CommonJS

require函数

module.exports

4.AMD(Asynchronous Module Definition)

5.UMD(Universal Module Definition)

6.ES6模块化

结论


 

引言

前端开发中,代码的组织和管理一直是开发者面临的一大挑战。随着Web应用日益复杂,对代码结构和组织的需求也更为明显。这种背景下,模块化编程应运而生,开发者们可以将复杂的代码拆分为可管理和可重用的模块。在本文中,我们将通过实际代码示例,来探索前端模块化的发展历程及各种模块化方案的实现原理。

前端模块化的发展历程

1.全局函数式编程

在早期的Web开发中,通常使用全局范围内声明函数和变量的方式来组织代码。例如:

var module1Data = 'module1 data';
function module1Func(){
    console.log(module1Data);
}

这种方式存在的问题主要有命名冲突、函数间依赖关系不明显、维护困难等。

2.命名空间模式

随着对代码组织方式的需求增加,开发者开始通过定义全局对象,将所有函数和变量封装在这个对象中,也就是命名空间模式。

var myApp = {
    module1Data: 'module1 data',
    module1Func: function(){
        console.log(this.module1Data);
    }
};

这种方式解决了全局命名冲突的问题,但是模块间的依赖关系依旧不明显,同时所有依赖都需要在命名空间对象中手动管理。

3.CommonJS

CommonJS模块规范是Node.js采用的规范,使用require函数加载模块,通过module.exports导出模块。

// a.js
module.exports = 'Hello world';

// b.js
var a = require('./a');
console.log(a); // 输出 'Hello world'

CommonJS使用同步加载方式,适用于服务器端,但由于网络请求的异步特性,不适合在浏览器环境使用。

require函数

require函数的主要任务是根据模块的文件路径读取模块文件,然后执行模块代码,最后返回模块的exports对象。

require函数的实现代码大致如下:

function require(modulePath){
    // 读取模块代码
    const code = fs.readFileSync(modulePath);
    
    // 包装模块代码
    const wrapper = Function('exports', 'require', 'module', '__filename', '__dirname', `${code}\n return module.exports;`);
    
    const exports = {};
    const module = { exports };
    
    // 执行模块代码
    wrapper(exports, require, module);
    
    // 返回模块的exports对象
    return module.exports;
}

其中,wrapper函数的参数exportsmodule就是模块的exportsmodule对象,这样我们就可以在模块中通过exportsmodule.exports来导出模块。

require函数在执行模块代码时,会先将模块代码包装到一个函数中,然后调用这个函数。这样做的好处是可以将模块代码隔离到一个函数作用域中,防止模块内的变量污染全局作用域。

module.exports

每个CommonJS模块都有一个module对象,这个对象有一个exports属性用于导出模块。当其他模块通过require函数加载这个模块时,就可以获取到module.exports对象。

module.exports的初始值是一个空对象{},我们可以添加属性到这个对象上,也可以直接将module.exports赋值为一个函数或其他类型的值。

例如,以下代码展示了如何使用module.exports导出一个函数:

// a.js
module.exports = function(){
    console.log('Hello world');
};

// b.js
const a = require('./a');
a(); // 输出 'Hello world'

以上就是CommonJS模块的实现原理。虽然CommonJS主要用于服务器端,但其模块化思想和实现方式对于前端模块化的发展有着深远影响。

4.AMD(Asynchronous Module Definition)

AMD规范是由RequireJS提出的,特点是异步加载模块,适合用在浏览器环境。

// AMD
define(['dependency'], function(){
    return 'module content';
});

AMD规范的语法较为复杂,但能在浏览器环境中异步加载模块。

5.UMD(Universal Module Definition)

UMD规范试图提供一种解决方案,让同一段代码在CommonJS和AMD环境中都能运行。

(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD
       

 define(['jquery'], factory);
    } else if (typeof exports === 'object') {
        // Node, CommonJS
        module.exports = factory(require('jquery'));
    } else {
        // 浏览器全局变量
        root.returnExports = factory(root.jQuery);
    }
}(this, function ($) {
    // 模块代码
}));

UMD通过判断环境中是否存在defineexports对象,来判断是哪种模块环境,从而使用对应的模块化方案。

6.ES6模块化

ES6模块化是ECMAScript 6(ES2015)中新引入的模块系统,使用import关键字加载模块,通过export关键字导出模块。

// a.js
export const a = 'Hello world';

// b.js
import { a } from './a.js';
console.log(a); // 输出 'Hello world'

ES6模块化具有静态性,这种静态性质让依赖关系更加明显,有利于工具进行优化。此外,ES6模块是异步加载,也适合在浏览器环境中使用。

结论

模块化是前端开发中的一种重要的编程思想,它让代码组织更加清晰,便于维护和重用。经过多年的发展,前端模块化方案已经从简单的全局函数,发展到当前的ES6模块化。每一种模块化方案都有其适用场景,选择哪种方案主要取决于项目的需求。理解不同模块化方案的实现原理,可以帮助我们更好地使用和选择这些工具。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1009471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

笔记(一)斯坦福CS224W图机器学习、图神经网络、知识图谱

节点和连接构成的图 如何对图数据进行挖掘? 传统机器学习,数据是独立同分布的,解决表格、矩阵、序列等问题 图机器学习处理连接的数据,需要满足以下几个方面: 1、图是任意尺寸输入2、图是动态变化的,有时…

Haproxy集群与常见的Web集群调度器

文章目录 1. Web集群调度器概述1.1 Web集群调度器简介1.2 调度器类别1.2.1 常用软件类1.2.2 常用硬件类 2. Haproxy软件介绍2.1 Haproxy简介2.2 支持功能2.3 主要特性2.4 常用调度算法2.4.1 轮询:RR(Round Robin)2.4.2 最小连接数&#xff1a…

软件测试与开发实训室建设方案

一 、系统概述 软件测试与开发实训室是软件开发过程中的一项重要测试活动,旨在验证不同软件模块或组件之间的集成与交互是否正常。综合测试确保各个模块按照设计要求正确地协同工作,以实现整个软件系统的功能和性能。以下是软件测试与开发实训室的一般流…

第一章 SQL Server 数据库部署

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。 个人主页:小李会科技的…

【黄色手套22】9话:栈和队列

目录 栈和队列的基本概念: 数据结构中的栈和队列: 栈和队列的基本结构: 1.栈和队列的结构示意图 2.栈和队列中数据的插入和删除 栈和队列的实现: 栈的实现 栈.c stack.h 源stack.c 队列的实现 队列.c queue.h queue.c…

使用branch and bound分支定界算法选择UTXO

BnB算法原理 分支定界算法始终围绕着一颗搜索树进行的,我们将原问题看作搜索树的根节点,从这里出发,分支的含义就是将大的问题分割成小的问题。 大问题可以看成是搜索树的父节点,那么从大问题分割出来的小问题就是父节点的子节点…

【办公自动化】用Python批量从上市公司年报中获取主要业务信息

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

电力系统优化:数字孪生的革新方法

数字孪生技术在电力系统中能够发挥令人瞩目的作用。这项技术不仅可以提高电力系统的可靠性和效率,还有助于降低能源浪费和环境影响。本文将深入探讨数字孪生技术在电力领域的多个关键应用领域,以展示其潜力和重要性。 数字孪生技术可以创建电力设备的虚拟…

农村怎样利用光伏发电?

随着经济快速发展,光伏、风电等可再生能源在农村地区普及率越来越高,极大推动了农业产业发展,提高了农民收入,改善了农村生态环境,促进了乡村各项工作健康发展。 光伏+农业是一种新兴的农业形式&#xff0…

如何获取美团的热门商品和服务

导语 美团是中国最大的生活服务平台之一,提供了各种各样的商品和服务,如美食、酒店、旅游、电影、娱乐等。如果你想了解美团的热门商品和服务,你可以使用爬虫技术来获取它们。本文将介绍如何使用Python和BeautifulSoup库来编写一个简单的爬虫…

文件上传漏洞~操作手册

目录 上传文件一般过滤方式 客服端校验 服务端校验 黑白名单机制 常规文件上传漏洞绕过 客户端绕过 1.游览器禁用JavaScript 2.正常burp suite抓包改包 服务端绕过 1.Content-Type绕过 2.黑名单绕过 1)命名规则绕过 2)大小写绕过 3&#x…

jvm的调优工具

1. jps 查看进程信息 2. jstack 查看进程的线程 59560为进程id 产生了死锁就可以jstack查看了 详细用途可以看用途 3. jmap 如何使用dump文件看下 查看 4.jstat 空间占用和次数 5. jconsole可视化工具 各种使用情况,以及死锁检测 6. visualvm可视化工具…

如何使用ArcGIS Pro提取河网水系

DEM数据除了可以看三维地图和生成等高线之外,还可以用于水文分析,这里给大家介绍一下如何使用ArcGIS Pro通过水文分析提取河网水系,希望能对你有所帮助。 数据来源 本教程所使用的数据是从水经微图中下载的DEM数据,除了DEM数据&a…

导入发运地点wsh_locations

当客户上的地址变更之后,发运事务处理上的地址还是原来的地址,发运上的地址来源table wsh_locations. 解决办法:运行接口请求,导入发运地点,日期可以范围包括地点变更的日期。 请求完成后再次查看地址发现地址已变更…

iwebsec靶场 文件包含漏洞通关笔记10-data伪协议利用

目录 前言 1.data伪协议 2.使用条件 第10关 data://伪协议利用 1.打开靶场 2.源码分析 3.渗透 (1)明文渗透 (2)base64编码渗透 前言 1.data伪协议 data协议和input协议差不多,指定data是get方法,…

从零基础到精通Flutter开发:一步步打造跨平台应用

💂 个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 导言 Flutter是一种流行…

QLabel 显示圆图并且含有边框 border-image

在一个label上流动显示头像,并且不能遮挡边框(如头像1-3),不想放两个label堆叠,所以最后采用了下述方法解决 1.设置边框还有图片 2.设置图片自适应 3.将头像切割成圆形 QPixmap pixmap QPixmap::fromImage(img); …

微信创建会员卡-47001错误

文档:1.新版会员卡介绍 | 微信开放文档 错误: 47001解析 JSON/XML 内容错误 接口: HTTP请求方式: POSTURL:https://api.weixin.qq.com/card/create?access_tokenACCESS_TOKEN 原因: 参数设置错误:["swipe_car…

JavaScript的基本数据类型如何使用?

JavaScript中的数据类型分为两大类,分别是基本数据类型和复杂数据类型(或称为引用数据类型),如图所示。 本节重点讲解基本数据类型。下面我们用代码演示基本数据类型的使用。 (1)数字型(Number),包含整型值和浮点型值: var numl 21; …

清华智能体宇宙火了;主流大语言模型的技术原理细节

🦉 AI新闻 🚀 清华智能体宇宙火了 摘要:清华大学联合北邮、微信团队推出了AgentVerse,这是一个可以轻松模拟多智能体宇宙的环境。它专为大语言模型开发,智能体可以利用LLM能力完成任务。AgentVerse提供了几个示例环境…