vite打包本地文件无法直接打开, file 类型 URL 引发跨域等问题探讨

解决使用Vite+React项目跨域问题及配置插件,
本文讲述了作者在使用Vite5.0+React构建静态页面时遇到跨域问题,通过安装并配置`vite-plugin-legacy`以及添加特定polyfills来解决此问题的过程。

之前接兼职用vite+vue的时候就出现过

这次用vite5+react给公司写了一个静态页面打包之后,

打开dist文件中的index.html是空白

F12查看后是跨域报错

解决方法如下:

npm install --save-dev @vitejs/plugin-legacy

import { defineConfig } from "vite";
import react from "@vitejs/plugin-react";
import legacy from "@vitejs/plugin-legacy";

// https://vitejs.dev/config/
export default defineConfig({
  base: "./",
  plugins: [
    react(),
    legacy({
      targets: ["ie>=11"],
      additionalLegacyPolyfills: ["regenerator-runtime/runtime"],
    }),
  ],
});

### 问题的根源:Webpack 与 Vite 的模块加载机制差异 Webpack 和 Vite 在构建过程中采用不同的模块加载机制,这直接导致了两者在直接打开 `index.html` 时是否触发限制的差异。 Webpack 在构建时会将所有依赖项打包一个或多个 bundle 文件,这些文件在运行时不再依赖外部模块解析机制。浏览器通过 `file://` 协议加载这些文件时,由于所有资源均已打包进最终输出文件,因此不会涉及请求。Webpack 的构建过程会将路径转换为相对于输出目录的相对路径,确保资源可以正确加载 [^1]。 Vite开发模式下使用原生 ES 模块进行按需加载,这意味着模块在浏览器中是通过 HTTP 服务器动态加载的。即使在生产环境中使用 Rollup 打包Vite 的默认配置仍然可能依赖于 HTTP 服务器来解析模块路径。如果直接通过 `file://` 协议打开 `index.html`,浏览器会将模块路径解析为本地文件路径,这会触发同源策略限制,因为 `file://` 没有明确的“源”概念,导致错误 [^2]。 ### Vite 打包后的模块加载问题 Vite开发服务器在运行时会将 `.vue` 文件转换为 ES 模块,并通过 HTTP 服务提供这些模块。这种机制在开发过程中显著提升了构建速度和热更新效率。然而,在生产环境中,Vite 使用 Rollup 进行打包时,默认配置可能不会完全兼容 `file://` 协议。Rollup 生成的模块路径可能仍然基于 HTTP 服务器的上下文,导致模块加载失败 [^3]。 例如,Vite 生成的代码中可能存在类似 `import App from '/src/App.vue'` 的语句。在 HTTP 服务器环境下,这种路径会被正确解析为服务器上的资源路径。但在 `file://` 协议下,该路径会被解析为本地文件系统的根路径,从而导致模块加载失败 [^2]。 ### 解决方案:调整 Vite 配置以支持 `file://` 协议 为了确保 Vite 打包后的文件可以通过 `file://` 协议直接运行,需要调整 Vite 的配置文件,确保所有资源路径使用相对路径。具体来说,可以在 `vite.config.js` 中设置 `base: './'`,以确保所有资源路径使用相对于当前 HTML 文件的路径: ```javascript import { defineConfig } from 'vite'; import vue from '@vitejs/plugin-vue'; export default defineConfig({ plugins: [vue()], base: './', }); ``` 通过这种方式,Vite 生成的模块路径将不再依赖 HTTP 服务器,而是使用相对路径,从而避免因路径解析错误而触发限制 [^1]。 此外,还需要确保 Rollup 在打包过程中不会生成依赖 HTTP 服务器的模块路径。可以在 Vite 的配置文件中进一步优化输出设置,例如指定 `build.rollupOptions.output.entryFileNames` 和 `assetFileNames`,以确保资源文件的路径符合本地文件系统的解析规则 [^3]。 ### 相关问题 1. 如何通过 Vite 配置文件优化生产环境的打包输出以支持 `file://` 协议? 2. Webpack 和 Vite 在处理 CSS 和图片资源上的差异是什么? 3. 为什么 Vite开发服务器比 Webpack 更快启动? 4. 如何通过 Rollup 优化 Vite 打包后的静态资源?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值