58 vue-cli 以及 webpack 提供的默认的插件, 配置

news2025/1/13 6:22:48

前言

vue-cli 这边作为驱动 webpack 的一个应用

它需要构造 webpack 所需要的上下文, 以及参数

这里 我们来关注一下 vue-cli 这边为 webpack 构造的参数 的相关处理

webpack 这边上下文的配置, 主要分为了几个部分, Entry, Output, Module, Resolve, Plugin, DevServer, Optimization

从一个构造好的 webpackConfig 中也可以看到这个

242db7aa228e442b947cc8b77d2360e2.png

 

 

vue-cli 的 vue-plugin 的加载

内置的 plugin 列表如下, 依次对应于左边的 commands, config 中的各个 js

也是在这个流程中, npm run serve 和 npm run build 产生了一些配置上的差异 导致了一部分结果的差异

如下初始化的 webpackConfig 的配置, 也是基于这几个 vue-plugin

1408beaebafb4a8191a78c9b9d7a2492.png

 

 

webpackConfig - entry

客户端这边的访问入口

默认的 entry 是 src/main.js, 这个是在 @vue/cli-service/lib/config/base.js 中定义的

也可以手动配置多个 entry

0339d2c8de8b4a87a1179f52113f45b7.png

 

 

webpackConfig - output

这个定义的是 输出目录, 输出的文件名模板, publicPath 等等

这个主要是在 base.js, app.js 中进行处理的

d8766b10f52944b9827f390405d1e4f2.png

dbfb613a1bf64f08a8310d43809a123e.png

 

 

webpackConfig - module

webpack 的视角, 每一个文件均是 对应于一个 module

这个 module 模块, 就是对应于 webpack 这边需要配置的各种处理

module 的配置主要是在 base.js, assets.js 中进行处理的

 

比如 vue 文件使用 vue-loader 进行处理

2fca64f34f694fc9a953cfcfcae63822.png

 

比如图片文件, 更新它的 文件名称, 方式如下 generator

视频文件, 字体文件, 也是同样的道理, 类似的配置

e971ddb3ef144af684cb8dfb876f38fd.png

 

比如 css 文件, 使用 postcss-loader, 再使用 css-loader, 再使用 vue-style-loader 进行加载

ebc44b88166245aba0a50f0a75664a3a.png

 

比如 scss, sass 文件, 先使用 saas-loader, 再使用 postcss-loader 再使用 css-loader, 再使用 vue-style-loader 进行加载

2e7a83074cb8480e9b14cd6c6278866f.png

 

sass-loader 这边的主要作用是将 sass, scss 格式的输入转换为 css 的输出

postcss-loader 这边主要是将带新特性的 css 的输入 转换为各大浏览器兼容的 css

css-loader 用于支持 css 的 模块化, 压缩, 文件导入 等等特性

vue-style-loader 将 css 来兼容 vue, 将 css 更新为使用 dom 操作来实现目标 css 的样式的效果

 

 

webpackConfig - resolve

这个主要是 指的是类似于 占位符的功能

在业务代码中使用了 定义的相关占位符, 然后 webpack 这边对占位符进行解析, 然后 再进行后面的处理流程

比如我们常见的 @, 如下是一个 @ 的使用, 当然 使用的地方 很多

比如这里的 @/components/HelloWorld 等价于 D:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue

{
  path: '/HelloWorld',
  name: 'HelloWorld',
  component: () => import('@/components/HelloWorld')
}

 

然后一些预定义的变量初始化是在 base.js 中

933962d790d34dd387becfd2eb60e3c5.png

 

 

webpackConfig - plugin

这些插件是 webpack 提供强大功能 的入口之一

这些插件在 serve.js, app.js, base.js 中均有注册

这里的一系列的 plugin 又可以扩展出 很大一片知识点, 这里仅仅是 列举一些常见的解释一下

这些 plugin 依赖于 webpack 的 compiler 的各个钩子

b83bcd4784d04fa4996f41d1f1179493.png

 

 

VueLoaderPlugin

这个主要是用于解析 vue 文件, 解析出文件中的 template, script, style

然后后面 babel-loader 对加载之后的结果进行编译, 高于 es5 版本的特性, 更新为兼容 es5 特性的代码

ee5f033e8a38440784ee214679981fdd.png

 

这里是 babel-loader 的相关处理的地方, 下面一个红色箭头是上面 vue-loader 的加载的地方

442e32b4ba3c4eadbcdd503be124b97b.png

 

这里我们可以回顾一下前面 “npm run serve/build 的输出分析” 中的 vue-loader 加载 js 的部分

