当前位置: 首页 > news >正文

2024 年最新前端ES-Module模块化、webpack打包工具详细教程(更新中)

模块化概述

什么是模块?模块是一个封装了特定功能的代码块,可以独立开发、测试和维护。模块通过导出(export)和导入(import)与其他模块通信,保持内部细节的封装。

前端 JavaScript 模块化是指将代码拆分为独立的模块,每个模块负责特定的功能或逻辑。模块化的主要目的是提高代码的可维护性、可复用性和可扩展性。模块化让开发者能够组织代码,使之更加清晰、结构化,并且可以减少命名冲突和全局变量污染。

模块化优势

提高可维护性:模块的分离使代码更易于管理,修改或调试时只需专注于特定模块。
防止命名冲突:模块有自己的作用域,避免了全局作用域的污染。
重用性:可以将模块在不同的项目或文件中重复使用,提高开发效率。
依赖管理:模块化工具可以处理模块之间的依赖关系,确保按顺序加载。

模块化演变过程

前端 JavaScript 模块化从最早的无组织结构,到 IIFE、CommonJS、AMD,再到现代的 ES6 模块和打包工具,经历了不断演变。如今,ES6 模块已经成为标准,配合现代的打包工具,前端开发更加模块化和高效。

1. 没有模块化阶段 (ES3、ES3 之前)
在最早的 JavaScript 开发中,所有的代码都是通过 <script> 标签加载的。所有的脚本文件被直接插入 HTML 页面,并且依赖的加载顺序需要手动管理。这样容易导致命名冲突和全局变量污染。

2. 命名空间模式
前端开发者开始使用命名空间(Namespace)的方式组织代码,将相关功能模块封装在一个对象内,从而避免全局污染。

var MyModule = {foo: function() {console.log('foo');},bar: function() {console.log('bar');}
};MyModule.foo();

3. 立即调用函数表达式(IIFE)
IIFE 是一个自执行的函数,它创建了一个局部作用域,从而避免了全局变量污染。IIFE 成为了一种非常流行的模块化模式。

var MyModule = (function() {var privateVar = 'I am private';function privateMethod() {console.log(privateVar);}return {publicMethod: function() {privateMethod();}};
})();MyModule.publicMethod();

4. CommonJS (2009)
CommonJS 是 Node.js 中的模块化标准,也是服务器端 JavaScript 模块化的主要方式。它的特点是使用 require 导入模块,使用 module.exports 导出模块。

通过 module.exports 导出模块

module.exports = {foo: function() {console.log('foo');}
};
myModule.foo();

通过 require 导入模块

var myModule = require('./myModule');

5. AMD(Asynchronous Module Definition, 2010)
AMD 是一种用于浏览器的异步模块加载标准,最著名的实现是 RequireJS。AMD 的设计目标是解决浏览器环境中异步加载模块的问题。

定义模块

define('myModule', ['dependency'], function(dependency) {return {foo: function() {console.log('foo');}};
});

使用模块

require(['myModule'], function(myModule) {myModule.foo();
});

6.UMD(Universal Module Definition)

UMD 是为了兼容 CommonJS 和 AMD 而提出的一个模块化标准。UMD 模块可以同时运行在服务器端和浏览器端,解决了模块化标准不统一的问题。

(function (root, factory) {if (typeof define === 'function' && define.amd) {define(['dependency'], factory);} else if (typeof exports === 'object') {module.exports = factory(require('dependency'));} else {root.myModule = factory(root.dependency);}
}(this, function (dependency) {return {foo: function() {console.log('foo');}};
}));

7. ES6 模块(2015)
ECMAScript 2015 (ES6) 引入了官方的模块化系统,成为前端模块化的标准。它支持静态分析和编译时优化,模块以 importexport 进行导入和导出:

通过 export 导出模块

export function foo() {console.log('foo');
}

通过 import 导入模块

import { foo } from './myModule.js';
foo();

ES6 模块系统特点:

- 静态引入:模块依赖在编译时解析,能够优化打包体积和性能。
- 作用域独立:每个模块都有自己的作用域,防止命名冲突。
- 支持异步加载:通过 `import()` 动态导入模块。

8. 模块打包工具

随着 JavaScript 项目规模的扩大和模块化需求的增加,模块打包工具应运而生,它们允许开发者使用各种模块化标准,并将它们打包为浏览器兼容的文件。

- Browserify:最早的工具之一,允许在浏览器中使用 CommonJS 模块。
- Webpack:目前最流行的打包工具之一,支持 CommonJS、ES6 模块以及插件扩展。
- Rollup:专注于 ES6 模块的打包工具,生成的文件更为轻量。
- Parcel:零配置的打包工具,支持多种模块标准,且性能优异。

