webpack 学习

webpack打包流程及原理

Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。在 Web 开发中,它主要用于将各种资源(如 JavaScript、CSS、图片等)打包成浏览器可以直接运行的文件。Webpack 的核心概念和原理主要包括模块化、加载器(Loaders)、插件(Plugins)和打包过程。

webpack作用
把静态模块内容,压缩、转译、打包等(前端工程化)

1. 模块化

Webpack 支持多种类型的模块化标准,包括 CommonJS、AMD 和 ES6 模块等。这意味着你可以使用任何一种标准的模块化语法来组织你的代码。
一文搞懂 JavaScript 模块化规范:CommonJS、AMD、ES6 Module

ES6 Module 标准,这一标准通过静态分析、异步加载和浏览器原生支持,解决了 CommonJS 规范中的许多问题,为开发者提供了更强大和灵活的模块化支持。
ES6 Module 在编译时就可以确定模块的依赖关系,从而实现静态分析和树摇(Tree Shaking)优化。这意味着模块中没有被使用的代码可以在打包阶段被移除,从而减小最终的文件大小。
import 和 export 关键字来导入和导出模块成员。导出可以是命名导出(Named Export)或默认导出(Default Export)。

export default 用于导出模块的默认值。在一个模块中,只能有一个默认导出。其他文件中通过 import 语句以任意名称导入。
export 用于命名导出。在一个模块中可以有多个命名导出。其他文件中通过具体的名称来导入。
— 可同时存在
动态导入(Dynamic Import) : 需要按需加载的场景

CommonJS:适用于 Node.js 服务端开发,使用同步加载机制。
AMD:适用于浏览器环境,使用异步加载机制,解决了前端模块依赖问题。 :较复杂的定义方式
ES6 Module:现代浏览器和 JavaScript 语言级别的模块化标准,支持静态分析、异步加载和 Tree Shaking,是当前前端开发的主流选择。

2. 加载器(Loaders)

加载器(Loaders)允许 Webpack 处理非 JavaScript 文件(例如 CSS、图片或字体文件)。通过配置不同的加载器,你可以让 Webpack 将这些文件转换为有效的模块,并一起打包。例如,css-loader 用于将 CSS 文件转换为 JavaScript 模块,file-loader 用于处理文件资源。

3. 插件(Plugins)

插件(Plugins)用于执行范围更广、更复杂的任务,如打包优化、资源管理和环境变量注入等。例如,HtmlWebpackPlugin 可以帮助你生成 HTML 文件,并将打包后的资源自动注入到这个 HTML 中。

4. 打包过程

Webpack 的打包过程大致可以分为以下几个步骤:

a. 入口(Entry)
Webpack 通过一个或多个入口点开始构建依赖图。入口可以是一个文件或多个文件。

module.exports = {entry: './src/index.js'
};

b. 模块(Modules)
Webpack 会从配置的入口点开始,递归地构建出所有依赖的模块。它会分析模块间的依赖关系,形成一个依赖图(dependency graph)。

c. 加载器(Loaders)
对于每个模块,Webpack 会使用相应的加载器来转换文件。例如,如果模块是 CSS 文件,css-loader 会将 CSS 文件转换为 JavaScript 模块。

module.exports = {module: {rules: [{ test: /\.css$/, use: ['style-loader', 'css-loader'] }]}
};

d. 插件(Plugins)
在生成资源后,Webpack 会执行配置的插件。插件可以对资源进行额外的处理,例如压缩、优化或环境变量的注入。

const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {plugins: [new HtmlWebpackPlugin({ template: './src/index.html' })]
};

e. 输出(Output)
最后,Webpack 会输出打包后的文件。这通常是一个或多个 JavaScript 文件,以及其他资源文件(如 CSS、图片等)。
module.exports = {
output: {
filename: ‘bundle.js’,
path: path.resolve(__dirname, ‘dist’)
}
};

通过以上步骤,Webpack 能够有效地将各种资源打包成一个或多个浏览器可以直接运行的 JavaScript 文件。这种模块化和自动化的打包方式极大地提高了前端开发的效率和项目的可维护性。

‌Tree Shaking‌

是一种在JavaScript打包过程中优化代码的技术,旨在通过静态分析删除未使用的代码,从而减少输出文件体积,提高加载速度和执行效率。

基本概念和作用
Tree Shaking 本质上是一种“静态死代码删除”技术,其名字来源于“摇树”(shake tree)的比喻:将一棵树摇晃,未固定的叶子(无用代码)就会掉落。在 JavaScript 打包场景中,Tree Shaking 通过扫描和分析代码之间的依赖关系(尤其是使用 ES6 模块系统的静态 import/export 结构)来识别哪些模块或代码块没有被使用,然后在生成最终打包文件时将这些代码剔除‌