从这里我们可以看到整个处理流程是 外部请求了 “HelloWord.vue?vue&type=script&lang=js”, 然后接着是 vue-loader 加载 HelloWorld.vue, 接着是 babel-loader 对 vue-loader 处理结果进行处理

432abea642244c45b8ace8b6755d2dd6.png

 

 

DefinePlugin

增加一些 webpack 全局的占位符定义, 比如这里 需要将 process.env.NODE_ENV = “development” 定义进去

然后 这个 applyDefine 会在 parser 上面注册钩子, 如果 JavaScriptParser 解析 *.js 文件的时候, 看到了 process.env.NODE_ENV 将其解析为 “development” 

21de3209367844d3bfdde07acdf30d19.png

 

如下是 JavaScriptParser 解析 es.array.push.js 的时候, source 中为 es.array.push.js

第一个 source.substring(8270, 10076) 是第一层 包含 process.env.NODE_ENV 的语句

第二个 source.substring(8564, 8601) 是最具体的一层 包含 process.env.NODE_ENV 的语句

a55c0890dad745ab9442dc4cbb9375b2.png

 

然后由 DefinePlugin 这边添加到 parser 这边的回调进行处理, 将 process.env.NODE_ENV 解析为 development

这也就是我们的 *.js 中可以使用 process.env.NODE_ENV 的原因

8d61a9f7e8194f768fa97b63311497d5.png

 

 

FriendlyErrorsWebpackPlugin

创建了 Compiler 之后, plugin 往 Compiler 上面注册了 关注的事件 的回调, 比如这里关心 编译完成 和 发生非法事件

对于 编译完成之后, 输出编译成功, 暴露的服务的信息到控制台, 如果有错误, 输出错误信息到控制台

4cc4bb5a4a07438ea6c83d7de9f9dd61.png

 

如下编译成功的日志信息的输出, 就是由 FriendlyErrorPlugins 输出

ea2a49e23eac46c3b111d32532477949.png

 

然后之后的 暴露的端口, 服务信息, 是由 vue-cli 这边注册的回调输出的

a699e0753fde44b7b72845f93334fe80.png

 

我们常见的 warning, error 的信息, 也是从这个插件输出出来的

657133bf2c294c26a3d332fa337d091e.png

 

 

HtmlWebpackPlugin

这个插件就是用于生成 index.html, 更新占位符, 添加 css, jss 对应的 chunk 等等

这里就是根据 webpackConfig.entry 来生成各个 entry 的地方了, 通常来说 我们只有默认的 src/main.js 一个默认 entry , 情况如下

06990083b0844601a90c4da7f313b868.png

 

在 compiler 中获取生成的 css, jss 的相关 chunk, 然后 merge 到 index.html 中

并且这个过程中也提供了相当多的钩子函数, 允许外部程序去介入

7e595706e2934623a10fc7c78353d223.png

 

最终编译出来的 index.html 如下效果

9c409f15ad1b440e9db7a3ac69a2127b.png

 

 

CopyPlugin

这个 CopyPlugin 就是配置一个 需要拷贝的文件表达式, 配置一个 目标文件夹的路径

然后将 目标需要拷贝的文件, 拷贝到 目标文件夹下面

最常见的就是 app.js 提供的默认的拷贝 public 文件夹的操作, 将 public 下面的文件复制到打包之后的目录下面

015385ce062a4f3ab8f511f68118be18.png

 

比如说, 我这里在 public 下面新增了 1.txt, 2.txt, 1.js, 然后 npm run build 之后查看 dist 目录, 也可以看到新增的 1.txt, 2.txt, 1.js

4a77a4d3a11a4304be56591074b22efa.png

 

然后另外的一个比较典型的 CopyPlugin 的使用, 是 mars3d 的提供的测试用例中

它的目的是将 mars3d 的需要相关静态资源拷贝到 public 下面, 去提供服务, 供 mars3d 相关服务使用

56d187a64bc54f65a2a8964d9c41fa5a.png

 

 

webpackConfig - devServer

这个具体的配置项可以参见 webpack-dev-server 的 help, 可以查看所有的配置信息

vue-cli 这边传递下去的默认配置信息如下, 这里可以看到 端口尝试的处理

各种创建 webpack-dev-server 上下文所需要的信息

70919cf66f284653b949f387100ec042.png

 

 

webpackConfig - optimization

这是一些 打包优化的相关配置, 比如 包的拆分, 移除空包, 包内容的最小化, 压缩 等等功能

webpack 内置的优化功能有这些

我们经常能够调试到的有RealContentHashPlugin 和 SplitChunksPlugin

b877366cf75b42998d1d63b835514b05.png

 

优化的相关默认配置, 在 vue-cli 中也是在 app.js, base.js 中

