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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【目标检测】对DETR的简单理解

【目标检测】对DETR的简单理解 文章目录 【目标检测】对DETR的简单理解1. Abs2. Intro3. Method3.1 模型结构3.2 Loss 4. Exp5. Discussion5.1 二分匹配5.2 注意力机制5.3 方法存在的问题 6. Conclusion参考 1. Abs 两句话概括: 第一个真正意义上的端到端检测器最…

phpMyAdmin 未授权Getshell

前言 做渗透测试的时候偶然发现,phpmyadmin少见的打法,以下就用靶场进行演示了。 0x01漏洞发现 环境搭建使用metasploitable2,可在网上搜索下载,搭建很简单这里不多说了。 发现phpmyadmin,如果这个时候无法登陆,且也…

ubuntn挂载硬盘为只读问题

做为服务器操作系统,linux是很多站长经常用到的,那么在linux系统下如果需要新增加硬盘,该怎么增加呢?下面就来详细了解一下linux系统下添加新硬盘、分区及挂载硬盘的全过程。没有服务器的朋友可以点击了解一下阿里云1折优惠云服务…

【JS】Express.js环境配置与示例

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Express.js环境配置与示例。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不…

力扣hot100 二叉树的右视图 DFS BFS 层序遍历 递归

Problem: 199. 二叉树的右视图 文章目录 思路&#x1f496; BFS&#x1f496; DFS 思路 &#x1f469;‍&#x1f3eb; 甜姨 &#x1f496; BFS ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( n ) O(n) O(n) class Solution {public List<Integer&…

虹科技术|一文详解IO-Link Wireless技术如何影响工业无线自动化

导读&#xff1a;在工业无线自动化的飞速发展进程中&#xff0c;IO-Link Wireless技术成为了一项具有颠覆性的创新。它将IO-Link协议与无线连接完美结合&#xff0c;解决了传统通信技术在工业应用中的痛点。本文将深入解析IO-Link Wireless技术的原理、应用领域、优势以及实际案…

Docker基础(持续更新中)

# 第1步&#xff0c;去DockerHub查看nginx镜像仓库及相关信息# 第2步&#xff0c;拉取Nginx镜像 docker pull nginx# 第3步&#xff0c;查看镜像 docker images # 结果如下&#xff1a; REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 60…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之TextPicker组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之TextPicker组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、TextPicker组件 TextClock组件通过文本将当前系统时间显示在设备上。支持不…

【DDD】学习笔记-限界上下文与架构

作为领域驱动战略设计的重要元素&#xff0c;限界上下文对领域驱动架构有着直接的影响。在领域驱动的架构设计过程中&#xff0c;识别限界上下文与上下文映射都是一个重要的过程。限界上下文可以作为逻辑架构与物理架构的参考模型&#xff0c;而上下文映射则非常直观地体现了系…

故障诊断 | 一文解决,CNN-SVM卷积神经网络-支持向量机组合模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,CNN-SVM卷积神经网络-支持向量机组合模型的故障诊断(Matlab) 模型描述 卷积神经网络(Convolutional Neural Network,CNN)和支持向量机(Support Vector Machine,SVM)是两种常用的机器学习算法,它们在不同领域和任务中都表现出…

linux中vim的操作

(码字不易&#xff0c;关注一下吧w~~w) 命令模式&#xff1a; 当我们按下esc键时&#xff0c;我们会进入命令模式&#xff1b;当使用vi打开一个文件时也是进入命令模式。 光标移动&#xff1a; 1 保存退出&#xff1a;ZZ 2 代码格式化&#xff1a;ggG 3 光标移动&#xff…

公共用例库计划--个人版(六)典型Bug页面设计与开发

1、任务概述 本次计划的核心任务是开发一个&#xff0c;个人版的公共用例库&#xff0c;旨在将各系统和各类测试场景下的通用、基础以及关键功能的测试用例进行系统性地归纳整理&#xff0c;并以提高用例的复用率为目标&#xff0c;力求最大限度地减少重复劳动&#xff0c;提升…

【计算机网络】Socket的SO_REUSEADDR选项与TIME_WAIT

SO_REUSEADDR用于设置套接字的地址重用。当一个套接字关闭后&#xff0c;它的端口可能会在一段时间内处于TIME_WAIT状态&#xff0c;此时无法立即再次绑定相同的地址和端口。使用SO_REUSEADDR选项可以允许新的套接字立即绑定到相同的地址和端口&#xff0c;即使之前的套接字仍处…

Python代码重构库之rope使用详解

概要 Python是一门强大的编程语言,但在大型项目中,维护和重构代码可能会变得复杂和困难。为了提高开发人员的效率和准确性,有许多工具可用于辅助代码重构和智能代码补全。其中之一是Python Rope。 Python Rope是一个用于Python编程语言的强大工具,它提供了丰富的功能,包…

C++模板(下)

【C修炼秘籍】模板&#xff08;下&#xff09; &#x1f338;心有所向&#xff0c;日复一日&#xff0c;必有精进 &#x1f338;专栏《C修炼秘籍》 &#x1f338;作者&#xff1a;早凉 目录 【C修炼秘籍】模板&#xff08;下&#xff09; 文章目录 前言 一、非类型的模板参…

[C#][opencvsharp]opencvsharp sift和surf特征点匹配

SIFT特征和SURF特征比较 SIFT特征基本介绍 SIFT(Scale-Invariant Feature Transform)特征检测关键特征&#xff1a; 建立尺度空间&#xff0c;寻找极值关键点定位&#xff08;寻找关键点准确位置与删除弱边缘&#xff09;关键点方向指定关键点描述子 建立尺度空间&#xff0…

谈谈BlueFS

目录 前言数据结构标识一个文件文件系统的全局记录事务记录超级块 启动流程磁盘管理读写流程创建文件流程为文件写数据把数据下刷到磁盘读流程 参考资料 前言 BlueFS具体是个什么东西呢&#xff1f; 如上图&#xff0c;在Ceph里&#xff0c;使用BlueStore作为默认的存储引擎。…

python爬虫3

1.异常处理&#xff0c;使代码更加健壮 静态cookie可视绕过登录的限制 快代理是一个代理平台 # https://movie.douban.com/j/chart/top_list?type5&interval_id100%3A90&action& # start0&limit20# https://movie.douban.com/j/chart/top_list?type5&int…

Unity SRP 管线【第九讲:URP 点光源与聚光灯】

文章目录 CPU数据搜集GPU数据使用光照计算 CPU数据搜集 我们只能支持有限数量的其他灯。并将这些灯光数据&#xff08;位置、颜色、阴影强度、方向光光源、灯光遮蔽Probe、灯光层级Mask&#xff09;发送到GPU以供场景中所有物体渲染使用。 //ForwardLights.cs 额外光源数量与…

人工智能基础-Numpy的arg运算-Fancy Indexing-比较

索引 获取最小值最大值索引 np.argmin(x) np.argmax(x)排序和使用索引 np.sort(x)Fancy Indexing 索引 二维数组的应用 numpy.array 的比较 比较结果和Fancy Indexing