vben框架下载文件功能后台接口返回数据流的形式下载成功之后打不开xlsx文件解决

本文主要介绍了在Vue3.0框架下,如何配置axios的responseType为'blob'以接收后台返回的数据流,并通过数据流下载xlsx文件。当遇到下载后文件无法打开的问题时,解决方案是确保data参数为Blob类型,并使用提供的downloadByData方法进行下载。该方法接收Blob数据、文件名、MIME类型和BOM作为参数,创建并触发下载。

vue3.0前端开源框架vben请求接口配置返回内容数据类型


返回内容配置responseType的值共有一下几种:
(1) arraybuffer
(2) blob
(3) document
(4) json
(5) text
(6) stream

问题描述:下载文件功能后台接口返回数据流的形式下载成功之后打不开xlsx文件

解决方式:直接代码
	export const downNumbers = (params?: any) =>
 	 defHttp.post<any>(
    	{ url: Api.downNumbers, params, responseType: 'blob' },
    	{ errorMessageMode: 'none', isTransformResponse: false },
 	 );

注: 配置项 reponseType:’ 'blob '*为关键 必须配置,因为需要使用vben框架封装的数据流转文件方法,代码如下:

/**
 * Download according to the background interface file stream
 * @param {*} data
 * @param {*} filename
 * @param {*} mime
 * @param {*} bom
 */
export function downloadByData(data: BlobPart, filename: string, mime?: string, bom?: BlobPart) {
  const blobData = typeof bom !== 'undefined' ? [bom, data] : [data];
  const blob = new Blob(blobData, { type: mime || 'application/octet-stream' });

  const blobURL = window.URL.createObjectURL(blob);
  const tempLink = document.createElement('a');
  tempLink.style.display = 'none';
  tempLink.href = blobURL;
  tempLink.setAttribute('download', filename);
  if (typeof tempLink.download === 'undefined') {
    tempLink.setAttribute('target', '_blank');
  }
  document.body.appendChild(tempLink);
  tempLink.click();
  document.body.removeChild(tempLink);
  window.URL.revokeObjectURL(blobURL);
}

注:此方法接受data数据流参数必须是blob类型,亲测别的类型会出现下载成功之后文件打不开的现象

responseType类型相关链接