9. ES Module 在浏览器中的原生支持

现代浏览器现在已经支持原生的 ES6 模块化系统,开发者可以直接在浏览器中使用 type="module"<script> 标签。这让开发者可以直接在浏览器环境中使用 ES6 模块,而无需通过打包工具进行预处理。

<script type="module">import { foo } from './myModule.js';foo();
</script>

ES6 Module 特性

ES Module(ESM)是 ECMAScript 2015(ES6)引入的官方 JavaScript 模块系统,专门用于解决现代开发中模块化需求。它的特性包括静态分析、作用域隔离、支持异步加载等。它提高了代码的可维护性、性能和开发效率,并得到了浏览器和服务器环境的广泛支持。

1. 静态加载(静态分析)

ESM 的依赖关系在编译时就能确定,因此可以进行静态分析。这意味着模块依赖在代码执行前已被解析,编译器和打包工具可以在构建时进行优化和错误检查。

import { foo } from './myModule.js';

由于导入语句是静态的,工具可以提前检测哪些模块被使用,未使用的代码可以在构建过程中进行“树摇”(tree-shaking)优化,从而减小打包体积。

2. 作用域隔离

每个 ES 模块都有自己的独立作用域,模块内部的变量和函数不会泄露到全局作用域。这种封装避免了不同模块之间的命名冲突,确保代码安全。模块内部的 secret 变量是私有的,外部无法访问,只有 publicVar 通过 export 导出,供其他模块使用。

module.js

let secret = "I'm private";
export const publicVar = 'I am public';

3. import 和 export

ESM 使用 exportimport 关键字进行模块的导出和导入,有两种导出方式:命名导出默认导出

命名导出(Named Export):可以导出多个变量、函数或类,并且在导入时需要按名字导入。

module.js

export const foo = () => console.log('foo');
export const bar = () => console.log('bar');

main.js

import { foo, bar } from './module.js';
foo();
bar();

默认导出(Default Export):每个模块只能有一个默认导出,导入时可以自定义导入的名称。

module.js

export default function() {console.log('default export');
}

main.js

import myFunction from './module.js';
myFunction(); // 输出 'default export'

4. 模块是单例的

ES 模块是单例的,意味着每个模块只会被加载和执行一次,后续的导入都引用相同的模块实例。这保证了模块的状态在多个导入中是共享的。

module.js

let count = 0;
export const increment = () => count++;
export const getCount = () => count;

main.js

import { increment, getCount } from './module.js';
increment();
console.log(getCount()); // 1
increment();
console.log(getCount()); // 2

5. 严格模式

所有的 ES 模块默认处于严格模式(use strict),这意味着无法使用一些松散的 JavaScript 语法(如隐式全局变量、删除未定义属性等),从而提高代码的安全性和性能。

模块中自动使用严格模式

x = 10; // ReferenceError: x is not defined

6. 支持异步动态导入

除了静态导入,ES 模块还支持动态导入。通过 import() 函数,可以在代码执行时按需加载模块,动态导入返回一个 Promise。这个特性非常适合代码拆分和按需加载,尤其是在大型应用中提高性能。

main.js

document.getElementById('loadModule').addEventListener('click', async () => {const module = await import('./module.js');module.foo(); // 动态加载模块后调用
});

7. 浏览器原生支持

现代浏览器支持原生 ES 模块,开发者可以直接在浏览器中使用模块功能,无需额外的打包工具。通过 <script type="module"> 标签,浏览器可以异步加载模块,并自动管理模块的依赖关系。

<script type="module">import { foo } from './module.js';foo();
</script>

8. 文件路径和后缀

在使用 import 时,模块的文件路径必须是相对路径或绝对路径,并且需要指定 .js 后缀。这与 Node.js 的 CommonJS 模块系统不同,后者可以省略文件扩展名。

import { foo } from './module.js'; // 必须加 .js 扩展名

9. 兼容性 与 Polyfill

为了支持旧版浏览器和环境,开发者通常使用 Babel 等工具将 ES 模块转换为 CommonJS 或其他模块格式,同时结合 Webpack 等打包工具来处理依赖关系。

Polyfill 是一种用于在旧版本浏览器或不支持某些新特性环境中实现现代 JavaScript 功能的技术。它通常是指一个库或代码片段,用来提供尚未被原生支持的功能,让开发者能够使用最新的语言特性,同时保证在较旧环境中的兼容性。

随着 JavaScript 语言和浏览器技术的发展,新功能和 API 被不断引入,而这些功能可能不会立即在所有浏览器或环境中得到支持。Polyfill 使开发者可以在旧环境中使用这些新功能,而不必等待所有用户的浏览器升级。

