常用的前端模块化标准总结

1、模块化标准出现以前使用的模块化方案:

1)文件划分: 将不同的模块定义在不同的文件中,然后使用时通过script标签引入这些文件

缺点:
  • 模块变量相当于是定义在全局的,容易造成变量名冲突(即不同模块存在相同名称的变量);
  • 模块之间的依赖关系和加载顺序不好管理;如果模块之间存在依赖关系,则在引入文件时需要手动调整,否则会出现运行错误
  • 如果引入了多个模块,则无法清楚知道某个变量来自哪个模块,需要逐个模块进行排查;

2)命名空间:

// module.a.js文件
window.moduleA = {
 data: 'A',
 ...
}
// module.b.js文件
window.moduleB = {
 data: 'B',
 ...
}
// html中访问模块变量
...
console.log(moduleA.data)
console.log(moduleB.data)
优点:
  • 解决了文件划分造成的全局变量命名冲突的问题;
  • 使用时能清楚知道某个变量来自哪个模块,方便开发调试

3)IIFE-立即执行函数,使变量私有化,只对外界暴露变量的访问入口

// module.a.js文件
(
  function () {
    // 模块A的私有成员,只能在当前模块内部访问,其他模块无法访问
    const data = 'moduleA'

    function method () {
      console.log(data + ' execute');
    }
    window.moduleA = {
      method
    }
  }
)()

// module.b.js文件
(
  function () {
    const data = 'moduleB'
    function method () {
      console.log(data + ' execute');
    }
    window.moduleB = {
      method
    }
  }
)()

// index.html文件
...
<body>
  <script src="./js/module.a.js"></script>
  <script src="./js/module.b.js"></script>
  <script>
    // moduleA的私有成员,外界无法访问
    console.log(moduleA.data);  // undefined
    moduleB.method()  // moduleB execute
  </script>
</body>
优点:
  • 解决了全局变量命名冲突的问题
  • 能清楚知道使用的变量来自哪个模块,(即变量作用域清晰了)

总结:命令空间和IIFE均没有解决模块存在依赖关系时,模块加载顺序的问题、

2、主流的前端模块规范

1)CommonJs规范:

  • 使用module.exports导出模块;require()导入模块;
// module.a.js文件
const data = 'hello CommonJs'
function getData () {
  return data
}
// 导出模块
module.exports = {
  getData
}

// main.js文件
const { getData } = require('./module.a')
console.log(getData())

在这里插入图片描述

特点
  • 同步加载模块;即模块加载是阻塞式的,需等待模块加载完才能执行后续操作;
  • 适用于服务器端;因为模块是在服务器本地无需进行网络IO,另外在服务启动时才会进行模块加载,而通常服务启动后就会一直运行,所以同步加载对服务的性能影响不大;但是在浏览器环境中,同步模块加载会造成浏览器JS解析过程的阻塞,导致页面加载速度缓慢;
  • 模块缓存,避免重复加载和执行

2)AMD模块规范(Asynchronous Module Definition)

// js/main.js文件

// 使用define()加载依赖模块print.js,并定义一个新模块;也可使用require()加载依赖模块
define(['./js/print.js'], function (module) {
  // module:依赖项的导出内容
  module.print('AMD')  // print AMD
})

// js/print.js文件
// 定义一个模块并导出
// define(array, callback): array-依赖项数组;callback-回调函数,接收依赖项的导出内容
define([], function () {
  return {
    print: function (msg) {
      console.log('print ' + msg);
    }
  }
})

// index.html文件
...
<body>
  <!-- 由于AMD没有得到浏览器的原生支持,所以使用AMD规范时,需要引入第三方库,requireJS -->
  <!-- data-main="./js/main":指定主模块路径,标识main.js文件位于js目录下 -->
  <script src="./lib/require.js" data-main="./js/main"></script>
  ...
</body>

在这里插入图片描述

特点:

  • 异步加载模块,即模块加载时不会阻塞页面渲染
  • 未得到浏览器的原生支持,需要借助第三方库requireJS来实现
  • 代码书写和阅读稍显复杂,增加了开发人员的心智负担

同期出现的其他规范: CMD,UMD

  • CMD: 由淘宝出品的SeaJs实现,解决的问题与AMD类似;延迟执行和按需加载,即模块是在代码需要使用时才会加载执行,不会预先加载;
  • UMD:通用模块定义,兼容AMD和CommonJs的模块化方案,可以同时运行在浏览器和Node.js环境

