前端模块化

为什么要模块化?

当开发复杂项目时,模块化能解决以下问题:

  • 避免变量污染:通过隔离作用域,避免全局变量的干扰。
  • 提升代码的维护性:模块化组织代码后,每个模块专注于自身的功能,减少了耦合性。
  • 增强代码的可读性:模块化明确了依赖关系,代码结构更加清晰。
  • 方便协作开发:开发者可以专注于自己的模块,减少冲突。

模块化的意义是什么?

模块化的核心是 隐藏内部实现暴露外部接口

  1. 隐藏实现:封装细节,让模块内部的变量和方法不会泄漏到外部。
  2. 暴露接口:通过接口提供功能,外部只需关注如何调用,而无需关心实现细节。

模块化规范

1. CommonJS

背景
CommonJS 是为 Node.js 提供模块化支持而诞生的,它专注于服务端开发,是一种同步加载模块的规范。

导出
  1. 通过 exports 导出单个属性或方法

    exports.add = function (a, b) {
        return a + b;
    };
    
  2. 通过 module.exports 导出整个对象

    module.exports = {
        add(a, b) {
            return a + b;
        },
        subtract(a, b) {
            return a - b;
        }
    };
    

注意exportsmodule.exports 的引用,不能直接覆盖 exports,否则会导致导出失效。

导入

使用 require 语句导入模块:

const math = require('./math'); // 通过相对路径导入模块
console.log(math.add(1, 2)); // 调用导入的方法
特点
  • 模块在首次加载时同步执行并缓存。
  • 模块的加载顺序按照引用顺序执行。

2. AMD 和 CMD

背景

  • AMD(Asynchronous Module Definition)和 CMD(Common Module Definition)是为浏览器环境设计的模块化规范,用于解决前端模块依赖管理的问题。
AMD(RequireJS)
  • 主要特点是提前加载模块,适合依赖较多的场景。

  • 使用

    define
    

    定义模块,使用

    require
    

    引入模块:

    define(['moduleA', 'moduleB'], function (moduleA, moduleB) {
        const result = moduleA.doSomething() + moduleB.doSomethingElse();
        return result;
    });
    
CMD(SeaJS)
  • 主要特点是按需加载模块,更灵活。

  • 使用

    define
    

    定义模块,使用

    require
    

    按需引入:

    define(function (require, exports, module) {
        const moduleA = require('./moduleA');
        const moduleB = require('./moduleB');
        exports.result = moduleA.doSomething() + moduleB.doSomethingElse();
    });
    

3. ES 模块化

背景
ES 模块化(ESM)是 JavaScript 的原生模块化标准,目前是浏览器和 Node.js 主流支持的模块化规范。

导出
  1. 普通导出

    export const PI = 3.14;
    export function add(a, b) {
        return a + b;
    }
    
  2. 默认导出

    export default function subtract(a, b) {
        return a - b;
    }
    
  3. 批量导出

    const name = 'John';
    const age = 30;
    export { name, age };
    
  4. 重命名导出

    const version = '1.0.0';
    export { version as appVersion };
    
  5. 引用导出

    export { add as sum } from './math.js';
    
导入
  1. 普通导入

    import { add, PI } from './math.js';
    console.log(add(2, 3));
    
  2. 默认导入

    import subtract from './math.js';
    console.log(subtract(5, 2));
    
  3. 重命名导入

    import { add as sum } from './math.js';
    console.log(sum(2, 3));
    
  4. 全部导入

    import * as math from './math.js';
    console.log(math.add(1, 2));
    
  5. 动态导入

    import('./math.js').then(math => {
        console.log(math.add(2, 3));
    });
    
特点
  • 支持静态分析,提升了工具链的优化能力(如 Tree Shaking)。
  • 只支持顶层导入和导出,不支持条件导入导出。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】模板(进阶)

本篇我们来介绍更多关于C模板的知识。模板初阶移步至:【C】模板(初阶) 1.非类型模板参数 1.1 非类型模板参数介绍 模板参数可以是类型形参,也可以是非类型形参。类型形参就是我们目前接触到的一些模板参数。 //类型模板参数 …

ASP .NET Core 学习(.NET9)配置接口访问路由

新创建的 ASP .NET Core Web API项目中Controller进行请求时,是在地址:端口/Controller名称进行访问的,这个时候Controller的默认路由配置如下 访问接口时,是通过请求方法(GET、Post、Put、Delete)进行接口区分的&…

用于牙科的多任务视频增强

Multi-task Video Enhancement for Dental Interventions 2022 miccai Abstract 微型照相机牢牢地固定在牙科手机上,这样牙医就可以持续地监测保守牙科手术的进展情况。但视频辅助牙科干预中的视频增强减轻了低光、噪音、模糊和相机握手等降低视觉舒适度的问题。…

一部手机如何配置内网电脑同时访问内外网

做过运维的朋友都知道,最麻烦的是运维电脑不能远程,每次都得现场进行维护,明明客户那边有可以访问内网的电脑,怎么操作能将这台电脑能访问跟到外网呢,这样不就能通过远程软件远程了吗?嘿嘿。按以下步骤试试…

基于STM32的智能门锁安防系统(开源)