早期浏览器不支持 Promise、fetch、Array.prototype.includes 等功能,但通过 Polyfill,开发者仍可以在这些浏览器中使用这些特性。
在 IE 浏览器中,许多 ES6(如 Map、Set)或 HTML5 API 都不被支持,Polyfill 可以帮助实现这些功能。

webpack 打包工具

Webpack 是一个非常流行的 JavaScript 模块打包工具,主要用于将前端项目中的各种资源(包括 JavaScript、CSS、图片等)打包成浏览器可以直接加载的文件。它支持模块化开发,并通过配置文件允许高度定制打包过程。

在这里插入图片描述

Webpack 工作原理

读取入口文件:Webpack 从配置文件中指定的入口文件开始,递归地读取文件中的依赖(如 import 和 require)。
构建依赖图:通过解析每个模块的依赖,Webpack 构建出一个完整的依赖图。
应用 Loaders:根据配置,Webpack 使用不同的 Loader 处理非 JavaScript 文件(如 CSS、图片、SASS 等)。
应用 Plugins:Webpack 在打包的不同阶段执行插件进行优化或特定的处理,如压缩代码、生成 HTML 文件等。
输出文件:Webpack 根据依赖图,生成打包后的文件,通常是一个或多个 JavaScript 文件,以及其他的静态资源(CSS、图片等)。

Webpack 优点

高度可配置:Webpack 提供了灵活的配置方式,可以根据项目需求进行高度定制。
强大的社区支持:Webpack 拥有丰富的插件和 loader 生态,几乎能满足所有类型的前端打包需求。
优化性能:通过代码拆分、Tree Shaking 等技术,Webpack 能够有效优化前端代码的加载速度和性能。

更新中······

相关文章:

2024 年最新前端ES-Module模块化、webpack打包工具详细教程(更新中)

模块化概述 什么是模块&#xff1f;模块是一个封装了特定功能的代码块&#xff0c;可以独立开发、测试和维护。模块通过导出&#xff08;export&#xff09;和导入&#xff08;import&#xff09;与其他模块通信&#xff0c;保持内部细节的封装。 前端 JavaScript 模块化是指…...

photoshop的2个形状-箭头

有时候用ps画一些教程类图文&#xff0c;需要用到箭头. 另外自己画了一个镂空的长方形和正方形 形状的路径一般在Custom Shapes文件夹内 例如 E:\photoshopCS4\Adobe Photoshop CS4\Presets\Custom Shapes...

【经验分享】搭建本地训练环境知识点及方法

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…...

AI知识-多模态(Multimodal)

摘要 本文将探讨多模态&#xff08;Multimodal&#xff09;的概念&#xff0c;包括其通俗理解、技术原理、应用场景&#xff0c;以及进行总结。我们将通过一个简要的介绍来了解多模态技术&#xff0c;并深入探讨其在人工智能和机器学习领域的重要性。 通俗理解 多模态&#x…...

代码随想录 leetcode-数据结构刷题笔记

文章目录 一、数组1.1 二分查找 1.1.1 二分查找 1.1.2 搜索插入位置1.1.3 排序数组中查找元素第一和最后一个位置1.1.4 x的平方根 1.1.5 有效的完全平方数 1.2 快慢指针 1.2.1 移除元素 1.2.2 删除有序数组中的重复项 1.2.3 移动0 1.2.4 比较含退格的字符串 1.2.5 有序数组的平…...

Oracle最佳实践-优化硬解析

前段时间参加oracle CAB&#xff0c;oracle高级服务部门做了一个数据库最佳实践的报告&#xff0c;其中就有一项就是解决未使用绑定变量但执行次数很多的SQL&#xff1b; 对于一个数据库来说如果不知道该如何优化&#xff0c;那么最简单最有效的优化就是减少硬解析&#xff0c;…...

Windows中将springboot项目运行到docker的容器中

0&#xff0c;先打包好项目&#xff0c;再启动docker 1&#xff0c;在Java项目根目录下创建一个名为Dockerfile的文件&#xff08;没有扩展名&#xff09;&#xff0c;并添加以下内容。 # 使用OpenJDK的基础镜像 FROM openjdk:8-jdk-alpine# 设置工作目录 WORKDIR /app# 将项…...

30、使用ESP8266跟SG90舵机制作四足蜘蛛机器人

目录 1、简介 2、使用例子 3、代码解析 4、资源下载 正文 1、简介 本篇使用ESP8266跟SG90舵机制作四足蜘蛛机器人,使用的180度舵机有8个,需要一块16路舵机控制板,也可以使用小一点的控制板8路也够了。下面开始今天的教程,源码在文章末尾自行下载,力求大家都能看懂。…...

相比普通LED显示屏,强力巨彩软模组有哪些优势?

