在同一个应用里同时加载同一款开源库的两个不同版本,听起来像是工程上的妥协,但ArtboardLab的开发者最近详细记录了这样做的完整理由。这个免费浏览器端设计工具为了在PDF兼容的.ai文件上实现SVG导出,不得不同时运行pdf.js 6.2.108和3.11.174两个版本。
ArtboardLab是一款文件永不上传的浏览器设计工具,所有处理都在本地完成。其核心功能之一是处理PDF兼容的.ai文件——这类文件本质上是PDF容器,因此可以直接用pdf.js打开。在ArtboardLab中,画板缩略图、预览和PNG导出功能跑在pdf.js 6.2.108上,而同一页面上的SVG导出按钮则运行在通过npm别名加载的pdf.js 3.11.174上。
![]()
为什么必须保留旧版本
问题的关键在于SVG渲染后端。SVGGraphics组件只存在于旧版pdf.js中。对打包后的文件进行检索可以发现,6.2.108版本的构建产物中SVGGraphics出现次数为0,而3.11.174版本中出现了7次。v6版本没有提供等效的"将页面渲染为矢量标记"的API,这意味着要么自己编写PDF操作符到SVG的转换器,要么保留一个已经内置该功能的构建版本。
因此,在ArtboardLab的代码库中,svg-export.ts是唯一被允许导入pdfjs-legacy的模块,并且只能通过动态import()方式加载。其余所有功能——打开文件、缩略图、预览、PNG导出——都继续使用v6版本。
三个非可选构造参数
要让SVGGraphics为真实设计师的.ai文件输出可用的标记,需要设置三个示例代码中未提及的构造选项。这三个选项在某种意义上都是非可选的——移除任何一个都会导致特定类别的文件无法正常处理。
- isEvalSupported: false — 这个构建版本早于CVE-2024-4367的修复,该漏洞涉及字体程序到eval()的路径。SVG输出本身不依赖这个标志,设置它是因为输入的是陌生人的文件,字体程序绝不能进入eval()。值得注意的是,isEvalSupported在3.11.174的bundle中出现10次,在6.2.108中出现0次——当前版本已经没有这个标志可设置,而固定版本上存在这个标志,忘记设置它就是固定版本的全部风险。
- fontExtraProperties: true — 不设置这个选项,任何包含嵌入字体的文件都会在SVGGraphics的字体嵌入过程中抛出"No font data available"错误,翻译后的字体数据会在SVG写入前被丢弃。
- isOffscreenCanvasSupported: false — 该选项确保在旧版浏览器或不支持离屏Canvas的环境中,SVG导出仍能正常工作。
双版本共存的字节代价
在同一个应用中同时加载两个版本的同一库,最直接的代价是打包体积的增加。虽然开发者没有给出具体的字节数对比,但两个完整版本的pdf.js同时存在于最终bundle中,意味着用户需要下载的代码量显著上升。对于ArtboardLab这类强调本地处理、不上传文件的应用来说,这个代价换来了SVG导出功能的可用性。
开发者坦言,同时加载同一库的两个副本"不是任何人会轻松做出的决定",但考虑到v6版本完全没有SVG矢量输出的替代方案,保留旧版本成为了一种务实的选择。对于需要在浏览器中处理PDF矢量导出的开发者来说,这三个构造参数和双版本策略提供了一个可复用的参考方案。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.