实现原理

Tree Shaking 的实现依赖于几个关键机制和条件:

1、‌‌代码解析‌与抽象语法树(AST)的构建:ES6 模块(使用 import 和 export)具有静态结构,编译器可以在编译期间确定模块之间的依赖关系‌

2、静态分析‌:
通过分析代码的导入导出关系,确定哪些导出值未被其他模块使用,并将其删除‌

在不同工具中的实现

Webpack‌: 在 Webpack 中,启动 Tree Shaking 功能需要同时满足以下条件:使用 ESM 规范编写模块代码、配置 optimization.usedExports 为 true、设置 mode 为 production 并启用代码优化功能‌

‌Rollup‌:由 Rich Harris 率先实现,支持更细粒度的 Tree Shaking‌

实际应用案例

在 Vue3 中,Tree Shaking 特性通过将全局 API 进行分块,并通过 ES6 模块化的方式引入。如果不使用某些功能,它们将不会包含在基础包中。这样在编译时就能确定模块的依赖关系,让打包工具(如 Webpack 或 Rollup 等)可以对没有用到的 API 进行剔除,从而最小化打包体积‌

Tree Shaking对于require()语句来引入模块难以优化‌,主要原因在于ES6模块(import/export)和CommonJS模块(require/module.exports)在静态分析和动态导入方面的差异。

原因分析

‌静态分析与动态导入‌:

‌ES6模块‌:ES6模块的导入和导出是静态的,这意味着在编译时就可以确定哪些代码会被导入或导出。这使得打包工具(如Webpack)能够进行静态分析,识别出未使用的代码并将其移除‌

‌CommonJS模块‌:CommonJS模块的导入是通过动态执行require()函数实现的,这种动态导入方式使得打包工具无法在编译时确定哪些代码会被使用,因此无法进行有效的静态分析,从而难以实现Tree Shaking‌。

打包工具的支持‌:

‌Webpack‌:在Webpack 4及以上版本中,Tree Shaking是默认开启的,但仅支持ES6模块。对于CommonJS模块,Webpack无法进行静态分析,因此无法进行Tree Shaking‌

‌Rollup‌:Rollup本身对Tree Shaking的支持非常好,但同样仅支持ES6模块。如果项目中使用了CommonJS模块,需要进行转换或排除处理‌

解决方案

‌转换模块语法‌:将CommonJS模块转换为ES6模块。例如,将const moduleA = require(‘./moduleA’);转换为import moduleA from ‘./moduleA’;。这样可以确保打包工具能够进行静态分析,从而实现Tree Shaking‌、

‌配置打包工具‌:在Webpack配置文件中,确保mode设置为production,这样Tree Shaking会在生产模式下自动启用。同时,避免使用会阻止Tree Shaking的配置选项,如optimization.sideEffects应设置为false或正确配置‌

webpack4和webpack5,为什么要使用5而不用4?
webpack超详细教程,学webpack看这一篇就够了!(上)
webpack超详细教程,学webpack看这一篇就够了!(下)

开发模式注重代码热替换更快,让开发调试代码更便捷
生产模式注重项目体积更小,更轻量,适配不同的浏览器环境
注意:Webpack 默认入口和出口分别为:
src/index.js 和 dist/main.js

技术之间的建立基础:

webpack是建立在node.js的基础上
const 变量名 = require(‘模块名或路径’)
// Node.js 环境内置模块直接写模块名(例如:fs,path,http)

vue-cli 不同版本 对应的 webpack版本 及生成项目的目录
在使用 Vue CLI 创建项目时,Vue CLI 会自动配置好 Webpack 版本,以便开发者可以更加专注于开发而不必深入了解底层的构建工具。。

Vue CLI 版本与 Webpack 版本
自从 Vue CLI 3.x 版本开始,Vue CLI 使用了 Webpack 作为其默认的构建工具。但是,随着 Vue CLI 的更新,Webpack 的版本也可能发生变化。以下是 Vue CLI 版本与 Webpack 版本的大致对应关系:

Vue CLI 2.x

Webpack 版本:通常使用 Webpack 2 或 Webpack 3。
特点:Vue CLI 2.x 主要针对 Vue 2.x 项目。

Vue CLI 3.x

Webpack 版本:从 Vue CLI 3.0 开始,默认使用 Webpack 4。
特点:引入了 Vue CLI 的插件系统,支持更灵活的配置和扩展。

Vue CLI 4.x