3)ES模块(ES Module)

  • 由ECMAScript官方提出的模块化规范,已经得到现代浏览器的内置支持
  • 如果在html的script标签中加上type="module"属性,那么浏览器将按照ES的模块化规范加载和解析该脚本
  • 能够同时运行在浏览器端和Node.js环境中,拥有天然的跨平台能力
  • 使用 export 导出模块;import导入模块;
// ES模块在浏览器环境中运行
// module.a.js文件
// 使用export导出模块
const method = () => {
  console.log('Hello ES Module')
}
export {
  method
}

// module.b.js文件
// 使用export default导出模块
const method = () => {
  console.log('Hello ES Module')
}
export default {
  method
}

// main.js文件,引用模块
// 1、export语法导出时引入方式,可通过 as xx 给导入的方法起别名
import { method as methodA } from './module.a.js'
methodA()

// 2、export default语法导出时引入方式
import B from './module.b.js'
B.method()

// index.html文件
...
<body>
  <!-- type="module" 在html中标识这个脚本文件是一个ES模块; -->
  <script type="module" src="./js/main.js"></script>
</body>

在这里插入图片描述

// ES模块在Node.js环境中运行

// package.json文件,添加type: "module"属性,使Node.js以ES规范解析模块
{
  "type": "module"
   ...
}

在这里插入图片描述

优点:
  • 导入,导出语法简洁明了,代码可读性强
  • 静态分析和优化;模块的依赖关系在编译时就可以确定,这使得编译器可以进行更好的静态分析,并进行代码优化,打包和压缩等操作;
  • 模块的按需加载;
  • 可以同时运行在浏览器和Node.js环境
参考文章:
  • 《深入浅出 Vite》

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

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

相关文章

【Qt】Android上运行keeps stopping, Desktop上正常

文章目录 问题 & 背景背景问题 解决方案One More ThingTake Away 问题 & 背景 背景 在文章【Qt】最详细教程&#xff0c;如何从零配置Qt Android安卓环境中&#xff0c;我们在Qt中配置了安卓开发环境&#xff0c;并且能够正常运行。 但笔者在成功配置并完成上述文章…

图书|基于Springboot的图书管理系统设计与实现(源码+数据库+文档)

图书管理系统目录 目录 基于Springboot的图书管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、个人中心 2、管理员管理 3、用户管理 4、图书出版社管理 5、公告类型管理 6、所在书架管理 7、图书类型管理 8、论坛管理 9、公告信息管理 10、图书信…

解决zabbix图像中文乱码

使用zabbix查看监控图像信息&#xff0c;发现会有中文乱码现象。 解决方法如下&#xff1a; 1.拷贝windows文字文件到服务器上 C:\Windows\Fonts目录下拷贝自己需要的中文语言文件 2.修改配置文件 vim /usr/share/zabbix/include/defines.inc.php 81行 define(ZBX_GRAPH_F…

DolphinScheduler本地安装

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

vue教程-介绍与使用

vue介绍 介绍 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。 安装 最简单的例子就是&#xff0c;创建一个htm…

Vue源码系列讲解——虚拟DOM篇【一】(Vue中的虚拟DOM)

目录 1. 前言 2. 虚拟DOM简介 2.1什么是虚拟DOM&#xff1f; 2.2为什么要有虚拟DOM&#xff1f; 3. Vue中的虚拟DOM 3.1 VNode类 3.2 VNode的类型 3.2.1 注释节点 3.2.2 文本节点 3.2.3 克隆节点 3.2.4 元素节点 3.2.5 组件节点 3.2.6 函数式组件节点 3.2.7 小结 3…

汇集全球50+供应链领域企业专家,创新论坛带来最新趋势和实践

过去的几年中&#xff0c;随着世界范围内经济、社会和政治上的巨大变化&#xff0c;供应链管理已成为企业和经济成功的关键因素。面对不断增长的全球挑战&#xff0c;包括经济波动、技术变革、政治不确定性&#xff0c;以及环境可持续性的压力&#xff0c;构建一个创新、高效且…

docker部署showdoc

目录 安装 1.拉取镜像 2.创建容器 使用 1.选择语言 2.默认账户/密码:showdoc/123456​编辑 3.登陆 4.首页 安装 1.拉取镜像 docker pull star7th/showdoc 2.创建容器 mkdir -p /opt/showdoc/html docker run -d --name showdoc --userroot --privilegedtrue -p 1005…

linux centos 安装teleport