9c9246fb07744007829a29efcb4486ad.png

 

 

webpack 本身提供的默认配置

这个就是 上下文均没有提供的配置的时候, webpack 为一部分必要的配置提供的一部分默认配置, 这里的上下文指的是 用户传入的 或者 vue-cli 传递给 webpack 的

这个主要是在 webpack/lib/config/defaults.js 中, 这里整个 applyWebpackOptionsDefaults 的内容较多, 这里不一一展示

比如我们经常提到的一些 npm run build 和 npm run serve 配置的默认值就是在这里产生的差异, 比如 devtool, minimize, cachedGroups 的默认配置 等等

ee4c0b5abd294c948baf931da6e45370.png

 

npm run serve 的输出文件名是类似于 各种名称, 而 npm run build 的输出文件名是类似于 id 的名称, 这个差异是在 applyOptimizationDefaults 中的配置产生的

看这里的 moduleIds, chunkIds 的配置, 如果是 deterministic 就是 hash取模 计算的一个数字标志, named 就是根据 chunkGroup 携带的元数据信息生成的一个友好的名称

这个名称的生成的具体的方式可以参见 “vue_webpack_split_chunk_strategy.docx” 中的 “npm run serve 中的 app.js 中默认情况下的 chunk 的拆分” 

01d7b37d79014971b76996834f77df1f.png

 

 

完 

 

 

 

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

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

相关文章

open-cd框架调试记录

源于论文Changer: Feature Interaction Is What You Need forChange Detection 源码位置:open-cd/README.md at main likyoo/open-cd (github.com) 同样是基于MMSegmentation框架的代码,不符合本人编程习惯所以一直也没有研究这东西,近期打…

第15章 File类与IO流

一 java.io.File类的使用 1.1 概述 File类及本章下的各种流,都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录(俗称文件夹),与平台无关。(体会万事万物皆对象)File 能新…

AcWing 788. 逆序对的数量——算法基础课题解

AcWing 788. 逆序对的数量 题目描述 给定一个长度为 n 的整数数列&#xff0c;请你计算数列中的逆序对的数量。 逆序对的定义如下&#xff1a;对于数列的第 i 个和第 j 个元素&#xff0c;如果满足 i<j且 a[i]>a[j]&#xff0c;则其为一个逆序对&#xff1b;否则不是。…

基于 Rust 标准库 API 使用 200 行代码实现 Http 1.1 协议简易服务

1. 背景 早在之前学过一波 Rust&#xff0c;但是由于没用武之地&#xff0c;没过多久又荒废了&#xff0c;最近想捡起来下。刚好看见有群里小伙伴说学习 Http 网络协议太难怎么办&#xff1f;其实很多技术都是相通的&#xff0c;只要你理解了技术的本质就可以自己实现它&#…

buu刷题(2)

[护网杯 2018]easy_tornado web buuctf [护网杯 2018]easy_tornado1_[护网杯 2018]easy_tornado 1-CSDN博客 render是渲染HTML页面用到的函数 这应该是一个模板注入漏洞 访问/fllllllllllllag&#xff0c;自动跳到了这个页面&#xff0c;可以看到 url 上有个msgError, 尝试将…

Node.js------模块化

◆ 能够说出模块化的好处◆ 能够知道 CommonJS 规定了哪些内容◆ 能够说出 Node.js 中模块的三大分类各自是什么◆ 能够使用 npm 管理包◆ 能够了解什么是规范的包结构◆ 能够了解模块的加载机制 一.模块化的基本概念 1.模块化 模块化是指解决一个复杂问题时&#xff0c…

大商创多用户商城系统 多处SQL注入漏洞复现

0x01 产品简介 大商创多用户商城系统是一个功能强大、灵活多变的新零售电商系统服务商。该系统支持平台自营和商家入驻,实现多元化经营模式,能够全面整合供应商、生产商、经销商和消费者等产业链资源,提高产品多样性,加快资金流动速度,并有助于减少不必要的成本输出。 0…

交换机特性解析

​1. 端口数量和类型: RJ-45端口: 最常见的端口类型,用于连接网线。 铜缆类型: 超五类、六类、七类等,影响传输速率和距离。 PoE功能: 支持为连接的设备供电,如IP电话、无线AP等。 光纤端口: 用于连接光纤,支持更长的传输距离和更高的速率。 光纤类型: 单模、多模等,影响传…

【核弹级安全事件】XZ Utils库中发现秘密后门,影响主要Linux发行版,软件供应链安全大事件

Red Hat 发布了一份“紧急安全警报”&#xff0c;警告称两款流行的数据压缩库XZ Utils&#xff08;先前称为LZMA Utils&#xff09;的两个版本已被植入恶意代码后门&#xff0c;这些代码旨在允许未授权的远程访问。 此次软件供应链攻击被追踪为CVE-2024-3094&#xff0c;其CVS…