Webpack 版本:继续使用 Webpack 4。
特点:进一步优化了项目结构和构建性能。

Vue CLI 5.x

Webpack 版本:理论上仍使用 Webpack 5(尽管 Vue CLI 5.x 目前仍在 beta 阶段,官方文档可能还未完全更新)。

特点:引入了 Vite 作为可选的构建工具,提供了更快的开发服务器启动和热重载。
生成的项目的目录结构
不论使用哪个版本的 Vue CLI,生成的项目的目录结构基本相同,

主要目录包括:

/node_modules: 存放 npm 包。
/public: 存放静态资源如 index.html 和 favicon.ico。
/src:
/assets: 存放图片、字体等静态资源。
/components: 存放 Vue 组件。
/views: (在某些配置中)存放视图文件。
App.vue: 项目的主组件。
main.js/main.ts: 项目入口文件。
/dist: (在生产环境下构建时生成)存放构建后的代码。
/config 或 vue.config.js: 项目配置文件,用于修改默认的 webpack 配置等。
package.json: 项目依赖和脚本配置文件。
.gitignore: Git 忽略文件配置。

如何查看当前项目的 Webpack 版本

1、查看 package.json 文件:在 dependencies 或 devDependencies 部分查找 webpack 条目。
“webpack”: “^4.41.2” // 或其他版本号

2、运行命令:在项目根目录下运行以下命令可以查看已安装的 Webpack 版本:

npm list webpack --depth=0

或者如果你使用 yarn:

yarn list --pattern webpack --depth=0

vue-cli2 与vue-cli3,vue2与vue3 初始化项目,本地vue项目,详细解析区别(2024-04-19)
如何搭建一个vue2项目(完整步骤)

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

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

相关文章

HTML5中的Microdata与历史记录管理详解

HTML5中的Microdata与历史记录管理解析 一、Microdata结构化数据 核心属性 itemscope 声明数据范围itemtype 指定数据词汇表&#xff08;如http://schema.org/Product&#xff09;itemprop 定义数据属性 <div itemscope itemtype"http://schema.org/Book">…

《算法笔记》11.7小节——动态规划专题->背包问题 问题 A: 装箱问题

【问题描述】 有一个箱子的容量为V&#xff08;V为正整数&#xff0c;且满足0≤V≤20000&#xff09;&#xff0c;同时有n件物品&#xff08;0的体积值为正整数。 要求从n件物品中&#xff0c;选取若干装入箱内&#xff0c;使箱子的剩余空间最小。 输入&#xff1a; 1行整数&a…

Compose笔记(二十五)--Brush

这一节主要了解一下Compose中Brush,在Jetpack Compose里&#xff0c;Brush是一个重要的 API&#xff0c;它用于定义填充图形的颜色渐变或图案&#xff0c;能够为界面元素添加丰富的视觉效果。简单总结如下: 1 常见场景 填充形状&#xff08;圆形、矩形等&#xff09; 创建渐变…

离线服务器Python环境配置指南

离线服务器Python环境配置指南&#xff1a;避坑与实战 0. 场景分析&#xff1a;当服务器与世隔绝时 典型困境&#xff1a; 无法访问国际网络&#xff08;如PyPI、Conda官方源&#xff09;服务器处于内网隔离环境安全策略限制在线安装 解决方案矩阵&#xff1a; 方法适用场…

Mac下载bilibili视频

安装 安装 yt-dlp brew install yt-dlp安装FFmpeg 用于合并音视频流、转码等操作 brew install ffmpeg使用 下载单个视频 查看可用格式 yt-dlp -F --cookies-from-browser chrome "https://www.bilibili.com/video/BV15B4y1G7F3?spm_id_from333.788.recommend_more_vid…

常见的实时通信技术(轮询、sse、websocket、webhooks)

1. HTTP轮询&#xff1a;最老实的办法 刚开始做实时功能时&#xff0c;我第一个想到的就是轮询。特别简单直白&#xff0c;就像你每隔5分钟就刷新一次朋友圈看看有没有新消息一样。 短轮询&#xff1a;勤快但费劲 短轮询就是客户端隔三差五地问服务器&#xff1a;"有新…

Elasticsearch Fetch阶段面试题

Elasticsearch Fetch阶段面试题 🚀 目录 基础原理性能优化错误排查场景设计底层机制总结基础原理 🔍 面试题1:基础原理 题目: 请描述Elasticsearch分布式搜索中Query阶段和Fetch阶段的工作流程,为什么需要将搜索过程拆分为这两个阶段? 👉 点击查看答案 查询流程…

vr制作公司提供什么服务?

