JavaScript 模块化系统 - JavaScript学习系列文章

发布时间:2026/10/23 1:34:48

JavaScript 模块化系统 - JavaScript学习系列文章 一、为什么需要模块化想象一下你正在写一个大型项目, 所有代码都堆在一个文件里:// 可怕的全局变量地狱var utils {...};var api {...};var componentA {...};var componentB {...};// 20000行之后...functiondoSomething() {//谁知道这个函数会不会覆盖前面的定义?}这种写法有几个致命问题:命名冲突:变量和函数都在全局作用域容易覆盖依赖混乱:不知道代码执行前需要加载哪些依赖难以维护:代码组织像意大利面条牵一发而动全身模块化就是为了解决这些问题而生的! 它让我们可以:将代码拆分成独立的小文件(模块)明确声明依赖关系避免污染全局命名空间方便代码复用和维护二、CommonJSCommonJS 是 Node.js 采用的模块系统, 语法非常简单:// math.jsfunctionadd(a, b) {return a b;}functionsubtract(a, b) {return a - b;}//导出模块module.exports {add,subtract};//或者也可以这样导出exports.add add;exports.subtract subtract;使用的时候如下所示:// app.jsconst math require(./math.js);console.log(math.add(2,3));// 5console.log(math.subtract(5,2));// 3它有什么特点呢?同步加载:模块在 require 时同步加载并执行.缓存机制:模块首次加载后会被缓存, 后续 require 直接返回缓存.值拷贝:导出的是值的拷贝(对于原始类型), 修改不会影响原模块.三、ES ModulesES Modules(简称 ESM)是 ECMAScript 2015(ES6)引入的官方模块系统, 现在已经被现代浏览器和 Node.js 支持.基本语法:// math.jsexportfunctionadd(a, b) {return a b;}exportfunctionsubtract(a, b) {return a - b;}// 或者默认导出exportdefault {add,subtract};导入模块:// 命名导入import { add, subtract }from./math.js;// 默认导入import mathfrom./math.js;// 混合导入import math, { add }from./math.js;// 整体导入import *as mathfrom./math.js;与CommonJS的区别:静态分析:ESM 的 import/export 必须在顶层作用域, 可以被静态分析动态绑定:ESM 导出的是值的引用(活的绑定), 修改会影响所有导入异步加载:ESM 在浏览器中是异步加载的// counter.jsexportlet count 0;exportfunctionincrement() {count;}// app.jsimport { count, increment }from./counter.js;console.log(count);// 0increment();console.log(count);//1(ESM是动态绑定)在浏览器里如何加载模块呢?!-- 传统脚本 --scriptsrcapp.js/script!-- 模块脚本 --scripttypemodulesrcapp.js/script关键区别:模块默认defer, 在文档解析完成后执行模块有独立作用域, 不会污染全局模块需要 CORS 配置, 不能使用 file:// 协议模块会自动应用严格模式四、按需加载静态导入(import ... from ...)必须在模块顶层, 但有时候我们需要按需加载:// 普通导入import(./math.js).then(math {console.log(math.add(2,3));});// 配合 async/awaitasyncfunctioncalculate() {const math awaitimport(./math.js);console.log(math.add(2,3));}条件加载:if (user.isAdmin) {import(./admin.js).then(...);}预加载:link relmodulepreload hrefcritical-module.js组合使用:Promise.all([import(./moduleA.js),import(./moduleB.js)]).then(([moduleA, moduleB]) {// 两个模块都加载完成});
延伸阅读

更多相关文章

2026/10/21 17:16:08

孩子头发稀少年年不长要不要补锌2026年6款发量测评榜

我家闺女头发从小就稀,别家小姑娘都能扎起小辫子,她的头发却软塌塌贴在头皮上,一年过去也没见长多少,梳起来就那么细细一小把。为了这个,我试过各种儿童洗发水,无硅油的、含生姜的、氨基酸配方的&#xff0…

2026/10/22 21:45:25

《李大霄投资战略 第3版》PDF文件完整目录分享和PDF文件下载

《李大霄投资战略 第3版》PDF文件完整目录分享和PDF文件下载 今天分享一本比较有代表性的投资类书籍——《李大霄投资战略》第3版。这本书主要围绕股票投资、市场周期、风险偏好、价值投资、A股大势判断等内容展开。 对于想系统了解李大霄投资观点的人来说,这一版…

2026/10/23 2:13:38

PCL2启动器完全配置手册:从零开始打造专属游戏环境

PCL2启动器完全配置手册:从零开始打造专属游戏环境 PCL2是一款专为Minecraft玩家设计的开源启动器,致力于简化游戏启动流程,解决各种兼容性问题。无论你是初次接触Minecraft的新手,还是希望优化游戏体验的老玩家,本指…

2026/10/23 2:13:38

PCL2启动器终极问题解决指南:从安装到完美运行的完整教程

PCL2启动器终极问题解决指南:从安装到完美运行的完整教程 PCL2是一款开源的Minecraft启动器,专门为解决游戏启动难题而设计。无论你是Minecraft新手还是老玩家,PCL2都能帮助你轻松应对各种启动问题,让游戏体验更加顺畅。本指南将…

2026/10/23 2:13:38

PCL2启动器:从技术小白到游戏高手的3倍效率提升秘籍

PCL2启动器:从技术小白到游戏高手的3倍效率提升秘籍 还在为Minecraft启动问题烦恼吗?PCL2启动器用一套全新的技术架构,彻底改变了传统启动器的笨重体验。今天我们将从底层原理出发,揭示这款工具如何实现启动效率的质的飞跃。 核…

2026/10/23 2:13:38

【Kali 渗透测试】提权

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/23 2:08:38

Kafka核心概念全解析:Broker、Topic、Partition

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/22 11:29:28

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/23 0:02:26

Verilog实现FPGA密码锁:矩阵键盘与状态机设计实战

说实话,这几年接触了不少想入门FPGA的朋友,如果你问哪个项目能一口气把Verilog的核心基本功串起来,我通常会推荐电子密码锁。这个项目看着不起眼,却把矩阵键盘扫描、按键消抖、状态机设计、动态显示刷新、外设控制这些数字逻辑里的…

2026/10/23 0:02:26

数据服务监控运维实战:从指标体系到告警治理与故障排查

周末凌晨两点,手机震了。第一反应是“数据服务挂了”。打开电脑看了下,果然,某张核心报表的数据产出时间已经超过SLA两小时,下游三个业务方连着发来问询。这种场景,做过大数据运维的人都不会陌生。数据服务的监控与运维…

2026/10/23 0:02:26

FreeRTOS任务通知实战详解:内核原理、API与避坑指南

裸机编程切到RTOS之后,任务之间的通信和同步永远是躲不开的坎。前面聊过队列、信号量、互斥锁、事件组,这次把FreeRTOS任务通知(Task Notification)单独拎出来讲透。原因很简单:任务通知是FreeRTOS里最容易用错、也最容…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