在科技技术的加持下&#xff0c;LED显示屏市场各类创新产品层出不穷&#xff0c;为市场带来了无限可能。其中&#xff0c;强力巨彩R系列H版&#xff08;软模组&#xff09;凭借其独特的技术优势&#xff0c;在行业内脱颖而出。那么&#xff0c;相比常规LED显示屏&#xff0c;强…...

部门操作和日志

PostMapping("/depts") public Result add(RequestBody Dept dept){System.out.println("添加部门: " dept);deptService.add(dept);return Result.success(); }Override public void add(Dept dept) {dept.setCreateTime(LocalDateTime.now());dept.setU…...

antdv-<a-button>中属性的使用

UI组件库&#xff08;User Interface Component Library&#xff09;是一种预先构建好的、可重用的用户界面元素集合&#xff0c;旨在帮助开发者更快速、更简便地构建用户界面。这些组件通常包括按钮、表单、导航栏、模态框等&#xff0c;能够提供一致的外观和交互风格&#xf…...

python解题之寻找最大的葫芦

问题描述 问题描述 在一场经典的德州扑克游戏中&#xff0c;有一种牌型叫做“葫芦”。“葫芦”由五张牌组成&#xff0c;其中包括三张相同牌面值的牌 &#xfffd;a 和另外两张相同牌面值的牌 &#xfffd;b。如果两个人同时拥有“葫芦”&#xff0c;我们会优先比较牌 &#…...

iOS 环境搭建教程

本文档将详细介绍如何在 macOS 上搭建 iOS 开发环境&#xff0c;以便进行 React Native 开发。&#xff08;为了保证环境一致 全部在网络通畅的情况下运行&#xff09; 1. 安装 Homebrew Homebrew 是 macOS 的包管理工具&#xff0c;我们将通过它来安装开发所需的工具。 安装…...

制作容器镜像

容器基础镜像制作 由于项目使用麒麟操作系统&#xff0c;需要在麒麟桌面操作系统和服务器操作系统里编译代码&#xff0c;如果每次都在物理机和虚拟机里编译太不方便&#xff0c;也无法使用常用的 jenkins k8s 组成的 CI/CD 编译环境&#xff0c;如果基于整个ISO太大了&#…...

基于Python对xslxslx文件进行操作

利用python操作表格文件 读取xsl格式文件-源码 import xlrd# 读取xls文件中的工作对象 wb xlrd.open_workbook(示例文件/xxx物理学与信息技术学院.xls) print(wb)# 获取所有的工作表名称 sheet_names wb.sheet_names() # print(sheet_names)# 选择要读取的具体工作表对象 s…...

语音芯片赋能可穿戴设备:开启个性化音频新体验

在科技日新月异的今天&#xff0c;语音芯片与可穿戴设备的携手合作&#xff0c;正引领我们步入一个前所未有的个性化音频时代。这一创新融合&#xff0c;用户可以享受到更加个性化、沉浸式的音频体验。下面将详细介绍语音芯片与可穿戴设备合作的优点和具体应用。 1. 定制化音效…...

Unity学习笔记(一)如何实现物体之间碰撞

前言 本文为Udemy课程The Ultimate Guide to Creating an RPG Game in Unity学习笔记 如何实现物体之间碰撞 实现物体之间的碰撞关键组件&#xff1a;Rigidbody 2D(刚体)、Collider 2D(碰撞体)、Sprite Renderer&#xff08;Sprite渲染器&#xff09; 实现物体之间的碰撞 …...

LinkedList与链表 和 链表面试题

目录 一. ArrayList 与 LinkedList 的优缺点&#xff1a; 二. LinkedList 的分类 三.链表的十道面试题&#xff1a; 1. 删除链表中等于给定值 val 的所有节点。题目链接 2. 反转⼀个单链表。题目链接 3. 输⼊⼀个链表&#xff0c;输出该链表中倒数第k个结点。题目链接 4.给定…...

ansible自动化运维(一)简介及清单,模块

相关文章ansible自动化运维&#xff08;二&#xff09;playbook模式详解-CSDN博客ansible自动化运维&#xff08;三&#xff09;jinja2模板&&roles角色管理-CSDN博客ansible自动化运维&#xff08;四&#xff09;运维实战-CSDN博客 ansible自动化运维工具 1.什么是自…...

利用代理IP爬取Zillow房产数据用于数据分析

引言 最近数据分析的热度在编程社区不断攀升&#xff0c;有很多小伙伴都开始学习或从事数据采集相关的工作。然而&#xff0c;网站数据已经成为网站的核心资产&#xff0c;许多网站都会设置一系列很复杂的防范措施&#xff0c;阻止外部人员随意采集其数据。为了解决这个问题&a…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...