Webpack配置及工作流程
Webpack是一个现代JavaScript应用程序的静态模块打包器(module bundler)。当Webpack处理应用程序时,它会在内部构建一个依赖图(dependency graph),该图会映射项目所需的每个模块,并生成一个或多个bundle。
基本配置步骤
- 安装Webpack和Webpack CLI:
- 使用npm或yarn将Webpack及其命令行接口(CLI)安装为开发依赖。
npm install --save-dev webpack webpack-cli
- 使用npm或yarn将Webpack及其命令行接口(CLI)安装为开发依赖。
- 创建项目结构:
- 初始化项目(如果尚未初始化),并创建基本的文件和目录结构,如
src(源代码)和dist(分发代码)。
- 初始化项目(如果尚未初始化),并创建基本的文件和目录结构,如
- 编写入口文件:
- 在
src目录下创建一个或多个JavaScript文件作为Webpack的入口点。
- 在
- 创建Webpack配置文件:
- 在项目根目录下创建一个名为
webpack.config.js的文件,并配置入口(entry)、出口(output)、模块(module)、插件(plugins)等。
- 在项目根目录下创建一个名为
- 配置入口和出口:
- 指定Webpack的入口文件和输出文件。
const path = require('path');module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist'),},};
- 指定Webpack的入口文件和输出文件。
- 配置Loader:
- Loader用于处理非JavaScript文件(如CSS、图片等)。需要在
module.rules中配置。module: {rules: [{test: /\.css$/,use: ['style-loader', 'css-loader'],},// 其他Loader配置...],},
- Loader用于处理非JavaScript文件(如CSS、图片等)。需要在
- 配置Plugin:
- 插件用于执行范围更广的任务,如打包优化、环境变量注入等。
const HtmlWebpackPlugin = require('html-webpack-plugin');module.exports = {// ...plugins: [new HtmlWebpackPlugin({template: './src/index.html',}),// 其他插件配置...],};
- 插件用于执行范围更广的任务,如打包优化、环境变量注入等。
- 运行Webpack:
- 在
package.json中添加脚本命令,或在命令行中直接运行Webpack进行打包。"scripts": {"build": "webpack --mode production"}
- 在
高级配置点
- 多页应用打包:
- 通过配置多个入口和对应的HtmlWebpackPlugin实例来支持多页应用。
- 环境变量:
- 使用DefinePlugin或环境变量文件(如
.env文件)来定义不同环境下的变量。
- 使用DefinePlugin或环境变量文件(如
- 代码分割:
- 利用Webpack的动态导入功能(如
import())和SplitChunksPlugin来分割代码,实现按需加载。
- 利用Webpack的动态导入功能(如
- 构建优化:
- 使用Tree Shaking、代码压缩(如TerserPlugin)、图片压缩(如image-webpack-loader)等策略来优化构建结果。
- 开发服务器:
- 使用Webpack Dev Server来提供一个简单的web服务器,并支持实时重新加载(live reloading)和热模块替换(hot module replacement, HMR)。
工作流程
一、初始化阶段
- 读取配置:Webpack通过读取其配置文件(通常名为
webpack.config.js)来确定项目的构建规则和输出。这个文件包含了入口(entry)、出口(output)、模块(module)、插件(plugins)等配置信息。 - 初始化参数:从配置文件和命令行参数中读取并合并参数,得出最终的配置参数。
- 创建Compiler实例:使用这些参数初始化Compiler对象,并加载所有配置的插件。
二、编译阶段
- 确定入口:根据配置中的entry找出所有的入口文件。这些入口文件是Webpack构建依赖图的起点。
- 编译模块:
- 从入口文件出发,Webpack会递归地找出所有依赖的模块。
- 调用所有配置的Loader对模块进行翻译。Loader可以将模块从一种格式转换为另一种格式,例如将ES6代码转换为ES5代码,或将CSS文件转换为JavaScript模块。
- 在这个过程中,Webpack会构建出一个模块依赖图,这个图表示了所有模块之间的依赖关系。
- 完成模块编译:经过Loader翻译后,Webpack得到了每个模块被翻译后的最终内容以及它们之间的依赖关系。
三、输出阶段
- 输出资源:根据入口和模块之间的依赖关系,Webpack将模块组合成一个个包含多个模块的Chunk(代码块)。然后,Webpack将这些Chunk转换成一个或多个文件,并加入到输出列表中。
- 写入文件系统:在确定好输出内容后,Webpack根据配置确定输出的路径和文件名,并将文件内容写入到文件系统中。
四、插件执行
在Webpack的构建过程中,插件可以在特定的时机执行特定的任务。Webpack通过Tapable来组织这条复杂的构建流程,插件只需要监听它所关心的事件,就能在事件发生时执行相应的逻辑。例如,插件可以用于代码压缩、图片压缩、定义环境变量等。
五、总结
Webpack的工作原理可以概括为:通过读取配置文件确定构建规则,递归地构建模块依赖图,使用Loader翻译模块,将模块组合成Chunk并写入文件系统。在这个过程中,插件可以在特定的时机执行特定的任务,以扩展Webpack的功能。Webpack的这种设计使得它非常灵活和强大,能够处理各种复杂的构建需求。
相关文章:
Webpack配置及工作流程
Webpack是一个现代JavaScript应用程序的静态模块打包器(module bundler)。当Webpack处理应用程序时,它会在内部构建一个依赖图(dependency graph),该图会映射项目所需的每个模块,并生成一个或多…...
华为ensp实现防火墙的区域管理与用户认证
实验环境 基于该总公司内网,实现图片所在要求 后文配置请以本图为准 接口配置与网卡配置 1、创建vlan 2、防火墙g0/0/0与云页面登录 登录admin,密码Admin123,自行更改新密码 更改g0/0/0口ip,敲下命令service-manage all permit 网卡配置…...
深入解析 Laravel 策略路由:提高应用安全性与灵活性的利器
引言 Laravel 是一个功能强大的 PHP Web 应用框架,以其优雅和简洁的语法而受到开发者的喜爱。在 Laravel 中,路由是应用中非常重要的一部分,它负责将用户的请求映射到相应的控制器方法上。Laravel 提供了多种路由方式,其中策略路…...
Java | Leetcode Java题解之第228题汇总区间
题目: 题解: class Solution {public List<String> summaryRanges(int[] nums) {List<String> ans new ArrayList<>();for (int i 0, j, n nums.length; i < n; i j 1) {j i;while (j 1 < n && nums[j 1] num…...
使用Simulink基于模型设计(三):建模并验证系统
可以对系统结构中的每个组件进行建模,以表示该组件的物理行为或功能行为。通过使用测试数据对组件进行仿真,以验证它们的基本行为。 打开系统布局 对各个组件进行建模时,需要从大局上把握整个系统布局。首先加载布局模型。这里以simulink自…...
基于go 1.19的站点模板爬虫
好像就三步: 1 建立http连接 2 解析html内容 3 递归遍历 创建一个基于 Go 1.19 的网站模板爬虫主要涉及几个步骤,包括设置 HTTP 客户端来获取网页内容、解析 HTML 来提取所需的数据,以及处理可能的并发和错误。下面我会给出一个简单的例子来说明如何…...
0基础学会在亚马逊云科技AWS上搭建生成式AI云原生Serverless问答QA机器人(含代码和步骤)
小李哥今天带大家继续学习在国际主流云计算平台亚马逊云科技AWS上开发生成式AI软件应用方案。上一篇文章我们为大家介绍了,如何在亚马逊云科技上利用Amazon SageMaker搭建、部署和测试开源模型Llama 7B。下面我将会带大家探索如何搭建高扩展性、高可用的完全托管云原…...
[PaddlePaddle飞桨] PaddleOCR图像小模型部署
PaddleOCR的GitHub项目地址 推荐环境: PaddlePaddle > 2.1.2 Python > 3.7 CUDA > 10.1 CUDNN > 7.6pip下载指令: python -m pip install paddlepaddle-gpu2.5.1 -i https://pypi.tuna.tsinghua.edu.cn/simple pip install paddleocr2.7…...
C语言 | Leetcode C语言题解之第227题基本计算题II
题目: 题解: int calculate(char* s) {int n strlen(s);int stk[n], top 0;char preSign ;int num 0;for (int i 0; i < n; i) {if (isdigit(s[i])) {num num * 10 (int)(s[i] - 0);}if (!isdigit(s[i]) && s[i] ! || i n - 1) {s…...
kafka.common.KafkaException: Socket server failed to bind to xx:9092
部署分布式集群的时候遇到的错误。 解决方案: 修改config下的server.properties,添加 listenersPLAINTEXT://:9092 advertised.listenersPLAINTEXT://自己的服务器ip:9092 然后重新启动,检查进程是否存在ps -aux | grep kafka。 成功启动。...
【JS+H5+CSS实现烟花特效】
话不多说直接上代码 注意:背景图路径是picture/star.jpg,自己在同级目录先创键picture目录再下载一张图片命名为star.jpg HTML: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"vi…...
uniapp小程序使用webview 嵌套 vue 项目
uniapp小程序使用webview 嵌套 vue 项目 小程序中发送 <web-view :src"urlSrc" message"handleMessage"></web-view>export default {data() {return {urlSrc: "",};},onLoad(options) {// 我需要的参数比较多 所以比较臃肿// 获取…...
命令模式在金融业务中的应用及其框架实现
引言 命令模式(Command Pattern)是一种行为设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,并且支持请求的排队和撤销操作。在金融业务中,命令模式可以用于实现交易请求、撤销操作等功能。本文将介绍命令模式在金融业务中的使用,并探讨…...
WordPress的性能优化有哪些方法?
WordPress的性能优化方法主要包括以下几个方面: 1. 使用缓存插件:缓存插件可以降低服务器负载,提高网站加载速度。常用的缓存插件有WP Rocket、WP Fastest Cache和Cache Enabler等。 2. 代码压缩和整合:通过压缩JavaScript、CSS…...
【Python基础】代码如何打包成exe可执行文件
本文收录于 《一起学Python趣味编程》专栏,从零基础开始,分享一些Python编程知识,欢迎关注,谢谢! 文章目录 一、前言二、安装PyInstaller三、使用PyInstaller打包四、验证打包是否成功五、总结 一、前言 本文介绍如何…...
Golang | Leetcode Golang题解之第227题基本计算器II
题目: 题解: func calculate(s string) (ans int) {stack : []int{}preSign : num : 0for i, ch : range s {isDigit : 0 < ch && ch < 9if isDigit {num num*10 int(ch-0)}if !isDigit && ch ! || i len(s)-1 {switch preS…...
云端美味:iCloud中食谱与餐饮计划的智能存储方案
云端美味:iCloud中食谱与餐饮计划的智能存储方案 在数字化生活管理中,我们的食谱和餐饮计划是日常饮食健康与乐趣的重要部分。iCloud提供了一个无缝的解决方案,让我们可以在所有设备上存储、同步和访问这些珍贵的信息。本文将详细介绍如何在…...
leetcode:1332. 删除回文子序列(python3解法)
难度:简单 给你一个字符串 s,它仅由字母 a 和 b 组成。每一次删除操作都可以从 s 中删除一个回文 子序列。 返回删除给定字符串中所有字符(字符串为空)的最小删除次数。 「子序列」定义:如果一个字符串可以通过删除原字…...
智慧交通的神经中枢:Transformer模型在智能交通系统中的应用
智慧交通的神经中枢:Transformer模型在智能交通系统中的应用 随着城市化进程的加快,交通拥堵、事故频发、环境污染等问题日益严重。智能交通系统(ITS)作为解决这些问题的关键技术之一,受到了广泛关注。Transformer模型…...
PCIe驱动开发(1)— 开发环境搭建
PCIe驱动开发(1)— 开发环境搭建 一、前言 二、Ubuntu安装 参考: VMware下Ubuntu18.04虚拟机的安装 三、QEMU安装 参考文章:QEMU搭建X86_64 Ubuntu虚拟系统环境 四、安装Ubuntu 下载地址:https://old-releases.ubuntu.com…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...
快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...
大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...