计算机服务器中了halo勒索病毒怎么办,halo勒索病毒解密流程步骤

随着网络技术的不断应用&#xff0c;企业的生产运营得到了快速发展&#xff0c;越来越多的企业开始利用服务器数据库存储企业的重要信息文件&#xff0c;数据库为企业的生产运营提供了极大便利&#xff0c;但网络技术的不断发展也为企业的数据安全带来严重威胁。近日&#xff0…

IP-guard WebServer 任意文件读取漏洞复现

0x01 产品简介 IP-guard是由溢信科技股份有限公司开发的一款终端安全管理软件,旨在帮助企业保护终端设备安全、数据安全、管理网络使用和简化IT系统管理。 0x02 漏洞概述 由于IP-guard WebServer /ipg/static/appr/lib/flexpaper/php/view.php接口处未对用户输入的数据进行严…

C语言------冒泡法排序

一.前情提要 1.介绍 冒泡法排序法&#xff1a; 1)冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它重复地遍历要排序的列表&#xff0c;一次比较相邻的两个元素&#xff0c;并且如果它们的顺序错误就将它们交换过来。重复这个过程直到没有需…

聚酰亚胺PI材料难于粘接,用什么胶水粘接?那么让我们先一步步的从认识它开始(十八): 聚酰亚胺PI泡沫有哪些应用领域

聚酰亚胺PI泡沫有哪些应用领域 聚酰亚胺&#xff08;PI&#xff09;泡沫由于其一系列优异的特性&#xff0c;在许多高性能应用领域中都有广泛的应用&#xff0c;包括但不限于&#xff1a; 航空航天领域&#xff1a;聚酰亚胺PI泡沫由于其出色的耐高温、隔热和阻燃性能&#xff0…

C语言 循环控制——计数控制的循环

目录 循环语句 for语句 小结 循环结构有什么用&#xff1f; 国外某男子攻打自己的女友&#xff0c;并导致女友受伤&#xff0c;法官除判处他监禁和提供金钱补偿外&#xff0c;还处罚他抄写5000遍道歉辞&#xff1a; “Boys do not hit girls.” 循环的控制方法 循环语句 f…

Java NIO是New IO还是Non-blocking IO

文章目录 前言NIO到底叫啥通过对比理解NIO传统IO网络编程NIO引入的新概念NIO网络编程两者区别NIO的事件驱动 总结 前言 很多小伙伴对Java NIO的一些概念和编程不是很理解&#xff0c;希望通过本文对Java NIO与传统IO的对比&#xff0c;可以帮助大家更好地理解和掌握Java NIO。…

k8s存储卷 PV与PVC 理论学习

介绍 存储的管理是一个与计算实例的管理完全不同的问题。PersistentVolume 子系统为用户和管理员提供了一组 API&#xff0c;将存储如何制备的细节从其如何被使用中抽象出来。为了实现这点&#xff0c;我们引入了两个新的 API 资源&#xff1a;PersistentVolume 和 Persistent…

intellij idea 使用git撤销(取消)commit

git撤销(取消) 未 push的 commit Git&#xff0c;选择分支后&#xff0c;右键 Undo Commit &#xff0c;会把这个 commit 撤销。 git撤销(取消) 已经 push 的 commit 备份分支内容&#xff1a; 选中分支&#xff0c; 新建 分支&#xff0c;避免后续因为操作不当&#xff0c;导…

网络原理 - HTTP / HTTPS(4)——构造http请求

目录 一、postman 的下载安装以及简单介绍 1、下载安装 2、postman的介绍 二、通过 Java socket 构造 HTTP 请求 构造http请求的方式有两种&#xff1a;&#xff08;1&#xff09;通过代码构造&#xff08;有一点难度&#xff09; &#xff08;2&#xff09;通过第三…

【C++】探索C++中的类与对象(上)

​​ &#x1f331;博客主页&#xff1a;青竹雾色间. &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ✨人生如寄&#xff0c;多忧何为 ✨ C是一种强大的编程语言&#xff0c;其面向对象的特性使得代码结构更加清晰、易于维护和扩展。在C中&#xff0c;类与…

文件同步工具哪个好

背景 今天介绍一款文件实时同步工具PanguFlow,它能够实时地监控源端文件夹的变化&#xff0c;然后将这种变化实时同步到目标端&#xff0c;对于文件灾备冗余的场景可谓是再合适不过了&#xff0c;一些老铁可能有这样的需求&#xff0c;比如两台服务器需要做文件的双机热备&…