Webpack 深度解析与实战指南

文章目录

    • 前言
    • 一、安装于基本配置
      • 安装Webpack 和 Webpack CLI
      • 创建基本配置文件
    • 二、加载器
      • 常见的加载器
      • 配置加载器
    • 三、插件(Plugins)
      • 常用的插件
      • 配置插件
    • 四、性能优化
      • 缓存
      • 代码分割
      • Tree Shaking
      • 压缩
    • 五、开发服务器
      • 安装服务器
      • 配置服务器
      • 启动服务器
      • 生产环境配置
    • 结语


前言

Webpack 是一个现代 JavaScript 应用程序的模块打包器,它能够将各种资源(如 JavaScript、CSS、图片等)视为模块,并通过依赖图来组织这些模块,最终输出优化后的资源文件。本文将深入探讨 Webpack 的核心概念、配置方法、高级功能及最佳实践。


一、安装于基本配置

安装Webpack 和 Webpack CLI

首先,确保你的机器上已经安装了 Node.js。接着,通过 npm 安装 Webpack 和 Webpack CLI:

npm install --save-dev webpack webpack-cli

创建基本配置文件

在项目根目录下创建一个 webpack.config.js 文件,这是 Webpack 的配置入口。以下是一个简单的配置示例:

const path = require('path');module.exports = {entry: './src/index.js', // 入口文件output: {filename: 'bundle.js', // 输出文件名path: path.resolve(__dirname, 'dist') // 输出路径},module: {rules: [{test: /\.js$/, // 匹配以 .js 结尾的文件exclude: /node_modules/, // 排除 node_modules 目录下的文件use: {loader: 'babel-loader' // 使用 babel-loader 处理 ES6+ 语法}}]}
};

二、加载器

加载器是 Webpack 的核心组件之一,用于转换某些类型的模块。它们可以编译高级语言(如 TypeScript)、转换文件内容(如 LESS 到 CSS),甚至执行压缩操作。

常见的加载器

  • babel-loader:编译 ES6+ 语法为向后兼容的 JavaScript。
  • css-loader:解析 CSS 文件中的 @import 和 url() 语句。
  • style-loader:将 CSS 注入到 DOM 中。
  • file-loader 和 url-loader:处理文件引用,可以将文件输出到指定目录或将其转换为 Data URL。
  • ts-loader:编译 TypeScript 代码。

配置加载器

webpack.config.js 中配置加载器:

module.exports = {// ...其他配置module: {rules: [{test: /\.js$/,exclude: /node_modules/,use: {loader: 'babel-loader'}},{test: /\.css$/,use: ['style-loader', 'css-loader']},{test: /\.(png|jpe?g|gif)$/i,use: [{loader: 'file-loader',options: {outputPath: 'assets/images'}}]},{test: /\.ts$/,use: 'ts-loader',exclude: /node_modules/}]}
};

三、插件(Plugins)

插件用于扩展 Webpack 的功能,支持更复杂的构建步骤

常用的插件

  • HtmlWebpackPlugin:根据模板生成 HTML 文件,自动注入所有输出的脚本和样式表。
  • MiniCssExtractPlugin:提取 CSS 文件,而不是将其注入到 DOM 中。
  • CleanWebpackPlugin:清理输出目录。
  • DefinePlugin:定义全局常量。
  • HotModuleReplacementPlugin:启用模块热替换。

配置插件

webpack.config.js 中配置插件:

const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');module.exports = {// ...其他配置plugins: [new HtmlWebpackPlugin({template: './src/index.html'}),new MiniCssExtractPlugin({filename: '[name].[contenthash].css'}),new CleanWebpackPlugin(),new webpack.DefinePlugin({'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)})]
};

四、性能优化

随着项目的增长,Webpack 构建时间可能会变得非常长。为了提高性能,可以采取以下措施:

  • 缓存:利用持久化缓存机制,避免重新编译未更改的模块。
  • 代码分割:通过动态导入实现按需加载,减少初始加载时间。
  • Tree Shaking:移除未使用的导出代码,减小打包后的文件大小。
  • 压缩:使用 TerserPlugin 压缩 JavaScript 文件,使用 mini-css-extract-plugin 提取并压缩 CSS 文件。

缓存

Webpack 默认会缓存中间文件,但你可以通过配置进一步优化缓存:

module.exports = {// ...其他配置cache: {type: 'filesystem'}
};

代码分割

使用动态导入(import())进行代码分割:

button.addEventListener('click', () => {import('./module.js').then((module) => {module.default();});
});

Tree Shaking

确保使用严格模式编写代码,并启用 sideEffects 标记:

{"sideEffects": false
}

