JavaScript模块系统入门教程

🧑‍🎓 个人主页:《爱蹦跶的大A阿》

🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》

​ 

目录

✨ 前言

✨ 正文

一、模块 (Module) 简介

什么是模块

导出与导入

默认导出

重命名导入/导出

模块的路径

package.json

总结

二、JavaScript动态导入模块

动态导入

按需加载

条件加载

导入合并

总结

✨ 结语


✨ 前言

        随着JavaScript项目越来越复杂,代码的模块化组织变得极为重要。合理地拆分代码到不同的文件模块中,可以让项目更易维护和扩展。

        本文将详细介绍JavaScript的模块系统,包括ES模块的语法、导入和导出、模块路径等等。这些都是现代JavaScript项目不可或缺的知识点。

        通过学习本文提供的详实指导,你将可以自如地使用模块系统组织项目,享受它带来的诸多好处。

✨ 正文

一、模块 (Module) 简介

什么是模块

模块是封装细节,对外提供接口的代码单元。JavaScript模块可以将代码分离到不同的文件中,实现模块化开发。

导出与导入

使用export关键字可以导出变量或函数,使其可供其他模块导入:

// 📁 sayHi.js
export function sayHi(user) {alert(`Hello, ${user}!`); 
}

使用import可以导入模块: 

// 📁 main.js
import {sayHi} from './sayHi.js';sayHi('John'); // Hello, John!

被导入的模块都有自己的本地作用域,不会污染全局空间。

默认导出

每个模块都可以有一个default默认导出:

// 📁 user.js
export default class User {// ...
};

导入默认导出时不需要花括号:

// 📁 main.js 
import User from './user.js';

重命名导入/导出

可以使用as关键字来重命名:

export {sayHi as hi};import {hi as sayHi} from './say.js';

模块的路径

导入路径可以是相对路径或绝对路径,.js扩展名可以省略。

模块系统还可以识别文件 URL 或 npm 模块。

导入路径可以是:

  • 相对路径 './say'
  • 绝对路径 'https://...say'
  • 模块路径 'npm-module'

.js 扩展名可以省略。

package.json

package.json"main" 字段指定了模块的默认文件。这样可以直接导入模块名:

import 'my-module';

package.json 文件可以指定 "main" 字段,表示默认文件:

{"main": "main.js"
}

这样就可以直接import "module-name"而不需要相对路径了。

总结

  • 模块化优于全局变量,可以明确依赖关系
  • export导出,import导入
  • 默认导出最为常用
  • 路径可以是相对,绝对,或模块名
  • package.json指定默认入口文件

模块是组织 JavaScript 代码的现代方式,应该掌握使用。

二、JavaScript动态导入模块

动态导入

除了静态导入模块,我们还可以用动态语法按需导入:

