vite打包静态文件打开显示空白

news2025/1/10 20:29:39

vite 打包生成静态文件打开显示空白

需求场景

  1. 本地调试访问打包的文件看是否有啥问题,方便定位线上问题
  2. 安卓手机需要去直接访问静态文件,而不是访问域名的情况

vite 打包生成的文件如果直接放在服务器中是可以正常访问的,但是本地直接访问打包生成index.html文件就会提示以下问题。

  1. 访问的文件不存在,主要是因为路径配置问题。

  2. 提示跨域问题,不支持files协议,主要是因为esModule问题。

问题1:访问的文件不存在,主要是因为路径配置问题。

解决:在 vite.config.js文件中配置

export default defineConfig({
	...
   base: "./", 
    ...
  })

验证路径是否正常看浏览器中的network看文件是否加载正常

问题2. 提示跨域问题,不支持files协议,主要是因为esModule问题

对比webpack 打包静态文件是否可以正常访问

答案:正常
在vue.config.js 文件中配置

module.exports = {
  outputDir: 'dist',
  publicPath: baseUrl,

原理:开始通过file协议直接访问index.html,在index.html中静态引入index.js,在index.js中import test.js。在import的过程中需要http服务器去解析es6语法并添加header头信息去跨域引入test.js,但是file协议相当于通过资源管理器静态访问index.html,中间的过程没有http服务器参与解析,所以无法识别es6的import语法。

解决:将打包生成的文件改成为没有moudle的文件

step1:安装

$ npm install @vitejs/plugin-legacy

step2: 配置vite.config.js

import legacy from '@vitejs/plugin-legacy';
export default defineConfig({
....
  plugins: [legacy({
    targets: ['defaults', 'not IE 11']
  }),vue()],
   build:{
    target: ['es2015', 'chrome63'], // 默认是modules,百度说是更改这个会去输出兼容浏览器,尝试没啥作用,先配置吧
  }
 ....
})

step3:

在dist并列的文件夹中创建脚本文件 (用于替换module等关键词,省的每次得手动删除)toFile.cjs
创建 toFiles.cjs (为啥格式不是js为了执行命令不报兼容的错误)

import fs from 'fs';

console.time('转换耗时');
const distPath = './dist/index.html';//打包路径的index.html
let htmlText = fs.readFileSync(distPath, 'utf8');
let resultText = '';
let htmlArr = htmlText.match(/.*\n/g) || [];
htmlArr.forEach(str => {
    str = str.replace(/\s?nomodule\s?/g,' ');
    str = str.replace(/\s?crossorigin\s?/g,' ');
    str = str.replace(/data-src/g,'src');
    if(!/type="module"/i.test(str)) resultText += str;
});
fs.writeFileSync(distPath,resultText,'utf8');
console.timeEnd('转换耗时');

step5:

npm install fs // 安装fs
node toFile.cjs  // 执行脚本

step6: 查看 dist 文件夹中的 index.html 文件,查看是否没有module 、 crossorigin 等关键词,访问index.html 文件 查看效果
在这里插入图片描述

一般执行到这里基本是可以正常访问的,但是我的项目还是空白,后面观察加载的html结构发现router-view的组件没有加载上去,后面尝试将router.js 文件中history模式改成了hash,然后再重新打包执行上面的操作能够正常打开。

总结:

vite生成的文件会带有module,导致存在跨域问题,大多数项目开发都是将文件放在服务器中通过域名去访问,但是特殊情况需要直接访问静态资源。所以要去解决file存在跨域的问题。

反思:

  1. webpack为啥打包出的文件同样是file直接访问但是不存在跨域。
  2. webpack为啥打包出的文件不带module,但是file打包会带module。

借鉴其他的博文总结:

1、给引用文件设置type="module"等于给文件设置了私有作用域,xx.js文件成了单独的模块,运行在自己的私有作用域中,而不是全局作用域中。

2、虽然script标签自带跨域能力(这也是某些场合会通过jsonp结合script来请求资源的原因),但是这里的跨域是指的http协议(协议、域名、端口一致),file协议是不支持跨域的。

3、es6声明type=“module”,这类使用了模块的script是受限于同源策略的。

参考:

vue3.0 + vue-router4.0打包后页面空白
https://blog.csdn.net/here962464/article/details/114917147

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

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

相关文章

三个方面使CRM在360度客户视图中受益

360度客户视图这个词相信您不会陌生,很多关于CRM客户管理系统的文章中都有所提及。所谓的360度客户视图,是帮助企业和业务人员建立客户认知,消除客户生命周期中的信息脱节,让业务人员为客户提供一致性的体验。接下来我们们说&…

Windows10神州网信版的安装

在大约20天里面我完成了Windows10神州网信版72台的安装,有些2009~2014年的计算机完成安装后做一般的办公应用也能流畅运行。买一台新的计算机至少要好几千,通过更换固态硬盘和内存条可以达到旧物新用的目的。 一、安装过程   1、检查硬件  …

Coggle 30 Days of ML(23年1月)打卡

前言 任务链接 这个任务内容比较感兴趣而且和工作内容相关,学习一下打个卡。 编码完成任务1,2,3,5,6,目前手上只有2080,之后在3090上跑。 最近杂事多,笔记、任务4和7之后再补充。 …

vue前端框架课程笔记(五)

目录非文件组件使用步骤定义组件示例(第一部分):使用Vue.extend函数创建三个组件注册组件示例(第二部分):组件的全局和局部注册组件使用示例(第三部分):编写组件标签最终…

软件工程(三)——需求工程、需求开发、需求定义

目录 一、需求定义 二、需求验证 三、需求管理 1.定义需求基线 2.需求跟踪 3.变更控制 四、软件系统建模 一、需求定义 把已经分析好的需求,落成文档,把东西记录下来,成为《需求规格说明书》。需求定义的方法有严格定义法 以及 原型法…

Java三路快速排序

概念 三路快速排序: 是双路快速排序的进一步改进版本,三路排序算法把排序的数据分为三部分,分别为小于 v,等于 v,大于 v,v 为标定值,这样三部分的数据中,等于 v 的数据在下次递归中…

QSplitter学习笔记

QSplitter是分割窗口控件,并且可以拖动窗口来改变窗口的大小,是主界面显示时经常用到,本篇介绍它的交互操作。QSplitter可以容纳多个Widget,具有布局的特点,并且可以动态调整各个Widget的大小。QSplitter布局有两种方式…

前端学习第五站——CSS学习进阶篇

目录 一、选择器进阶 1. 后代选择器(空格) 2. 子代选择器 > 3. 并集选择器:, 4. 交集选择器:紧挨着 5. hover伪类选择器 6. emmet语法 7. 选择器总结 二、背景相关属性 1. 背景颜色 2. 背景图片 3. 背景…

若依框架对接LDAP

这里直接使用spring ldap实现认证。 背景在若依框架上对接LDAP 代码 引入依赖 <!-- 对接ldap --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-ldap</artifactId></dependency>…

React-Native 开发实用指南|环信学院

本文主要介绍 React-Native 的实际使用经验&#xff0c;对于想要快速入门的同学是有帮助的。 作者 | 佐玉 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 1、整体介绍 首先说&#xff0c; React-Native 用来做什么&#xff1f;传统的开发中&#xff0c;按照平…

编译原理学习笔记16——语义分析和中间代码生成1

编译原理学习笔记16——语义分析和中间代码生成116.1 中间语言16.2 常用的中间语言形式16.1 中间语言 中间语言的特点和作用 特点 独立于机器复杂性界于源语言和目标语言之间 引入中间语言的优点 使编译程序的结构在逻辑上更为简单明确便于进行与机器无关的代码优化工作易于移…

力扣刷题|110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

LeetCode 110.平衡二叉树 题目链接&#x1f517; LeetCode 110.平衡二叉树 思路 递归三部曲分析&#xff1a; 明确函数的形参和返回值 参数&#xff1a;当前传入结点 返回值&#xff1a;以当前传入结点为根节点的树的高度 那么如何标记左右子树是否差值大于1呢&#xff…

3、SpringJdbcTemplate声明式事务

JdbcTemplate基本使用 01-JdbcTemplate基本使用-概述(了解) JdbcTemplate是spring框架中提供的一个对象&#xff0c;是对原始繁琐的Jdbc API对象的简单封装。spring框架为我们提供了很多的操作模板类。例如&#xff1a;操作关系型数据的JdbcTemplate和HibernateTemplate&…

在Anaconda中安装pytorch的详细步骤+PyCharm环境配置

前言 深度学习小白一枚&#xff0c;自己的笔记本配置如下&#xff1a; 显卡&#xff1a;NVIDIA GeForce MX150&#xff08;非常垃圾的笔记本显卡&#xff09;固态硬盘 256GCPU&#xff1a;lntel Core™i7-8550UWindows&#xff1a;Windows 11家庭中文版 其他配置&#xff1a;…

代驾app开发开发搭建,代驾系统软件源码

在当下移动互联网发展的今天&#xff0c;大家对于生活的追求更加的趋向于其便捷性&#xff0c;这使得各种各样app被开发出来&#xff0c;出现在我们的生活之中。现在就把近期比较火的代驾app开发开发搭建的一些方案介绍一下。 代驾app产生的原因 代驾行业的快速发展&#xf…

<Java EE 进阶> Spring 创建和使用

目录 1.创建Spring项目 &#xff08;1&#xff09;创建一个Maven项目 &#xff08;2&#xff09;添加 Spring 框架支持&#xff08;spring-context、spring-beans&#xff09; &#xff08;3&#xff09;添加启动类 2.存储 Bean 对象 &#xff08;1&#xff09;创建 Bean …

计算几何知识(其一)

前提 最近闲着没事就看了计算几何的一些知识 构建凸包 Incremental Construction 复杂度为O(n2)原理就是不停蚕食下一个合适的点。判断原理是&#xff0c;第X个极点和前n个极点构成的多边形会有切点S&#xff0c;T。 和这两个点的连线&#xff0c;把原先多边形分成两个区域…

【软件测试】翻了下招聘APP只会点点点,很慌......测试业务?技术?

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 我猜想大伙的职业生…

从0到0.1学习 maven(二:坐标、依赖和仓库)

该文章为maven系列学习的第二篇 第一篇快速入口&#xff1a;从0到0.1学习 maven(一&#xff1a;概述及简单入门) 第二节&#xff1a;坐标、依赖与仓库坐标依赖依赖范围传递性依赖依赖调解可选依赖依赖排除归类依赖优化依赖仓库路径生成仓库分类本地仓库远程仓库快照部署至远程仓…

Day 16 Enable注解

Springboot中提供了很多Enable开头的注解&#xff0c;这些注解是冬天开启某些功能的&#xff0c;而其底层使用Import注解导入一些配置类&#xff0c;实现Bean的动态加载1 EnableAutoConfigurationTarget(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Documented Inhe…