当前位置: 首页 > news >正文

前端构建变更:从 webpack 换 vite

现状

这里以一个 op (内部运营管理用)项目为例,从 webpack 构建改为 vite 构建,提高本地开发效率,顺便也加深对 webpack 、 vite 的了解。

vite 是前端构建工具,使用 一系列预配置进行rollup 打包,还包括了一个开发服务器。

webpack 不只是打包工具,除了把文件打包在一起,还做了比如接入 babel 做降级处理使得在旧浏览器也能用 js 新特性、 ts 转 js 、打包 css、压缩 js 、压缩 css 等工作(这些 vite 借助 rollup 插件似乎也能实现? );webpack 还有开发服务器,支持 hmr(vite 也支持)

新版浏览器是默认支持 ts 、支持 es module 的,这使得在本地开发时不需要打包也能跑项目。
如下图所示,浏览器是直接请求 ts 资源的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

返回的文件也是 es module 格式的。
这样就省去了打包步骤,这是 vite 本地开发快的重要原因。
同时
1.Vite 使用 Esbuild 预构建依赖(commonjs 、 umd 转 esm,把多文件依赖打包为一个模块https://vitejs.cn/vite3-cn/guide/dep-pre-bundling.html),Esbuild 使用 Go 语言编写,比以 Node.js 编写的打包器预构建依赖快 10-100 倍。
2.vite 可以依赖浏览器缓存、 http 缓存策略缓存未变更的文件加快速度
先看项目现状,项目是 webpack 构建的,用了 ssr 。

本地开发

在这里插入图片描述
浏览器发起 请求,本地开发用 chrome 的SwitchyOmega插件配置规则把请求转发到 whistle,whistle 配置规则把这些请求到转发到本地的 3101 端口,3101就是nest 服务器启动服务监听的端口。

nestjs 服务遇到/pages 开头的页面资源请求走到对应 controller,然后去读 webpack 打包出来的本地文件的对应render 方法,render 方法创建 vue srr app,调用对应 renderToString渲染出 html 返回。
在这里插入图片描述
浏览器获取返回的 html进行水合,加载其他资源,这些资源从webpack 的本地服务器获取。
其他cgi 请求直接走 nestjs 服务。

线上

在这里插入图片描述
线上与本地类似,不过最后改为向 cdn 请求资源,如果 cdn 找不到,会回源到 nestjs 服务器拿。

转 vite

接着来看下流程上换了 vite 有什么变化

本地

在这里插入图片描述
cgi 请求继续走 nest 服务器,其他资源请求走 vite。

这里就没配hosts 把部分请求走到 vite 服务器,而是先去 nestjs,然后加个代理走到 vite 。其实配置多一个 hosts 可以更快,不过本来就很快了,区别不大。
在这里插入图片描述

线上

这个项目是 op,所以线上也直接用 vite 了,不需要考虑浏览器可能不支持 es module 问题。
跟本地的区别就是静态资源也放 nestjs 服务器了,nestjs 配置静态资源,根据对应前缀映射到对应本地文件路径。
在这里插入图片描述
在生产环境,vite也是 es module ,但做了打包。比如这里打包为了 61 个文件。在这里插入图片描述

这是因为当文件数多了之后,网络延迟确实会影响效率。
在这里插入图片描述
对于 cgi 请求,也是直接请求 nestjs 服务器;对于其他资源请求,nestjs可以配置静态资源路径,把某些路径下的映射到对应目录;对于页面请求,则读取 vite 打包出来的 html 返回。

在实际生产环境中(例子这里是 op 项目,不需要搞这么复杂),对静态资源请求应该放到 cdn,使用回源nestjs 服务器或者直接上传文件到 cdn ,替换资源 url的方法。

其他

静态资源

op 项目这边静态资源直接放 node 的,没放 cdn 。
对外项目要放 cdn ,可以通过配置 cdn 回源到我们模块对应文件实现,这种方法会导致灰度时会有静态资源 404,因为我们 node 和 cdn 没有做一致性哈希,某用户可能请求到了灰度的 node,但请求 cdn 时,cdn 找不到文件,会回源 node 可能回源到未灰度的机器。

不过 cdn 的 nginx 发现 404 会换机器重试,实际能换到灰度到的机器,所以用户体验不会有太大影响。只是会有 静态资源404 告警。

如果用直接传文件去 cdn,然后替换资源 url 的方法就没有上述告警问题。

cdn 回源

CDN回源就是当有用户访问某一个URL的时候,若是被解析到的那个CDN节点没有缓存响应的内容,或者是缓存已经到期,就会回源站去获取。

vite配置参考

import { defineConfig } from 'vite';
import vue from '@vitejs/plugin-vue'; // 处理 vue spa
import path from 'node:path';
import commonjs from 'vite-plugin-commonjs';// commonjs转 es module
import packageJson from './package.json';export const resolve = (dir: string): string => path.resolve(__dirname, dir);// https://vitejs.dev/config/
export default defineConfig({plugins: [commonjs(), vue()],resolve: {alias: [ // 别名{ find: /@\/(.*)/, replacement: '/web/$1' },{ find: /~\/(.*)/, replacement: '../$1' },{ find: /@shared\/(.*)/, replacement: '/../shared/src/$1' },],},define: { // 常量定义__isBrowser__: true,process: {env: {version: packageJson.version, // 读取 package.json 版本号},},},server: {port: 8101, // vite端口},build: {outDir: 'build/client', // 输出目录manifest: true,},// base: '/xxx', // 静态资源前缀,build 时才需要,打包出来的资源引用时会带上这个路径
});

马赛克部分就是 base 的路径
在这里插入图片描述

hmr

Hot Module Replacement
模块有变更时,不需要刷新页面,保留页面状态,节省开发时间。

原理

webpack/vite服务器监听本地文件变化,有变化时重新构建,根据 manifest 找到更新的文件,通过 websocket 通知浏览器里运行的 hmr runtime,runtime 从服务器获取新的文件进行更新。
这里怎么进行文件更新又不需要刷新页面呢?

流程

websocket 通知
在这里插入图片描述
在这里插入图片描述

第一个 json 请求有点没搞懂,不能直接websocket 通知时就告知要拉哪些新的文件吗?可以省一个请求?

vite ssr

ssr 是为了加快首屏响应,常规的 vue 应用可能是先返回 html,然后根据 url 路径,vue router 再去加载对应页面、组件的资源,加载完资源可能才去拉数据。
而 ssr 是在 node 返回 html 的时候,就完全了这些操作,直接把带数据的 html 返回到前端来加快首屏速度,但也因此加大了服务器负担。
后续也会补上关于 vite ssr 相关内容,未完待续。

相关文章:

前端构建变更:从 webpack 换 vite

现状 这里以一个 op (内部运营管理用)项目为例,从 webpack 构建改为 vite 构建,提高本地开发效率,顺便也加深对 webpack 、 vite 的了解。 vite 是前端构建工具,使用 一系列预配置进行rollup 打包&#x…...

记录基于Vue.js的移动端Tree树形组件

目录 一、Liquor Tree 入门 : Development Component Options 组件选项 Structure 结构 二、vue-treeselect Introduction 介绍 Getting Started 入门 Vue 树形选择器( Vue tree select )组件在搭建 Vue 的 app 中特别常用,Vue tree select 除了简单的树形结构…...

Vue中嵌入原生HTML页面的方法

在Vue中嵌入原生HTML页面通常可以通过组件或页面的方式来完成。下面将详细说明如何通过组件方式实现这个功能,并提供一个简单的代码示例。 方法说明 创建原生HTML页面:首先,你需要创建一个原生HTML页面,这个页面可以是一个独立的…...

17 # 类型检查机制:类型保护

例子: enum Type {Strong,Week }class Java {helloJava(){console.log(hello Java);} }class JavaScript {helloJavaScript(){console.log(hello JavaScript);} }function getLanguage(type: Type){let lang type Type.Strong ? new Java() : new JavaScript();…...

Vulnhub-RIPPER: 1渗透

文章目录 一、前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、rips的使用三、获取密码文件四、日志审查五、提权 一、前言 由于在做靶机的时候,涉及到的渗透思路是非常的广泛,所以在写文章的时候都是挑重点来写,尽量的不饶…...

幻兽帕鲁自建服务器:可以使用香港服务器吗?

随着网络技术的发展,越来越多的游戏爱好者选择通过自建服务器来享受游戏的乐趣。幻兽帕鲁作为一款备受喜爱的游戏,也有不少玩家想要自建服务器进行游戏。而在选择服务器地点时,很多玩家会想到使用香港服务器。那么,是否可以使用香…...

Revisiting image pyramid structure for high resolution salient object detection

accv2022的技术,在我测评的数据集上确实要明显好于basnet,rembg等一众方法。 1.Introduction 使用LR数据集训练的方法通过调整输入尺寸可以在HR图像上产生不错的结果。本文主要关注仅使用LR数据集进行训练以产生高质量的HR预测。HR的有效感受野ERFs和LR…...

中移(苏州)软件技术有限公司面试问题与解答(7)—— kmalloc与vmalloc的区别与联系及使用场景

接前一篇文章:中移(苏州)软件技术有限公司面试问题与解答(0)—— 面试感悟与问题记录 本文参考以下文章: kmalloc与vmalloc如何选择 Vmalloc与kmalloc的区别 特此致谢! 本文对于中移&#xf…...

微服务-微服务Alibaba-Nacos 源码分析 (源码流程图)

客户端流程 客户端心跳与实例往服务端注册...

后端性能优化的一些总结

目录 1、背景 2、优化实现 2.1查询数据表速度慢 2.2调别人接口速度慢 2.3导入速度慢、 2.4导出速度慢的做出介绍 2.5统计功能速度慢 3、总结 1、背景 系统上线后,被用户反应系统很多功能响应时长很慢。用户页面影响速度有要求,下面针对查询数据表…...

【升级openssl1.1.1t报错libssl.so.1.1: cannot open shared object file】

升级openssl报错: openssl vesion openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory 编译安装openssl1.1.1t当执行openssl version的时候,报上述错误,将编译到的…...

CVE-2024-0352 likeshop v2.5.7文件上传漏洞分析

本次的漏洞研究基于thinkPHP开发开的一款项目..... 漏洞描述 Likeshop是Likeshop开源的一个社交商务策略的完整解决方案,开源免费版基于thinkPHP开发。Likeshop 2.5.7.20210311及之前版本存在代码问题漏洞,该漏洞源于文件server/application/api/contr…...

JAVA处理类似饼状图占比和100%问题,采用最大余额法

前言: 在做数据统计报表的时候,有两种方式解决占比总和达不到100%或者超过100%问题。 第一种方式是前端echart图自带的算分框架。 第二种方式是java后端取处理这个问题。 现存问题: 前端不通过饼状图的方式去展示各个分类的占比累加和为100%问…...

MATLAB矩阵的操作(第一部分)

矩阵的基本知识 矩阵概念 矩阵(Matrix)在数学中是一个由复数或实数组成的矩形阵列,其元素按照行和列排列。矩阵的定义可以形式化地描述为: 一个 m 行 n 列的矩阵是一个有序的数表,其中包含 m*n 个数,可以…...

全面掌握Django的web框架Django Rest_Framework(一)

文章目录 Django Rest_Framework1. DRF介绍2.DRF特点3.环境安装与配置(1)DRF需要以下依赖(2)创建django项目 4.序列化器的使用(1)创建序列化器 5. 反序列化器使用 Django Rest_Framework 1. DRF介绍 Djan…...

AOP+Redisson 延时队列,实现缓存延时双删策略

一、缓存延时双删 关于缓存和数据库中的数据保持一致有很多种方案,但不管是单独在修改数据库之前,还是之后去删除缓存都会有一定的风险导致数据不一致。而延迟双删是一种相对简单并且收益比较高的实现最终一致性的方式,即在删除缓存之后&…...

Hive中left join 中的where 和 on的区别

目录 一、知识点 二、测试验证 三、引申 一、知识点 left join中关于where和on条件的知识点: 多表left join 是会生成一张临时表。on后面: 一般是对left join 的右表进行条件过滤,会返回左表中的所有行,而右表中没有匹配上的数…...

LaTeX教程(001)-LaTeX文档结构(01)

LaTeX教程(001)- LaTeX \LaTeX LATE​X文档结构(01) 说在前面 这是我本人学习《The LaTeX Companion》第三版的笔记,但并不是翻译。 书籍的第一章对 LaTeX \LaTeX LATE​X及其历史进行了相当长的介绍,这是几乎每一本关于 LaTeX \LaTeX LATE​X的书都会…...

SV-7041T 多媒体教学广播IP网络有源音箱

SV-7041T是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱,具有10/100M以太网接口,可将网络音源通过自带的功放和喇叭输出播放,可达到功率30W。同时它可以外接一个30W的无源副音箱,用在面积较大的场所。5寸进口全频低音喇…...

Linux文本三剑客awk经典案例

前言: AWK是一种专门用于文本处理的编程语言,它被广泛用于数据提取和报告生成,也是企业笔试面试常考的内容,以下34题是awk的用法案例,希望可以帮到你! 1.查看TCP连接状态 [rootnode1 ~]# netstat -nat | a…...

XCTF-web-easyupload

试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...