<think> 我们正在讨论的是Vben框架打包后生成的.pnpm文件过大的问题。首先,需要明确这个.pnpm文件是什么?根据上下文,用户提到的是在打包后生成的.pnpm文件。在pnpm的架构中,通常.pnpm目录是用来存储所有依赖的硬链接和符号链接的,它是一个虚拟存储目录。但是,在打包后的产物中,不应该包含.pnpm目录,因为pnpm的依赖管理是在开发环境中使用的。 然而,用户提到的是“打包后生成的.pnpm文件”,这里可能存在误解。通常,当我们使用Vite(Vben框架基于Vite)打包项目时,输出的是dist目录,里面是静态资源文件。而.pnpm目录是pnpm在安装依赖时生成的,位于项目根目录或者node_modules目录下,不应该出现在打包后的dist目录中。 但是,如果用户确实在打包后的dist目录中发现了.pnpm文件(或目录),那么可能是以下原因: 1. **构建工具配置问题**:可能构建配置中错误地将.pnpm目录复制到了输出目录。 2. **源代码中引用了.pnpm目录下的文件**:在代码中可能直接引用了位于.pnpm目录中的某些文件,导致这些文件被包含在构建产物中。 3. **静态资源处理**:可能将整个项目目录作为静态资源拷贝,包括了.pnpm目录。 因此,解决这个问题的关键在于避免将.pnpm目录包含在最终的构建产物中。以下是具体的解决步骤: ### 步骤1:检查构建配置(vite.config.ts/js) 在Vite的构建配置中,可以通过设置`build.rollupOptions`来排除不需要打包的文件或目录。具体来说,我们可以使用`external`属性来排除外部依赖,但这里更可能是静态资源拷贝的问题。另外,Vite默认不会将node_modules中的文件打包到dist中,除非有显式的引入或复制。 但是,如果使用了类似`vite-plugin-static-copy`这样的插件,并且配置了复制整个目录,那么可能会复制.pnpm目录。因此,检查是否有这样的插件及其配置。 ### 步骤2:检查是否在代码中引用了.pnpm目录中的文件 在项目中全局搜索`.pnpm`字符串,查看是否有显式引用.pnpm目录下文件的代码。例如: ```javascript import something from '../.pnpm/some-package@version/node_modules/some-package'; ``` 这样的引用是错误的,应该使用包名来引用,而不是路径。应该改为: ```javascript import something from 'some-package'; ``` ### 步骤3:在构建配置中排除.pnpm目录 如果确实需要排除.pnpm目录,可以在Vite的构建配置中,通过设置`build.rollupOptions.output.assetFileNames`等选项来控制资源的输出,但更直接的是确保在构建过程中不会复制.pnpm目录。 另外,Vite提供了`build.emptyOutDir`选项,在构建前会清空输出目录,但通常输出目录(如dist)中不应该有.pnpm目录。 ### 步骤4:检查静态目录public 如果在public目录中放置了.pnpm目录(显然不应该),那么它会被直接复制到dist目录。因此,检查public目录下是否有.pnpm文件或目录,如果有,删除它。 ### 步骤5:清理构建产物 尝试清理构建产物并重新构建: ```bash # 删除dist目录 rm -rf dist # 重新打包 pnpm build ``` 然后检查dist目录中是否还存在.pnpm目录。 ### 步骤6:调整pnpm的存储设置(不推荐) pnpm的存储目录默认在项目根目录下的.pnpm目录,但也可以通过配置改变其位置。不过,这并不能解决构建产物中包含.pnpm目录的问题,因为构建工具不应该将.pnpm目录打包进去。 ### 总结 根本原因是构建配置或代码引用导致.pnpm目录被包含在构建产物中。通过检查配置、代码和静态目录,排除.pnpm目录即可。 如果用户按照以上步骤检查后仍然存在问题,可以提供具体的项目结构或配置,以便进一步分析。 ### 相关问题 1. 如何配置Vite在打包时排除特定目录? 2. Vben框架打包后静态资源过大的优化方法有哪些? 3. 如何正确引用第三方包以避免将不必要的文件打包? 4. 在Vite中如何配置公共静态资源目录(public)? </think> 针对 Vben 框架打包后生成的 `.pnpm` 文件过大的问题,以下是系统性的解决方案: ### 一、问题根源分析 `.pnpm` 目录是 pnpm 的 **虚拟存储目录**,存放所有依赖的硬链接[^1][^4]。其体积过大的主要原因包括: 1. **依赖重复安装**:多版本依赖导致冗余(如 `lodash-es` 多个版本共存) 2. **未优化的依赖树**:深层嵌套依赖增加存储开销 3. **构建包含开发依赖**:开发工具(如 `vite-plugin-mock`)被打包进生产环境[^3][^4] 4. **未启用 pnpm 优化特性**:如自动依赖提升 --- ### 二、优化解决方案 #### 1. 依赖树优化(核心) ```bash # 分析依赖树并优化 pnpm dlx depcheck --json > dependency-report.json pnpm update --latest --recursive # 统一依赖版本 pnpm install --prod # 仅安装生产依赖 ``` #### 2. 构建配置优化(`vite.config.ts`) ```typescript // 添加依赖排除配置 export default defineConfig({ build: { rollupOptions: { external: [ 'mockjs', 'vite-plugin-mock', /@types\/.*/ // 排除所有TS类型声明 ], output: { manualChunks(id) { if (id.includes('node_modules')) { return 'vendor' } } } } } }) ``` #### 3. pnpm 专属优化 ```bash # 启用 pnpm 自动依赖提升 echo "public-hoist-pattern[]=*" >> .npmrc # 清理冗余文件 pnpm store prune # 清理无效依赖 rm -rf .pnpm/*.ts # 删除TS源码(生产环境不需要) ``` #### 4. 按需加载优化 ```typescript // 替换全局引入为动态加载 import { defineAsyncComponent } from 'vue' const HeavyComponent = defineAsyncComponent( () => import('@/components/HeavyChart.vue') ) ``` --- ### 三、验证优化效果 执行优化后打包命令: ```bash pnpm build --report # 生成分析报告 ``` 查看关键指标: 1. `.pnpm` 目录体积减少 **40%~70%**(典型优化效果) 2. `dist` 中不再包含 `@types` 等开发文件 3. 通过 `source-map-explorer` 查看依赖占比 > 📌 **注意事项**: > 1. 优化后需测试核心功能(如路由、状态管理)是否正常 > 2. 使用 `--ignore-scripts` 避免安装时执行非必要脚本 > `pnpm install --ignore-scripts`[^1] --- ### 四、进阶优化方案 | 方案 | 实现方式 | 预期效果 | |--------------------------|-----------------------------------|------------------| | **CDN 引入** | 配置 `external` + CDN 链接 | 减少 30%+ 体积 | | **Tree-shaking 强化** | 在 `package.json` 添加 `sideEffects:false` | 清除未用代码 | | **压缩PNPM存储** | `pnpm store compress` | 节省磁盘空间 | | **依赖分析可视化** | 使用 `rollup-plugin-visualizer` | 定位体积瓶颈 | > ⚠️ 禁用开发依赖时需检查 `vite-plugin-compression` 等生产必要工具是否保留[^3]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值