Webpack 基础入门
一、Webpack 是什么
Webpack 是一款现代 JavaScript 应用程序的静态模块打包工具。在 Web 开发中,我们的项目会包含各种类型的文件,如 JavaScript、CSS、图片等。Webpack 可以将这些文件打包成一个或多个文件,以便在浏览器中高效加载。它就像是一个超级管家,把项目中的各种资源整理打包,让它们能更好地协同工作。
二、为什么要使用 Webpack
- 代码拆分:可以将代码拆分成多个块,实现按需加载,提高页面加载速度。比如一个大型项目,有些功能可能不是用户一开始就需要的,Webpack 可以把这些功能代码单独打包,等用户用到时再加载。
- 模块加载:支持各种模块加载方式,如 ES6 模块、CommonJS 模块等,统一管理项目中的模块依赖。
- 处理不同类型文件:不仅能处理 JavaScript,还能处理 CSS、Sass、Less 等样式文件,以及图片、字体等资源文件。
三、Webpack 基础入门
(一)安装 Webpack
- 首先确保你已经安装了 Node.js,因为 Webpack 是基于 Node.js 运行的。
- 全局安装 Webpack 和 Webpack - CLI(命令行界面):
npm install webpack webpack - cli -g
(二)创建项目结构
- 创建一个新的文件夹,例如webpack - demo。
- 在该文件夹下创建以下文件和文件夹:
- src文件夹:用于存放源文件,在src文件夹下创建index.js文件。
- dist文件夹:用于存放打包后的文件,这个文件夹一开始可以不存在,Webpack 会在打包时自动生成。
(三)编写基础代码
在src/index.js中编写如下代码:
function add(a, b) {return a + b;
}
const result = add(1, 2);
console.log(result);
(四)配置 Webpack
在项目根目录下创建webpack.config.js文件,内容如下:
const path = require('path');
module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist')}
};
这里配置了入口文件entry为src/index.js,表示从这个文件开始打包;output指定了打包后的文件名filename为bundle.js,输出路径path为dist文件夹。
(五)执行打包
在命令行中进入项目根目录,执行以下命令:
webpack - - config webpack.config.js
执行成功后,会在dist文件夹下生成bundle.js文件。这个文件就是打包后的文件,包含了src/index.js中的代码以及相关依赖。
四、Webpack 核心功能
(一)加载器(Loaders)
- 作用:Webpack 本身只能处理 JavaScript 和 JSON 文件,Loaders 可以让 Webpack 处理其他类型的文件,如 CSS、图片等。
- 使用示例 - 加载 CSS 文件:
- 安装css - loader和style - loader:
npm install css - loader style - loader --save - dev
- 在src文件夹下创建styles.css文件,添加一些简单的样式:
body {background - color: lightblue;
}
- 修改src/index.js文件,引入styles.css:
import './styles.css';
function add(a, b) {return a + b;
}
const result = add(1, 2);
console.log(result);
- 修改webpack.config.js文件,配置加载器:
const path = require('path');
module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist')},module: {rules: [{test: /\.css$/,use: ['style - loader', 'css - loader']}]}
};
这里module.rules配置了一个规则,test表示匹配所有.css文件,use指定了使用style - loader和css - loader来处理这些文件。css - loader负责解析 CSS 文件,style - loader负责将解析后的 CSS 插入到 HTML 页面中。
(二)插件(Plugins)
- 作用:插件可以扩展 Webpack 的功能,实现更复杂的任务,如代码压缩、生成 HTML 文件、提取 CSS 为单独文件等。
- 使用示例 - 使用 HtmlWebpackPlugin 生成 HTML 文件:
- 安装html - webpack - plugin:
npm install html - webpack - plugin --save - dev
- 修改webpack.config.js文件,添加插件配置:
const path = require('path');
const HtmlWebpackPlugin = require('html - webpack - plugin');
module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist')},module: {rules: [{test: /\.css$/,use: ['style - loader', 'css - loader']}]},plugins: [new HtmlWebpackPlugin({title: 'Webpack Demo',template: './src/index.html'})]
};
这里引入了HtmlWebpackPlugin插件,配置了title为页面标题,template指定了使用src/index.html作为模板来生成 HTML 文件。在src文件夹下创建index.html文件:
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF - 8"><title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body><script src="bundle.js"></script>
</body>
</html>
再次执行打包命令,会在dist文件夹下生成一个 HTML 文件,并且自动引入了打包后的bundle.js文件。
- 常用插件补充
- TerserPlugin:用于压缩 JavaScript 代码,减小文件体积,提升加载速度。它是 Webpack 4 + 版本默认的代码压缩插件,无需额外安装。在webpack.config.js中配置如下:
const path = require('path');
const HtmlWebpackPlugin = require('html - webpack - plugin');
const TerserPlugin = require('terser - webpack - plugin');
module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist')},module: {rules: [{test: /\.css$/,use: ['style - loader', 'css - loader']}]},plugins: [new HtmlWebpackPlugin({title: 'Webpack Demo',template: './src/index.html'})],optimization: {minimizer: [new TerserPlugin()]}
};
- MiniCssExtractPlugin:将 CSS 从 JavaScript 文件中提取出来,生成单独的 CSS 文件。这在生产环境中很有用,因为浏览器可以单独缓存 CSS 文件。安装命令:
npm install mini - css - extract - plugin --save - dev
在webpack.config.js中配置如下:
const path = require('path');
const HtmlWebpackPlugin = require('html - webpack - plugin');
const MiniCssExtractPlugin = require('mini - css - extract - plugin');
module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist')},module: {rules: [{test: /\.css$/,use: [MiniCssExtractPlugin.loader, 'css - loader']}]},plugins: [new HtmlWebpackPlugin({title: 'Webpack Demo',template: './src/index.html'}),new MiniCssExtractPlugin({filename:'styles.css'})]
};
- CleanWebpackPlugin:在每次打包前清空输出目录,避免残留旧文件。安装命令:
npm install clean - webpack - plugin --save - dev
在webpack.config.js中配置如下:
const path = require('path');
const HtmlWebpackPlugin = require('html - webpack - plugin');
const MiniCssExtractPlugin = require('mini - css - extract - plugin');
const { CleanWebpackPlugin } = require('clean - webpack - plugin');
module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist')},module: {rules: [{test: /\.css$/,use: [MiniCssExtractPlugin.loader, 'css - loader']}]},plugins: [new HtmlWebpackPlugin({title: 'Webpack Demo',template: './src/index.html'}),new MiniCssExtractPlugin({filename:'styles.css'}),new CleanWebpackPlugin()]
};
(三)代码拆分与按需加载配置
- 原理:Webpack 的代码拆分是指将一个大的 JavaScript 文件拆分成多个小的文件,这些小文件可以在需要的时候再加载。按需加载就是在特定的时机(比如用户点击某个按钮、访问某个路由等)才加载对应的代码块,而不是在页面一开始就加载所有代码,从而提高页面的初始加载速度和用户体验。
- 基础配置:在 Webpack 4 + 版本中,可以使用splitChunks配置项来实现代码拆分。在webpack.config.js中添加如下配置:
const path = require('path');
const HtmlWebpackPlugin = require('html - webpack - plugin');
module.exports = {entry: './src/index.js',output: {filename: 'bundle.js',path: path.resolve(__dirname, 'dist'),// 为动态导入的代码块指定输出路径和文件名chunkFilename: '[name].[chunkhash].js'},module: {rules: [{test: /\.css$/,use: ['style - loader', 'css - loader']}]},plugins: [new HtmlWebpackPlugin({title: 'Webpack Demo',template: './src/index.html'})],optimization: {splitChunks: {chunks: 'all'}}
};
optimization.splitChunks.chunks: 'all’表示对所有类型的 chunk(入口 chunk、异步 chunk 等)都进行代码拆分。这里output.chunkFilename用于指定非入口 chunk(动态导入的代码块)的输出文件名,[name]会被替换为代码块的名称,[chunkhash]会根据代码块内容生成哈希值,用于缓存控制。
- 实际应用示例 - 动态导入模块实现按需加载:
- 在src文件夹下创建一个新的文件math.js,编写如下代码:
export function multiply(a, b) {return a * b;
}
- 修改src/index.js文件,通过动态导入的方式引入math.js模块:
import './styles.css';
function add(a, b) {return a + b;
}
const result = add(1, 2);
console.log(result);
// 点击按钮时动态导入math.js模块并调用multiply函数
document.addEventListener('DOMContentLoaded', function () {const button = document.createElement('button');button.textContent = '点击计算乘法';document.body.appendChild(button);button.addEventListener('click', function () {import('./math.js').then((module) => {const product = module.multiply(3, 4);console.log('乘法结果:', product);});});
});
这里使用import(‘./math.js’)动态导入math.js模块,这是 ES2020 引入的动态导入语法,Webpack 会自动将其拆分成一个单独的代码块。当用户点击按钮时,才会加载这个代码块,实现了按需加载。执行打包命令后,在dist文件夹下会生成除了bundle.js之外的math.[chunkhash].js文件,这就是拆分出来的代码块。
五、总结
通过以上步骤,我们对 Webpack 的基础和核心功能有了初步了解。Webpack 还有很多高级特性,如代码优化、热模块替换等,后续可以进一步深入学习。希望这篇文章能帮助大家顺利入门 Webpack,开启高效的 Web 开发之旅。
相关文章:
Webpack 基础入门
一、Webpack 是什么 Webpack 是一款现代 JavaScript 应用程序的静态模块打包工具。在 Web 开发中,我们的项目会包含各种类型的文件,如 JavaScript、CSS、图片等。Webpack 可以将这些文件打包成一个或多个文件,以便在浏览器中高效加载。它就像…...
deepseek-v3在阿里云和腾讯云的使用中的差异
随着deepseek在各大云商上线,试用了下阿里云和腾讯云的deepseek服务,在回答经典数学问题9.9和9.11谁大时,发现还是有差异的。将相关的问题记录如下。 1、问题表现 笔者使用的openai的官方sdk go-openai。 因本文中测验主要使用阿里云和腾讯…...
Mathtype安装入门指南
Mathtype安装入门指南 1 mathtype安装及补丁2 mathtype在word中加载3 常见的mathtype快捷命令4 实列测试 1 mathtype安装及补丁 下载相应的Mathtype7.4软件安装包,百度网盘链接为: 百度网盘链接下载完成后,有三个软件,如下图所示…...
使用 Apache PDFBox 提取 PDF 中的文本和图像
在许多应用中,我们需要从 PDF 文件中提取文本内容和嵌入的图像。为了实现这一目标,Apache PDFBox 是一个非常实用的开源工具库。它提供了丰富的 API,可以帮助我们轻松地读取 PDF 文件、提取其中的文本、图像以及其他资源。 本文将介绍如何使…...
【js逆向_入门】图灵爬虫练习平台 第四题
(base64解码)地址:aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvNC8 请求接口带有加密参数: 全局搜索Sign,找到参数生成位置 一目了然,知道参数是怎么构造生成的 调试代码 测试验证思路是否正确 时间: …...
Redis7——基础篇(三)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一)Redis(二) 接上期内容:上期完成了Redis的基本…...
深度学习中的知识蒸馏
大家好,我是小青 今天给大家分享神经网络中的一个关键概念,知识蒸馏 知识蒸馏(Knowledge Distillation)是一种模型压缩技术,旨在将大型、复杂的模型(通常称为教师模型)的知识迁移到小型、简单…...
【Windows软件 - HeidiSQL】导出数据库
HeidSQL导出数据库 软件信息 具体操作 示例文件 选项分析 选项(1) 结果(1) -- -------------------------------------------------------- -- 主机: 127.0.0.1 -- 服务器版本: …...
苏剑林“闭门造车”之多模态思路浅谈思考
原文来自科学空间苏剑林 “闭门造车”之多模态思路浅谈(一):无损输入和“闭门造车”之多模态思路浅谈(二):自回归,学习后总结。 文章目录 “闭门造车”之多模态思路浅谈(一ÿ…...
绿联nas docker 安装 rocketmq 队列。亲测可用
首先拉取docker 镜像,所需镜像如下: 安装 nameserver docker run -d -p 9876:9876 \ -v ${HOME}/docker/software/rocketmq/data/namesrv/logs:/opt/logs \ -v ${HOME}/docker/software/rocketmq/data/namesrv/store:/opt/store \ --name rmqnamesrv \ …...
C++(23):unreachable
C++23在头文件 "><utility>定义了std::unreachable(),用于指示编译器,该段代码不应该被允许,因此编译器可以对该位置进行优化,如果一旦允许了该位置的代码,行为未定义: #include <utility> #include <iostream>using namespace std;int func(…...
初等数论--欧几里得算法
1. 定义 u 0 u 1 ∈ Z , u 1 ≠ 0 , u 1 ∤ u 0 u_0\ u_1\in Z,u_1 \ne0,u_1 \nmid u_0 u0 u1∈Z,u10,u1∤u0 根据带余除法可得下面一系列等式 u 0 q 0 u 1 u 2 0 < u 2 < ∣ u 1 ∣ u 1 q 0 u 2 u 3 0 < u 3 < u 2 ⋯ u k − 1 q k − 1 u k …...
阿里云前端自动化部署流程指南
本文详细介绍从前端代码开发到阿里云 OSS/CDN 自动化部署的完整流程。 一、流程概览 © ivwdcwso (ID: u012172506) 1.1 部署流程图 #mermaid-svg-H1LBBmwTHAAF3QTL {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermai…...
EXCEL解决IF函数“您已为此函数输入太多个参数”的报错
IF函数的基本结构是IF(条件, 值为真时的结果, 值为假时的结果),所以标准的IF函数最多只能有三个参数。当用户输入的参数超过三个时,Excel就会报这个错误。比如多个IF语句叠加,但可能在嵌套的过程中没有正确关闭每个IF函数的括号,导…...
CAS单点登录(第7版)18.日志和审计
如有疑问,请看视频:CAS单点登录(第7版) 日志和审计 Logging 概述 Logging CAS 提供了一个日志记录工具,用于记录重要信息事件,如身份验证成功和失败;可以对其进行自定义以生成用于故障排除的其他信息。…...
2025年软件测试面试题大全(附答案+文档)
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、测试基础 1、测试策略或测试包括哪些,测试要覆盖哪些方面 UI、功能、性能、可靠性、易用性、兼容性、安全性、安装卸载 2、设计测试用例的办法 …...
太空飞船任务,生成一个地球发射、火星着陆以及下一次发射窗口返回地球的动画3D代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation from mpl_toolkits.mplot3d import Axes3D# 天体参数设置(简化模型) AU 1.5e8 # 天文单位(公里) earth_orbital_radius …...
IDEA——Mac版快捷键
目录 按键含义常用组合代码生成快捷键:代码追踪快捷键:高效编辑快捷键:代码重构快捷键:工具类快捷键:常规文件操作快捷键: 按键含义 ⌘ command Command键(⌘)相当于Windows中的Con…...
智能体系统(AI Agent System)是什么?——从概念解析到企业数字化转型的全景落地及投资视角
文章目录 一、 前言1.1 背景介绍1.2 写作目的 二、 智能体系统及相关概念解析2.1 智能体系统定义2.2 关键概念区分2.2.1 自主代理(Autonomous Agent)2.2.2 多智能体系统(MAS)2.2.3 人工智能/机器学习(AI/ML)…...
Vue 前端开发中的路由知识:从入门到精通
文章目录 引言1. Vue Router 简介1.1 安装 Vue Router1.2 配置 Vue Router1.3 在 Vue 实例中使用 Vue Router 2. 路由的基本用法2.1 路由映射2.2 路由视图2.3 路由链接 3. 动态路由3.1 动态路径参数3.2 访问动态参数3.3 响应路由参数的变化 4. 嵌套路由4.1 定义嵌套路由4.2 渲染…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
