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 1:33:29

几毛钱的安全芯片撑不撑得起物联网安全的未来?

/* 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 1:33:29

IDEA集成CodeX图形界面:CC GUI插件配置与实战避坑

/* 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 1:33:29

EtherCAT电机从零上手:硬件接线、PDO映射与状态机切换实战

/* 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 1:33:29

从 free 到 OOM:Linux 虚拟内存、缺页回收与内存排障全链路

/* 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 1:33:29

中小企业机房供配电实战指南:从单相供电到可验证电力

/* 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 1:28:28

Kafka kRaft模式实战:从零搭建无ZooKeeper集群

/* 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
免费获取方案
☎咨询二维码 ☎ ↑