前端构建变更:从 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 相关内容,未完待续。

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

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

相关文章

【SpringBoot】如何在 Utils 工具类中注入 Bean

一、背景 在 controller 层想使用一个静态工具,这个静态工具要使用其它组件。 我们经常要使用 Autowired 注解注入 Service 或者 Mapper 接口,在 service 层中注入其它的service 接口或者 mapper 接口都是可以的,但是如果我们要在我们自己封…

gdb 调试 - 在vscode图形化展示在远程的gdb debug过程

前言 本地机器的操作系统是windows,远程机器的操作系统是linux,开发在远程机器完成,本地只能通过ssh登录到远程。现在目的是要在本地进行图形化展示在远程的gdb debug过程。(注意这并不是gdb remote !!&am…

【论文阅读笔记】Time Series Contrastive Learning with Information-Aware Augmentations

Time Series Contrastive Learning with Information-Aware Augmentations 摘要 背景:在近年来,已经有许多对比学习方法被提出,并在实证上取得了显著的成功。 尽管对比学习在图像和语言领域非常有效和普遍,但在时间序列数据上的应…

题目 1107: 纪念品分组

题目描述: 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一…

Vue2中使用 el-dialog 对话框自行封装可拖动拖拽插件

文章目录 需求分析 需求 实现可拖拽的 el-dialog 分析 1.在utils文件创建dialogdrag.js文件,自定义指令 javascript复制代码//自定义指令:实现element-ui对话框dialog拖拽功能 import Vue from vue// v-dialogDrag: 弹窗拖拽 Vue.directive(dialogDr…

前端面试题-typeof 与instanceof区别(2024.2.1)

1、相同点以及概念 typeof 和 instanceof 都是 JavaScript 中用于检测值类型的运算符 2、typeof typeof 用于检测一个值的数据类型,返回的结果是一个字符串,表示被检测值的数据类型。常用的返回值有:"number", "string&quo…

实现vue3响应式系统核心-shallowReactive

简介 今天来实现一下 shallowReactive 这个 API。 reactive函数是一个深响应,当你取出的值为对象类型,需要再次调用 reactive进行响应式处理。很明显我们目前的代码是一个浅响应,即 只代理了对象的第一层,也就是 shallowReactiv…

36万的售价,蔚来理想卖得,小米卖不得?

文 | AUTO芯球 作者 | 雷歌 Are you OK?雷军被网友们叫“小雷”! 被网友一猜再猜的小米SU7的价格,因为一份保险上牌价格单的曝光被网友吵得热热闹闹,曝出的小米汽车顶配上牌保险价格为36.14万。 20万以下,人们愿称…

BeanUtil.copyProperties(source,target)拷贝List注意事项

一:抛出问题 import cn.hutool.core.bean.BeanUtil; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.ArrayList; import java.util.List; Data AllArgsConstructor NoArgsConstructor public class Us…

【python】OpenCV—Tracking(10.1)

学习来自《Learning OpenCV 3 Computer Vision with Python》Second Edition by Joe Minichino and Joseph Howse 文章目录 检测移动的目标涉及到的 opencv 库cv2.GaussianBlurcv2.absdiffcv2.thresholdcv2.dilatecv2.getStructuringElementcv2.findContourscv2.contourAreacv2…

对比上次MySQL的DDL

MySQL的DDL未必都是可以快速完成的,那么Oracle同等场景下如何? 这个是在Oracle19C下的实验,特别说明。因为在Oracle11G下有些结论是不成立的。 表thousand有大约4000万行记录 SQL> set timing on; SQL> desc thousand; Name T…

css多行文本擦拭效果

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>多行文本擦拭效果</title><style>* …

C++编程||日期类,日期相减,实现日期的下一天 两个日期 相减 日期 + 天数 得到的日期

日期类&#xff0c;日期相减&#xff0c;实现日期的下一天 两个日期 相减 日期 天数 得到的日期 具体要求&#xff1a;实现类date,其中 构造函数包括year,month,day三个参数 重载两个date类…

亚信安全助力宁夏首个人工智能数据中心建成 铺设绿色算力安全底座

近日&#xff0c;由宁夏西云算力科技有限公司倾力打造&#xff0c;亚信安全科技股份有限公司&#xff08;股票代码&#xff1a;688225&#xff09;全力支撑&#xff0c;总投资达数十亿元人民币的宁夏智算中心项目&#xff0c;其一期工程——宁夏首个采用全自然风冷技术的30KW机…

在做程序员的道路上,你学会什么,让你的技术突飞猛进

先动脑&#xff0c;再动手&#xff01; 先动脑子把流程梳理清楚&#xff0c;关键流程&#xff0c;问题点解决掉&#xff0c;再进行开发&#xff0c;比什么都重要&#xff01; 很多新手程序员拿着需求就是一顿噼里啪啦敲代码&#xff0c;最后发现设计垃圾、代码一堆 bug、返工…

复刻桌面小电视【包含代码分析】

宗旨&#xff1a;开源、分享、学习、进步&#xff0c;生命不息&#xff0c;折腾不止。 复刻小电视 感谢各位大佬的开源项目&#xff0c;让我有了学习的机会&#xff0c;如果侵权&#xff0c;请联系我删除。本人能力有限&#xff0c;如果有什么不对的地方&#xff0c;欢迎指正…

c/c++串的链式操作

文章目录 1.链式串的定义2.初始化3.赋值为04.赋值操作5.打印操作6.源码 本篇博客中都是带头结点的串。 1.链式串的定义 这里的数据域是4个字节&#xff0c;是为了节省空间。 typedef struct StringNode{char ch[4]; //按串长分配存储区&#xff0c;ch指向串的基地址struct S…

C++引用、内联函数、auto关键字介绍以及C++中无法使用NULL的原因

文章目录 一、引用1.1 引用概念1.2 引用特性1.3 常引用1.4 使用场景1.4.1 做参数1.4.2做返回值 1.5 引用和指针的区别1.6 小结一下 二、内联函数2.1 内联的概念2.2 内联的特性2.3 【面试题】 三、auto关键字(C11)3.1 类型别名思考3.2 auto简介 四、auto的使用细则4.1 基于范围的…

【2024年美国大学生数学建模竞赛】完整解析+模型代码+技术文档

美赛思路预定 01 美赛赛中时间分配美赛时间安排比赛前2~3天第一天&#xff08;2号&#xff09;第二天&#xff08;3号&#xff09;第三天&#xff08;4号&#xff09;第四天&#xff08;5号&#xff09;第五天&#xff08;6号&#xff09;8&#xff1a;00~10&#xff1a;00 02 …

固态硬盘颗粒,让我们了解下SLC、MLC、TLC

前文提要 近些年SSD的市场越来越好&#xff0c;大家的家用PC也逐渐都转向速度更快&#xff0c;玩游戏更流程的SSD,反而更加推动了SSD厂商的生产种类&#xff0c;但是其实大家还是挺关注SSD盘的使用寿命&#xff0c;处理数据速度&#xff0c;以及更重要的价格&#xff0c;面对市…