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

这篇具有很好参考价值的文章主要介绍了vite打包静态文件打开显示空白。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

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

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

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

解决:在 vite.config.js文件中配置
主要:打包静态文件必须是根路径,否则放到服务器找不到静态资源(同理于webpack中的publicPath 的配置)

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.mjs
创建 toFiles.mjs (为啥格式不是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.mjs  // 执行脚本

step6: 查看 dist 文件夹中的 index.html 文件,查看是否没有module 、 crossorigin 等关键词,访问index.html 文件 查看效果
vite打包静态文件打开显示空白

一般执行到这里基本是可以正常访问的,但是我的项目还是空白,后面观察加载的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文章来源地址https://www.toymoban.com/news/detail-434586.html

到了这里,关于vite打包静态文件打开显示空白的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Vue3 vite build 之后不显示页面内容,只显示空白,也没有报错如何解决

    我的项目在 build 之后就插入到我的主网站的 /tools/image 路径下使用的,并非主网站,所以需要配置两个地方: 添加 base,意思是 build 之后的外部资源都从当前目录的相对路径获取。 比如 main.js 不是 /main.js 而是 ./main.js 我不知道是什么原理哈,反正是管用,之前在没有使用

    2024年02月13日
    浏览(62)
  • vue项目打包后显示空白解决方案?

    目录 前言 一、页面空白? 二、图片加载不出来? 总结 vue打包后会出现空白页面,这说明配置的时候路径有问题,接下来一起看看如何解决把。 页面空白说明打包路径有问题,打开config/index.js,找到build下的assetsPublicPath,修改为\\\'./\\\',如下: 这里说一下,dev环境下 assetsPu

    2024年02月16日
    浏览(44)
  • 解决Vue3+Vite3 打包部署到nginx后配置非根目录刷新页面报错空白

    报错内容 解决方法 router文件 vite.config.ts nginx.conf 配置中路径apps是我自建的存放前端页面的文件夹 起关键作用的是 try_files $uri $uri/ /demo/index.html ,当然上面项目文件夹demo也需保持一致 alias 后面的路径是Vue项目打包后dist静态文件服务器存放路径,一般在nginx下面建一个文件夹

    2024年02月11日
    浏览(53)
  • vue项目ios(苹果)系统打开显示空白页问题

      报错信息: 翻译:语法错误:无效的正则表达式:无效的组说明符名称。 注:我这里是正则验证报错(网上还有其他报错显示空白页的问题,以后遇到会及时和大家更新)。 原因( 本篇原因正则问题 ): 项目中如果有使用到正则表达式,在Safari浏览器会在某个正则规则下无法解

    2024年02月05日
    浏览(42)
  • electron项目打包之后显示空白页面以及发送http请求地址错误

            electron项目在开发阶段,因为使用webpack脚手架,启用了webServer提供的http服务,所以有路由功能,当我们运行npm run electron:serve的时候,最后可以直接加载http://localhost:8080。在app里面就可以显示页面。     当electron项目打包之后,成为桌面程序,这个时候就没有http服务支

    2024年02月13日
    浏览(36)
  • Postman无法正常启动,打开后一片空白,只显示顶部菜单栏

    后端程序开发完成后,想要使用postman调试接口,验证接口是否通。但是打开postman却一片空白,只有菜单栏,其他都是空白,如下图所示 设置环境变量即可。 在环境变量窗口下,选择系统变量新建,在新建系统变量的窗口中输入: 变量名:POSTMAN_DISABLE_GPU 变量值:true 点击确

    2024年02月11日
    浏览(58)
  • Python打开后黑屏问题解决方案——Pygame窗口显示空白黑屏

    问题描述: 在使用Pygame库创建游戏窗口时,有时候会遇到窗口打开后只显示空白黑屏的情况。这种问题通常是由于一些常见的错误导致的,例如窗口未更新、游戏循环未正确执行或者绘制内容缺失等。本文将介绍一些常见的解决方案,帮助你解决Python打开后黑屏的问题。 解

    2024年01月21日
    浏览(71)
  • 单独在文件中打开allure生成的index.html报告时却显示为loading

    【 问题描述 】:单独在文件中打开allure生成的index.html报告时显示为loading,如下图: 【 问题定位 】:其实在allure-report下index.html文件是不能直接打开的,出现页面都是loading的情况,这是因为直接allure报告用浏览器是打不开的,需要用allure命令渲染之后打开才能展示效果。

    2024年02月16日
    浏览(32)
  • Android项目在 app 中通过 WebView 访问 url显示空白,使用浏览器可以打开,Android WebView加载出现空白页面问题解决

    服务器证书校验主要针对 WebView 的安全问题。 在 app 中需要通过 WebView 访问 url,因为服务器采用的自签名证书,而不是 ca 认证,使用 WebView 加载 url 的时候会显示为空白,出现无法加载网页的情况。 使用 ca 认证的证书,在 WebView 则可以直接显示出来,不需要特殊处理。 以往

    2024年02月04日
    浏览(51)
  • vue3+elment复杂详情页面打开后,再打开其他页面都显示空白,控制台也没什么特殊报错

    页面使用了el-tabs 、 el-tab-pane、el-table 等标签 但是经测试不是这些问题导致的 js也使用了onMounted ,但是除掉也时空白页面 反正之前人写的页面可乱,尤其是js这块,穿插引用import一大堆 主题页面样式布局如下 最后看到页面代码太乱,就动了下页面布局代码,js也归类调整了

    2024年04月14日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包