目录 项目演示 项目概述 硬件组成: 功能实现 1. 开锁模式 1.1 按键密码开锁 1.2 门禁卡开锁 1.3 指纹开锁 2. 功能备注 3. 硬件模块工作流程 3.1 步进电机控制 3.2 蜂鸣器提示 3.3 OLED显示 3.4 指纹与卡片管理 项目源代码分析 1. 主程序流程 (main…

(三)线性代数之二阶和三阶行列式详解

在前端开发中,尤其是在WebGL、图形渲染、或是与地图、模型计算相关的应用场景里,行列式的概念常常在计算变换矩阵、进行坐标变换或进行图形学算法时被使用。理解二阶和三阶行列式对于理解矩阵运算、旋转、平移等操作至关重要。下面,我将结合具…

基于GRU实现股价多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

【EdgeAI实战】(1)STM32 边缘 AI 生态系统

【EdgeAI实战】(1)STM32 边缘 AI 生态系统 【EdgeAI实战】(1)STM32 边缘 AI 生态系统 1. STM32 边缘人工智能1.1 X-CUBE-AI 扩展包1.2 STM32 AI Model Zoo1.3 ST AIoT Craft 2. STM32N6 AI 生态系统 (STM32N6-AI)2.1 STM32N6 AI 产…

DeepSeek-R1性能如何?如何使用DeepSeek-R1和o1 Pro模型

我们一起来看看DeepSeek-R1模型和OpenAI o1模型的能力如何?接下来,我们先看数据结果,然后再实际体验,我们今天就让他们写个python爬虫脚本来爬取所有有关孙颖莎和樊振东的相关报道和图片。 DeepSeek-R1 DeepSeek介绍自己说 &quo…

FunASR语言识别的环境安装、推理

目录 一、环境配置 1、创建虚拟环境 2、安装环境及pytorch 官网:pytorch下载地址 3、安装funasr之前,确保已经安装了下面依赖环境: python代码调用(推荐) 4、模型下载 5、启动funasr服务 二、 客户端连接 2.1 html连接 …

【Elasticsearch】 Ingest Pipeline `processors`属性详解

在Elasticsearch中,Ingest Pipeline 的 processors 属性是一个数组,包含一个或多个处理器(processors)。每个处理器定义了一个数据处理步骤,可以在数据索引之前对数据进行预处理或富化。以下是对 processors 属性中常见…

架构思考与实践:从通用到场景的转变

在当今复杂多变的商业环境中,企业架构的设计与优化成为了一个关键议题。本文通过一系列随笔,探讨了业务架构的价值、从通用架构到场景架构的转变、恰如其分的架构设计以及如何避免盲目低效等问题。通过对多个实际案例的分析,笔者揭示了架构设…

消息队列实战指南:三大MQ 与 Kafka 适用场景全解析

前言:在当今数字化时代,分布式系统和大数据处理变得愈发普遍,消息队列作为其中的关键组件,承担着系统解耦、异步通信、流量削峰等重要职责。ActiveMQ、RabbitMQ、RocketMQ 和 Kafka 作为市场上极具代表性的消息队列产品&#xff0…

win32汇编环境,怎么得到磁盘的盘符

;运行效果 ;win32汇编环境,怎么得到磁盘的盘符 ;以下代码主要为了展示一下原理,应用GetLogicalDrives、GetLogicalDriveStrings函数、屏蔽某些二进制位、按双字节复制内容等。以下代码最多查8个盘,即返回值中的1个字节的信息 ;直接抄进RadAsm可编译运行。…

微软预测 AI 2025,AI Agents 重塑工作形式

1月初,微软在官网发布了2025年6大AI预测,分别是:AI模型将变得更加强大和有用、AI Agents将彻底改变工作方式、AI伴侣将支持日常生活、AI资源的利用将更高效、测试与定制是开发AI的关键以及AI将加速科学研究突破。 值得一提的是,微…

网络编程套接字(二)

目录 TCP网络程序 服务端初始化 创建套接字 服务端绑定 服务端监听 服务端启动 服务端获取连接 服务端处理请求 客户端初始化 客户端启动 发起连接 发起请求 网络测试 多进程版TCP网络程序 捕捉SIGCHLD信号 孙子进程提供服务 多线程版TCP网络程序 线程池版TC…

网站HTTP改成HTTPS

您不仅需要知道如何将HTTP转换为HTTPS,还必须在不妨碍您的网站自成立以来建立的任何搜索排名权限的情况下进行切换。 为什么应该从HTTP转换为HTTPS? 与非安全HTTP于不同,安全域使用SSL(安全套接字层)服务器上的加密代…

渗透测试--攻击常见的Web应用

本文章咱主要讨论,常见Web应用的攻击手法,其中并不完全,因为Web应用是在太多无法囊括全部,但其中的手法思想却值得我们借鉴,所以俺在此做了记录,希望对大家有帮助!主要有以下内容: 1…

外包公司名单一览表(成都)

大家好,我是苍何。 之前写了一篇武汉的外包公司名单,评论区做了个简单统计,很多人说,在外包的日子很煎熬,不再想去了。 有小伙伴留言说有些外包会强制离职,不行就转岗,让人极度没有安全感。 这…

2025 最新flutter面试总结

目录 1.Dart是值传递还是引用传递? 2.Flutter 是单引擎还是双引擎 3. StatelessWidget 和 StatefulWidget 在 Flutter 中有什么区别? 4.简述Dart语音特性 5. Navigator 是什么?在 Flutter 中 Routes 是什么? 6、Dart 是不是…