压缩

配置 TerserPluginMiniCssExtractPlugin 进行压缩:

const TerserPlugin = require('terser-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');module.exports = {// ...其他配置optimization: {minimizer: [new TerserPlugin(),new MiniCssExtractPlugin({filename: '[name].[contenthash].css'})]}
};

五、开发服务器

Webpack 还提供了一个强大的开发服务器 webpack-dev-server,它支持热模块替换(HMR),允许你在修改代码后立即看到效果,而无需刷新整个页面。

安装服务器

npm install --save-dev webpack-dev-server

配置服务器

webpack.config.js 中配置开发服务器:

module.exports = {// ...其他配置devServer: {contentBase: './dist',hot: true,port: 3000},plugins: [new webpack.HotModuleReplacementPlugin()]
};

启动服务器

package.json 中添加启动命令:

"scripts": {"start": "webpack serve --open"
}

现在,只需运行 npm start 即可启动开发服务器,并自动打开浏览器窗口访问应用。

生产环境配置

对于生产环境,推荐使用 mode 参数来指定环境类型,这将启用不同的优化策略:

module.exports = {mode: 'production',// ...其他配置
};

多页应用(Multi-page Application)
对于多页应用,可以配置多个入口点:

module.exports = {entry: {pageOne: './src/pageOne/index.js',pageTwo: './src/pageTwo/index.js'},output: {filename: '[name].bundle.js',path: path.resolve(__dirname, 'dist')},// ...其他配置
};

源码映射(Source Maps)
源码映射可以帮助你在浏览器开发者工具中调试原始源代码,而不是编译后的代码。可以在 webpack.config.js 中配置源码映射:

module.exports = {// ...其他配置devtool: 'source-map'
};

结语

Webpack 是一个强大且灵活的工具,适用于各种规模的应用程序开发。通过合理配置加载器和插件,以及实施有效的性能优化策略,可以显著提升开发效率和用户体验。希望本文能够帮助你更好地理解和使用 Webpack!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库: 初始MySQL +Navicat (学习笔记)

目录 一,MySQL数据库基本概念 1,数据 2,数据库 3,数据库管理系统 4,数据库应用程序 5,数据库管理员 6,最终用户 7,数据库系统 二,MySQL数据库的分类 1&#xf…

22.04Ubuntu---ROS2创建python节点

创建工作空间 mkdir -p 02_ros_ws/src 然后cd到该目录 创建功能包 在这条命令里,tom就是你的功能包 ros2 pkg create tom --build-type ament_python --dependencies rclpy 可以看到tom功能包已经被创建成功了。 使用tree命令,得到如下文件结构 此时…

多模态大模型技术方向和应用场景

多模态大模型(Multimodal Large Language Models,MLLM)是一种结合了大型语言模型(LLM)和大型视觉模型(LVM)的深度学习模型,它们能够处理和理解多种类型的数据,如文本、图…

力扣 LeetCode 977. 有序数组的平方

解题思路: 方法一:先平方再快排 方法二:双指针 因为可能有负数,所以对于一个数组 [ -5 , -3 , 0 , 2 , 4 ] 可以从两边向内靠拢,最大值一定出现在两端 设置指针 i 和指针 j 分别从左右两边靠拢 因为要从小到大排序…

程序员必备的几款爬虫软件,搞定复杂数据抓取任务

作为一名数据工程师,三天两头要采集数据,用过十几种爬虫软件,也用过Python爬虫库,还是建议新手使用现成的软件比较方便。 这里推荐3款不错的自动化爬虫工具,八爪鱼、亮数据、Web Scraper 1. 八爪鱼爬虫 八爪鱼爬虫是一…

008_SSH_Sqlserverl图书管理系统(学生注册 借书 还书)_lwplus87(免费送)

目 录 Abstract IV 第1章 概述... 1 1.1 课题背景... 1 1.2 课题意义... 1 1.3 文献综述... 2 1.3.1 技术综述... 2 1.4 总体设计原则... 2 第2章 系统分析... 4 2.1 系统的需求分析... 4 2.2 业务流程分析... 5 2.2.1 系统管理员业务流程分析... 5 2.3 数据流程分析... 7 2…

EM是什么?如何修复EM violation?

芯冰乐知识星球入口:芯冰乐 EM就electric-migration,即电迁移。电子在金属导体内迁移时,会与金属原子发生碰撞。时间久了,金属原子便会往电子方向进行移动,导致金属导体发生断裂的现象,我们称之为电迁移现象。 如果金属导体内的电流越大,意味着移动的电子数也就越多。…

SQL面试题——连续出现次数