效果 安装 1.创建目录 mkdir -p /opt/teleport/data cd /opt/teleport/2.下载解压文件 wget https://tp4a.com/static/download/teleport-server-linux-x64-3.6.4-b3.tar.gz tar -xvf teleport-server-linux-x64-3.6.4-b3.tar.gz3.安装 cd /opt/teleport/teleport-server-l…

解锁售前新效能:AI助手使用的三点建议

1.售前工作概述 自从阴差阳错从技术实施转做售前到现在也有10多年时间&#xff0c;与技术实施仅负责设备安装调试、用户使用培训以及售后维护等被动工作不同。售前更多的是针对用户的主动性工作&#xff0c;包括需求调研与分析、技术沟通与咨询、方案设计与制定、方案演示与讲…

问题 | IT行业有哪些证书含金量高?

IT行业有哪些证书含金量高? Cisco认证&#xff08;CCNA&#xff0c;CCNP&#xff0c;CCIE&#xff09;&#xff1a;思科是全球最大的网络设备供应商之一&#xff0c;它的认证证书在网络和通信领域被广泛认可。CCNA是初级认证&#xff0c;CCNP是高级认证&#xff0c;而CCIE是专…

【射影几何13 】梅氏定理和塞瓦定理探讨

梅氏定理和塞瓦定理 目录 一、说明二、梅涅劳斯&#xff08;Menelaus&#xff09;定理三、塞瓦(Giovanni Ceva&#xff09;定理四、塞瓦点的推广 一、说明 在射影几何中&#xff0c;梅涅劳斯&#xff08;Menelaus&#xff09;定理和塞瓦定理是非常重要的基本定理。通过这两个定…

常见web安全漏洞和解决思路

一、常见安全漏洞 服务器类安全漏洞&#xff1a; 服务器含服务器软件类型较多&#xff0c;此次不再一一列举&#xff1b; WEB访问类安全漏洞&#xff1a; XSS漏洞检测 (key: xss) SQL 注入检测 (key: sqldet) 命令/代码注入检测 (key: cmd-injection) …

A TimThumb error has occured,主题出现这个错误puock

我的主题是puock-2.7.10&#xff0c;其他的主题应该也差不多&#xff0c;出现这种问题时 Warning: touch(): Utime failed: Permission denied in /www/wwwroot/jiuliang/wp-content/themes/wordpress-theme-puock-2.7.10/timthumb.php on line 219 A TimThumb error has occ…

少儿编程考级:智慧启迪还是智商税?

在当前科技日新月异的时代背景下&#xff0c;少儿编程教育日益受到家长和社会的广泛关注。与此同时&#xff0c;各类少儿编程考级应运而生&#xff0c;引发了公众对于其价值和意义的深度探讨。一部分人认为这是对孩子逻辑思维与创新能力的有效锻炼&#xff0c;是智慧启迪的重要…

C语言之找单身狗

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 题目&#xff1a; 在一个整型数组中&#xff0c;只有一个数字出现一次&#xff0c;其他数组都是成对出现的&#xff0c;请找出那个只出现一次的数字。…

一台Mac同时安装vue2和vue3

背景&#xff1a;电脑需要运行vue2和vue3项目&#xff0c;就得同时有vue2和vue3环境&#xff0c;之前以配置好vue2了&#xff0c;现在增加vue3 1. 新建一个安装vue3的目录 进入vue3文件夹安装vue3 // 注意这里没有参数-g&#xff0c;因为-g全局安装的命令 npm install vue/cli…

STM32TIM定时器(4)

文章目录 前言一、介绍部分编码器简介正交编码器编码器接口基本结构工作模式均不反向实例均反向实例 二、代码部分编码器接口测速连接线路 代码实现 前言 这部分主要介绍定时器编码器接口&#xff0c;了解使用编码器对计数器的控制&#xff0c;理解正交编码器的工作模式&#…

微服务-微服务Alibaba-Nacos 源码分析 (源码流程图)-2.0.1

客户端注册临时实例&#xff0c;GRPC处理 客户端服务发现 及订阅处理

VMware虚拟机安装openEuler系统(一)(2024)

目录 一、下载ISO镜像 二、开始创建虚拟机 通过实践是学习openEuler开源Linux系统的最佳方式。因此我们首先得搭建一个openEuler实战环境&#xff0c;文章是在Windows系统上使用VMware Workstation虚拟化软件&#xff0c;安装和学习openEuler开源Linux操作系统。 使用虚拟机…