vite功能之---npm 依赖解析和预构建

news/2025/1/17 8:10:11/

npm-dependency-resolving-and-pre-bundling">npm 依赖解析和预构建都做了什么

  1. 预构建 它们可以提高页面加载速度,并将 CommonJS / UMD 转换为 ESM 格式。预构建这一步由 esbuild 执行,这使得 Vite 的冷启动时间比任何基于 JavaScript 的打包器都要快得多。

  2. 重写导入为合法的 URL,例如 /node_modules/.vite/deps/my-dep.js?v=f3sf2ebd 以便浏览器能够正确导入它们。

依赖预构建

依赖预构建的原因

注意

依赖预构建仅适用于开发模式,并使用 esbuild 将依赖项转换为 ES 模块。在生产构建中,将使用 @rollup/plugin-commonjs

这就是 Vite 执行时所做的“依赖预构建”。这个过程有两个目的:

  1. CommonJS 和 UMD 兼容性: 在开发阶段中,Vite 的开发服务器将所有代码视为原生 ES 模块。因此,Vite 必须先将以 CommonJS 或 UMD 形式提供的依赖项转换为 ES 模块。

    在转换 CommonJS 依赖项时,Vite 会进行智能导入分析,这样即使模块的导出是动态分配的(例如 React),具名导入(named imports)也能正常工作:

    js
    // 符合预期
    import React, { useState } from 'react'
  2. 性能: 为了提高后续页面的加载性能,Vite 将那些具有许多内部模块的 ESM 依赖项转换为单个模块。

    有些包将它们的 ES 模块构建为许多单独的文件,彼此导入。例如,lodash-es 有超过 600 个内置模块!当我们执行 import { debounce } from 'lodash-es' 时,浏览器同时发出 600 多个 HTTP 请求!即使服务器能够轻松处理它们,但大量请求会导致浏览器端的网络拥塞,使页面加载变得明显缓慢。

    通过将 lodash-es 预构建成单个模块,现在我们只需要一个HTTP请求!

强制预构建

请使用 --force 命令行选项重新启动开发服务器

配置需要预构建或生产构建时强制转为es模块的配置
  • optimizeDeps.include:在开发环境下,强制 Vite 对指定依赖(如 linked-dep)进行预构建和优化,以提升开发时加载速度。
  • build.commonjsOptions.include:在生产构建时,确保 linked-dep 和 node_modules 中的所有 CommonJS 模块都会被转换为 ES Module 格式,保证构建后的兼容性和性能。
export default defineConfig({optimizeDeps: {include: ['linked-dep'],},build: {commonjsOptions: {include: [/linked-dep/, /node_modules/],},},
})
预构建缓存
文件系统缓存

Vite 将预构建的依赖项缓存到 node_modules/.vite 中。它会基于以下几个来源来决定是否需要重新运行预构建步骤:

  • 包管理器的锁文件内容,例如 package-lock.jsonyarn.lockpnpm-lock.yaml,或者 bun.lockb
  • 补丁文件夹的修改时间;
  • vite.config.js 中的相关字段;
  • NODE_ENV 的值。

只有在上述其中一项发生更改时,才需要重新运行预构建。

如果出于某些原因你想要强制 Vite 重新构建依赖项,你可以在启动开发服务器时指定 --force 选项,或手动删除 node_modules/.vite 缓存目录。

浏览器缓存

已预构建的依赖请求使用 HTTP 头 max-age=31536000, immutable 进行强缓存,以提高开发期间页面重新加载的性能。一旦被缓存,这些请求将永远不会再次访问开发服务器。如果安装了不同版本的依赖项(这反映在包管理器的 lockfile 中),则会通过附加版本查询自动失效。如果你想通过本地编辑来调试依赖项,您可以:

  1. 通过浏览器开发工具的 Network 选项卡暂时禁用缓存;
  2. 重启 Vite 开发服务器指定 --force 选项,来重新构建依赖项;
  3. 重新载入页面。

http://www.ppmy.cn/news/1563840.html

相关文章

【Apache Doris】周FAQ集锦:第 29 期

引言 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和开发者分享有关 Apache Doris 的常见问题。 通过这个每周 FAQ 栏目,希望帮助社…

HTML5 教程(上)

开始学习HTML5 HTML5 简介 HTML5是HTML最新的修订版本,2014年10月由万维网联盟(W3C)完成标准制定。 HTML5的设计目的是为了在移动设备上支持多媒体。 HTML5简单易学。 什么是 HTML5? HTML5 是下一代 HTML 标准。 HTML , HTML 4.01的上一…

references配置项详解

references 在 TypeScript 的 tsconfig.json 配置文件中,references 配置项用于设置项目间的依赖关系。它主要用于多项目的构建流程中,特别是在 Project References(项目引用)中,帮助 TypeScript 确定不同项目之间的依…

搭建 RUST 交叉编译环境

在嵌入式 Linux 上运行 RUST 在嵌入式 Linux 上运行 RUST构造交叉编译的 RUST 环境编译代码其他 参考文档 在嵌入式 Linux 上运行 RUST 最近在开发 zynq 相关的产品,想使用 rust 来开发应用程序;所以研究了一下如何在 pc 上进行 rust 的交叉编译。 本人…

DCU异构程序--矩阵乘

目录 一、概述 二、程序实现 三、编译运行 一、概述 HIP属于显式编程模型,需要在程序中明确写出并行控制语句,包括数据传输、核函数启动等。核函数是运行在DCU上的函数,在CPU端运行的部分称为主机端(主要是执行管理和启动&…

vscode——如何让标点总是成对出现

vscode——如何让标点总是成对出现: 打开vscode,在设置中输入editor.autoClosing 将设置参数全部改成always

Windows Subsystem for Linux (WSL) 中安装 Redis

在 Windows Subsystem for Linux (WSL) 中安装 Redis 是一个常见的开发环境设置过程。以下是详细步骤,适用于 Ubuntu 或其他基于 Debian 的 Linux 发行版。 ✅ 步骤 1:打开 WSL 终端 首先,确保你已经在 Windows 上启用了 WSL,并安…

uniapp小程序开发,配置开启小程序右上角三点的分享功能

直接全局配置一个分享的功能,要不然需要一个一个页面去单独配置就太麻烦了!!! 1.新建一个share.js文件,并配置代码,调用onShareMessage()和onShareTimeline()两个函数。 其中: title&#xff1…