SQL面试题——连续出现次数 其实前面关于连续问题,我们遇到过,就是最大连续登陆天数,或者是连续登陆天数的计算,可以参考我们之前的文章 SQL面试题——最大连续登陆问题 最大连续登陆问题 最大连续登陆问题的难点在于如何判断…

【LLM】3:从零开始训练大语言模型(预训练、微调、RLHF)

一、 大语言模型的训练过程 预训练阶段:PT(Pre training)。使用公开数据经过预训练得到预训练模型,预训练模型具备语言的初步理解;训练周期比较长;微调阶段1:SFT(指令微调/有监督微调…

腾讯云双11优惠大揭秘:省钱攻略不容错过!

文章目录 1 云服务来袭2 新手大礼包3 轻量应用服务器来袭4 腾讯云福利来袭5 福利代金券来袭 1 云服务来袭 云服务器能够灵活地提供计算和存储资源,帮助用户高效地应对信息技术需求,并保障数据的安全性。各大云服务商也因此纷纷推出多样化的优惠活动&…

皮卡超级壁纸 1.4.1 | 解锁会员版的全景壁纸、动态壁纸和超级壁纸

皮卡超级壁纸是一款提供海量壁纸的应用,不仅包含静态的精美壁纸,还提供了独特的超级壁纸。这些超级壁纸不仅仅是动态效果,还能自动匹配用户的手机UI,提供更加个性化的体验。解锁会员版后,用户可以享受更多高级功能和壁…

“绽放艺术风采、激发强国力量” 海南省第十一届中小学生艺术展演活动圆满开展

2024年11月1日,由省教育厅主办、琼台师范学院承办的海南省第十一届中小学生艺术展演省级展演活动在海口正式拉开帷幕。来自全省各市县、省属学校等共计4000余名师生参加本届中小学生艺术展演现场展演活动。 本届展演活动以“绽放艺术风采、激发强国力量”为主题&…

如何挑选靠谱的IP代理池?

嘿,寻觅一个靠谱的IP代理池就好比找到一双合脚的跑鞋,舒适性和耐用性缺一不可。IP代理池同样要支撑您在网络世界中“跑”得更快更远。所以,别急,我们来看看有哪些小妙招,教您挑选出最合适的IP代理池吧! 看…

2024/11/10周报

文章目录 摘要GCNCNNGA混合模型预测进水水质代码运行结果 文献阅读题目研究背景与意义研究方法数据采集与预处理GCN–CNNGA混合深度学习框架的构建 模型优化与实验邻接矩阵的构建与效果分析模型预测效果对比多步预测性能 模型优势与应用前景精度提升与处理效率运营决策的优化支…

公司内部最好用的开源导航网站(EasyNav)

公司导航门户 一个现代化的企业内部导航门户系统,用于集中管理和展示公司各类系统和资源的链接。 项目地址:https://github.com/starslink/EasyNav体验地址:www.easynav.icu/ 功能特点 🔐 用户认证与授权邮箱注册与验证 JWT t…

pulsar源码--3-官方文档杂技

消息队列中间件会保存消息,直到收到消费者消费成功并确认,在此之后消息便可以删除,不过什么时候删除,由中间件自己决定 ack消息会一直储存,直到现有的所有订阅都确认了这条消息,在此之后如果要继续保存则需…

为什么一些工业厂房的配电箱和供电线路要安装ALP?

1、什么是ALP? ALP 低压线路保护装置是一种智能型电气保护设备,适用于额定电压至 AC660V、额定电流至 AC400A、额定频率为 50/60Hz 的低压系统。集保护、测量、控制、总线通讯为一体,是低压馈线终端的智能化综合装置。 2、功能特点 ①能够…

如何让 AI 更懂你:提示词的秘密

目录 前言常见概念大语言模型(Large Language Model)大模型输入常见参数提示词工程的限制 战略思想效果评测复杂任务拆解提示词结构化加示例加要求加维度 提示词框架 前言 小册推荐:https://juejin.cn/book/7399064580883742774 评估响应内…

特征值分解原理和实战

特征值分解(Eigenvalue Decomposition)是线性代数中的一种重要技术,用于分析矩阵的内在属性。这种分解方法主要适用于方阵(即行数和列数相等的矩阵),用于将矩阵分解为其特征向量和特征值。 基本原理 假设 …

99人!关于第十八届中国青年科技奖拟表彰对象的公示!

本期精选SCI&EI ●IEEE 1区TOP 计算机类(含CCF); ●EI快刊:最快1周录用! 知网(CNKI)、谷歌学术期刊 ●7天录用-检索(100%录用),1周上线; 免费稿件评估 免费匹配…