随着科技的迅猛进步&#xff0c;虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;技术已经悄然渗透到我们的日常生活与工作中&#xff0c;成为推动数字化转型的重要力量。VR制作公司&#xff0c;作为前沿领域的探索者和实践者&#xff0c;以专业的技术和创新…

COCO数据集神经网络性能现状2025.5.18

根据当前搜索结果&#xff0c;截至2025年5月&#xff0c;COCO数据集上性能最佳的神经网络模型及其关键参数如下&#xff1a; 1. D-FINE&#xff08;中科大团队&#xff09; 性能参数&#xff1a; 在COCO数据集上以78 FPS的速度实现了59.3%的平均精度&#xff08;AP&#xff0…

Sentinel原理与SpringBoot整合实战

前言 随着微服务架构的广泛应用&#xff0c;服务和服务之间的稳定性变得越来越重要。在高并发场景下&#xff0c;如何保障服务的稳定性和可用性成为了一个关键问题。阿里巴巴开源的Sentinel作为一个面向分布式服务架构的流量控制组件&#xff0c;提供了从流量控制、熔断降级、…

Ubuntu 20.04 报错记录: Matplotlib 无法使用 OpenCV 的 libqxcb.so

网上查了一下这个报错&#xff0c;有很多解决方案&#xff0c;但是都不是针对 OpenCV 触发的这种 qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in " */lib/*/site-packages/cv2/qt/plugins" even though it was found. 本文的方案是牺牲 …

配置代理服务器访问github、google

配置代理服务器访问github、google 背景与原理配置环境配置步骤云主机配置Windows客户端创建SSH隧道安装 Windows 内置 OpenSSHssh config 配置文件创建动态代理隧道 浏览器代理设置 验证浏览器访问google、githubssh 访问github 背景与原理 由于网络政策限制&#xff0c;中国…

网络学习-利用reactor实现http请求(六)

一、实现HTTP请求 1、印象里面&#xff0c;总有人说C/C语言不能实现HTTP请求&#xff0c;其实不然。C/C语言完全可以实现HTTP请求。通过对select,poll,epoll等IO多路复用技术的学习以及reactor模式的学习&#xff0c;完全能够实现HTTP请求。 2、webserver 主要解决两个问题 …

【VSCode】修改侧边文件资源管理器中的文件夹折叠模式

默认为紧凑模式&#xff1a; 然后我们勾选该项为宽松模式&#xff1a;

信息化时代国产主板如何防止信息泄露?

在数字化时代&#xff0c;每一份机密的泄露都可能成为我们的致命伤&#xff0c;尤其是如今网络如此发达的5G时代&#xff0c;如何防止网络信息泄密&#xff0c;已经成为每个人必须直面的问题。随着网络安全问题日益严重&#xff0c;企业和个人对网络安全的重视程度不断加深&…

vue的简单使用

1.vue的引入 引入函数&#xff0c;创建createApp对象 <div id"app">{{ message }}</div><script type"module">import { createApp, ref } from https://unpkg.com/vue3/dist/vue.esm-browser.jscreateApp({setup() {const message re…

【图像生成大模型】HunyuanVideo:大规模视频生成模型的系统性框架

HunyuanVideo&#xff1a;大规模视频生成模型的系统性框架 引言HunyuanVideo 项目概述核心技术1. 统一的图像和视频生成架构2. 多模态大语言模型&#xff08;MLLM&#xff09;文本编码器3. 3D VAE4. 提示重写&#xff08;Prompt Rewrite&#xff09; 项目运行方式与执行步骤1. …

DPDK 技术详解:榨干网络性能的“瑞士军刀”

你是否曾感觉&#xff0c;即使拥有顶级的服务器和万兆网卡&#xff0c;你的网络应用也总是“喂不饱”硬件&#xff0c;性能总差那么一口气&#xff1f;传统的网络处理方式&#xff0c;就像在高速公路上设置了太多的收费站和检查点&#xff0c;限制了数据包的“奔跑”速度。 今…

力扣网-复写零

1.题目要求 2.题目链接 1089. 复写零 - 力扣&#xff08;LeetCode&#xff09; 3.题目解答 class Solution {public void duplicateZeros(int[] arr) {int cur0,dest-1,narr.length;while(cur<n){//遇到0就dest走两步if(arr[cur]0){dest2;}//遇到非零元素dest就走一步els…

STL中的Vector(顺序表)

vector容器的基本用法&#xff1a; template<class T> class vector { T* _a; size_t size; size_t capacity; } 尾插和遍历&#xff1a; vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3);//遍历 for(int i0;i<v.size();i) {cout<<…