import('./module.js').then(module => {// 使用模块});

import()函数会在需要时才加载模块并返回 promise。

按需加载

动态导入非常适合按需加载:

button.addEventListener('click', async () => {let module = await import('./dialog.js');module.open();});

点击按钮时才去导入对话框模块,优化加载性能。

条件加载

可以根据条件动态加载:

if(needModule) {import('./module.js').then(...); 
} else {// ...
}

这样只有在需要时才去加载模块。

导入合并

动态导入会自动合并,不会重复加载同一模块:

import('./module.js');
import('./module.js'); // 模块只会加载一次

总结

  • 动态导入语法为import()
  • 可以按需加载模块,优化性能
  • 允许根据条件进行加载
  • 自动合并重复导入调用

动态导入是提升模块灵活性的方式,可以根据需要进行按需、懒加载。

 

✨ 结语

       JavaScript的模块系统为我们带来了实现模块化开发的重要能力。合理利用好它的各项语法,可以让代码组织更加清晰,依赖关系明确,扩展性强。

        希望通过本文你可以对ES模块有一个全面系统的理解,并将它运用到项目中去。这将极大地提升你的JavaScript编码水平,使项目的维护更加轻松高效。

 

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

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

相关文章

QGIS编译(跨平台编译)之二十四:libbz2编译(Windows、Linux、MacOS环境下编译)

文章目录 1、libbz2介绍2、文件下载3、Linux下编译4、MacOS下编译5、Windows下编译1、libbz2介绍 bzip2是一个基于Burrows-Wheeler 变换的无损压缩软件,压缩效果比传统的LZ77/LZ78压缩算法来得好。它是一款免费软件。可以自由分发免费使用。 bzip2能够进行高质量的数据压缩。…

【代码随想录15】110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

目录 110. 平衡二叉树题目描述参考代码 257. 二叉树的所有路径题目描述参考代码 404.左叶子之和题目描述参考代码 110. 平衡二叉树 题目描述 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树…

AI数字人-数字人视频创作数字人直播效果媲美真人

在科技的不断革新下,数字人技术正日益融入到人们的生活中。近年来,随着AI技术的进一步发展,数字人视频创作领域出现了一种新的创新方式——AI数字人。数字人视频通过AI算法生成虚拟主播,其外貌、动作、语音等方面可与真实人类媲美…

huggingface高速下载模型的实战代码

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Neo4j 国内镜像下载与安装

Neo4j 5.x 简体中文版指南 社区版:https://neo4j.com/download-center/#community 链接地址(Linux版):https://neo4j.com/artifact.php?nameneo4j-community-3.5.13-unix.tar.gz 链接地址(Windows)&#x…

蓝桥杯省赛无忧 编程13 肖恩的投球游戏

#include <iostream> #include <vector> using namespace std; int main() {int n, q;cin >> n >> q;vector<int> a(n 1);vector<int> diff(n 2, 0); // 初始化差分数组// 读取初始球数&#xff0c;构建差分数组for (int i 1; i < …

Go 从标准输入读取数据

fmt.Scan系列 fmt.Scan函数定义如下&#xff1a; // Scan scans text read from standard input, storing successive space-separated values into successive arguments. // Newlines count as space. // It returns the number of items successfully scanned. // If tha…

DS:单链表的实现(超详细!!)

创作不易&#xff0c;友友们点个三连吧&#xff01; 在博主的上一篇文章中&#xff0c;很详细地介绍了顺序表实现的过程以及如何去书写代码&#xff0c;如果没看过的友友们建议先去看看哦&#xff01; DS&#xff1a;顺序表的实现&#xff08;超详细&#xff01;&#xff01;&…

JAVA大学生兼职平台后台管理

运行环境&#xff1a; tomcat7.0jdk1.7或以上 eclipse或idea 使用技术&#xff1a; springboot 功能描述&#xff1a; 求职人员 注册&#xff0c;登录 选定登录角色&#xff08;1、兼职人员2、发布兼职招聘人员&#xff09; 书写简历&#xff0c;上传学生证照片&#…

力扣每日一题 ---- 1039. 多边形三角剖分的最低得分

这题的难点在哪部分呢&#xff0c;其实是怎么思考。这道题如果之前没做过类似的话&#xff0c;还是很难看出一些性质的&#xff0c;这题原本的话是没有图片把用例显示的这么详细的。这题中有个很隐晦的点没有说出来 剖出来的三角形是否有交叉&#xff0c;这题中如果加一个三角…

网络防御——NET实验

一、实验拓扑 二、实验要求 1、生产区在工作时间&#xff08;9&#xff1a;00---18&#xff1a;00&#xff09;内可以访问服务区&#xff0c;仅可以访问http服务器&#xff1b; 2、办公区全天可以访问服务器区&#xff0c;其中&#xff0c;10.0.2.20可以访问FTP服务器和HTTP服…

水文模型SWMM与LisFlood耦合(pdf文档、软件见资源)

总技术路线图 INP生成图解 文献&#xff1a;面向服务的Web-SWMM构建研究 regardingINP为ArcGIS Pro项目 1.SWMM模型数据准备与参数设置 1.子汇水区 文件位于&#xff1a;beforeGenerateINP/generateSub.py&#xff08;一级划分&#xff09; 问题&#xff1a; 水文分析阈值划…

命令行安装vant2项目

声明&#xff1a;原文参考链接出自&#xff1a;ERROR in ./node_modules/vant export ‘createVNode‘ (imported as ‘_createVNode‘) was not found in ‘vue_error in node_modules/vant/lib/overlay/overlay.d.t-CSDN博客 已经安装Vant,但是引用Vant里面组件库时候报错&a…

C++ 关于“常量”的知识整理:

目录 1 常量对象&#xff1a; 2 常量成员&#xff1a; 2.1常量数据成员&#xff1a; 常数据成员总结&#xff1a; 2.2常量成员函数&#xff08;使用最多&#xff09;&#xff1a; 常成员函数总结&#xff1a; 3 常量引用&#xff1a; C中常量的值在程序运行中不允许被改…

调用阿里通义千问大语言模型API-小白新手教程-python

阿里大语言模型通义千问API使用新手教程 最近需要用到大模型&#xff0c;了解到目前国产大模型中&#xff0c;阿里的通义千问有比较详细的SDK文档可进行二次开发,目前通义千问的API文档其实是可以进行精简然后学习的,也就是说&#xff0c;是可以通过简单的API调用在自己网页或…

Redis为什么速度快:数据结构、存储及IO网络原理总结

Redis&#xff0c;作为内存数据结构存储的佼佼者&#xff0c;其高性能表现一直备受赞誉。那么&#xff0c;Redis究竟是如何实现这一点的呢&#xff1f;接下来&#xff0c;我们将更深入地探讨其背后的关键技术&#xff0c;并提供进一步的优化策略。 一、内存存储与数据结构设计…

【开源】基于JAVA语言的实验室耗材管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗材出库模块2.4 耗材申请模块2.5 耗材审核模块 三、系统展示四、核心代码4.1 查询耗材品类4.2 查询资产出库清单4.3 资产出库4.4 查询入库单4.5 资产入库 五、免责说明 一、摘要 1.1…

【现代控制系统】从状态方程导出微分方程

从状态方程导出微分方程 2023年6月20日 1. 基本方法 状态空间表达式&#xff1a; x ˙ ( t ) A x ( t ) B u ( t ) y ( t ) C x ( t ) D u ( t ) \begin{aligned} &\dot{ x}(t){ A }{ x }(t){ B }{ u } (t) \\ &{ y }(t){ C } { x }(t){ D } { u }(t) \end{alig…

基于Javaweb开发的二手图书零售系统详细设计【附源码】

基于Javaweb开发的二手图书零售系统详细设计【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统…

java的==运算符和equals详解

①chatgpt的解释 在Java中&#xff0c;和equals都是用于比较两个对象的操作符&#xff0c;但它们的行为和用途有所不同。 操作符&#xff1a; 对于基本数据类型&#xff0c;比较的是它们的值是否相等。例如&#xff0c;int a 5; int b 5; System.out.println(a b); // 输出t…