项目的由来
最近项目中需要实现pdf和docx文件的预览功能,本来想着这应该是非常常见的需求,应该有很多现成的简单方案可用,搜索了一圈发现,虽然有很多方案,但是用起来有一些问题:
- 预览的效果参差不齐,有的预览效果很好,有的预览缺少对样式的支持
- 使用复杂,本来想着只要传一个文件地址就能预览,结果发现还要写很多细节代码
- 每种文件都有很多方案需要去选择,比如docx、pdf、excel等,每个文件都有大量的第三方库,需要去甄别测试
都2023年了,怎么文件预览还这么难!
发现了问题之后,就想着能不能实现一个简单的VUE组件库,能够解决以上问题,让新手前端,能够非常高效的完成文件预览任务。
于是,我期望开发一个vue-office组件库,它必须满足以下3个要求
- 使用一定要简单,对新手要友好,即传递一个文件地址,就可实现预览
- 提供多种文件的一站式预览解决方案,解决常见的docx、excel、pdf三种文件的预览
- 预览效果也好,不只是对内容预览,也要支持样式
要求明确了,实现就相对简单了,从github上筛选每个文档最优的预览方案,然后封装成VUE组件,但是坑还是非常多的,文章最后一部分介绍。
使用
安装
有三个组件,可以分别根据需要进行安装
//docx文档预览组件
npm install @vue-office/docx
//excel文档预览组件
npm install @vue-office/excel
//pdf文档预览组件
npm install @vue-office/pdf
复制代码
使用示例
docx文档的预览
<template>
<vue-office-docx :src="docx" @rendered="rendered"/>
</template>
<script>
//引入VueOfficeDocx组件
import VueOfficeDocx from '@vue-office/docx'
export default {
components:{
VueOfficeDocx
},
data(){
return {
docx: 'http://static.shanhuxueyuan.com/test6.docx' //设置文档地址
}
},
methods:{
rendered(){
console.log("渲染完成")
}
}
}
</script>
复制代码
excel文档预览
<template>
<vue-office-excel :src="excel" @rendered="rendered"/>
</template>
<script>
//引入VueOfficeExcel组件
import VueOfficeExcel from '@vue-office/excel'
//引入相关样式
import '@vue-office/excel/lib/index.css'
export default {
components:{
VueOfficeExcel
},
data(){
return {
excel: 'http://static.shanhuxueyuan.com/demo/excel.xlsx'//设置文档地址
}
},
methods:{
rendered(){
console.log("渲染完成")
}
}
}
</script>
复制代码
pdf文档预览
<template>
<vue-office-pdf :src="pdf" @rendered="rendered"/>
</template>
<script>
//引入VueOfficePdf组件
import VueOfficePdf from '@vue-office/pdf'
export default {
components:{
VueOfficePdf
},
data(){
return {
pdf: 'http://static.shanhuxueyuan.com/test.pdf' //设置文档地址
}
},
methods:{
rendered(){
console.log("渲染完成")
}
}
}
</script>
复制代码
存在的问题
最开始期望发布一个npm包,但是由于多种文件预览要引入很多第三方库,导致最后的npm包超过了2M,无法进行发包, 所以最后拆成了三个包,放到一个命名空间下 @vue-office,这种方式发包,需要在npm官网创建一个组织,创建组织是免费的,只要给个名称就行,也不需要资质审核。
拆包之后就又面临一个问题,如何进行多个包的管理呢,我们经常会看到很多源码里面都有个packages的目录,要发布的包都在packages下,然后通过lerna来管理多个包的build和publish。
最严重的问题就是预览的样式问题,目前大部分的方案都只支持对内容的预览,但是不支持样式的预览,比如可以预览excel文件中的内容,但是像背景色、颜色、字体大小等都不支持,目前我支持了部分样式,这块仍需后面继续完善。
如果你也感兴趣,欢迎一起贡献代码或者提供好的方案,期待大佬们给个赞支持一下~~
最大的感受就是,做一个可用的库,真不容易,要做好真难,需要大量的精力投入。