浏览器中误用Node.JS模块导致编译结果体积膨胀

以 jsonwebtoken 库为例说明在前端随意使用 Node.js 的库可能带来的问题。

浏览器中误用Node.JS模块导致编译结果体积膨胀

软件版本的选择 一文中提到过一个原则:通过使用前后端通用的组件来减少组件的总体数量。由于 webpack 等工具的存在,许多原本设计给 Node.JS 使用的库,也能在未经修改的情况下给浏览器使用,乍看之下组件的通用度大幅提高了,但实际用下来,却发现存在着导致编译结果体积膨胀的问题。

因此在实际使用过程中,对库的选择还要进一步审视和辨别,正如该文中所说:

裁剪不能过度的牺牲功能、性能或用户体验。

首先,事情发生在某个项目中,之前一直没有太过关注编译结果的体积,毕竟第三方库该用就得用,随着库的累积,编译结果随之变大也是没有办法的事。但是今天却发现 vendor.js 的体积似乎有些离谱,已经到了 1.2M ,而项目中又没有使用什么体积特别大的库。

于是开启 webpack 的分析功能,得到如下结果:

Image

第一反应就是 bn.js 是什么东西,再一看感觉它的外层都是加密方法的名称,到底是哪个库用了这些东西呢?于是使用 npm list 来打印出项目的依赖树。内容过多,这里就不贴出来了,在输出的结果中,倒着找上去,发现不是我自己引入的某个库在使用这些加密方法,而是 webpack 用到了它们。于是推测是某种 polyfill 机制被触发了,但具体怎么触发的就没思路了。于是通过搜索引擎,尝试几个模糊的关键字组合来碰碰运气,最终定位到了 jsonwebtoken 这个库,和 相关的解释

总体而言,就是 jsonwebtoken 这个库在开发过程中没有考虑要在浏览器环境中使用,所以内部使用了 Node.JS 自带的 crypto 模块。由于浏览器中没有这个模块,webpack 只好把其在浏览器中的对等实现以 polyfill 的形式加到了输出的 vendor.js 中,于是就出了上图的结果。

一旦定位到原因,解决方式就很简单,用另一个库 jwt-decode 替换掉 jsonwebtoken 就可以了(当然,前提是前端不需要对 token 进行有效性验证,否则功能上将无法替代)。

Image

这就是事情的经过:将后端使用的库,在最少模块的思路下引入前端,却由于水土不服,最终不得不引入另一个库的来作为结束。同时为何时不该裁剪提供了一个良好的范例

更多

我的第一个MCP,以及开发过程中的经验感悟

起心动念 上周开发完 sheetex 后,发了条朋友圈。有小伙伴建议搞个 MCP 玩,正好我本来也想学,于是这周就花了一天完成了 sheetex-mcp-server,一个将对话中生成的表格保存成 Excel 的 MCP 服务。 做之前快速调查了一下 smithery 和 modelscope ,发现已经有好几个 Excel 相关的:实现上既有调用本机上的 Office 软件进行操作的,也有用库读写文件的;功能就更加眼花缭乱,从简单读写数据,到插入图表,甚至可以截图保存。 看来是打不过了,好在只是做个练习,开搞。 一天下来,学到不少东西,也填了好几个坑,本文以坑为主。 那么下面就按顺序来了。 新手上路 Build an MCP Server 是官方的教程,新手入门刚刚好,它通过调用天气相关的接口演示了 MCP Server 的开发过程。

By 熊立丁

12KB的Excel导出库sheetex是怎么来的

这是一个关于前端 Excel 导出库 sheetex 的故事:我为什么要做这个库,它为什么会这么小,以及你是否值得一试。 如过你问我“为什么非要在前端导出”,那将是另一个故事。 我的数据导出史 不知道你是否还记得自己是从什么时候开始接触数据导出的? 我对自己的“数据导出史”还算有些印象:在还没有正式工作的时候,如果有人问我要数据,我会在数据库管理工具里写个查询语句,然后视对方的用途,导出成SQL 语句、CSV 文件或者Excel 等;待到工作了,需要开发面向最终用户的系统,就不能再这么手工处理,导出功能成为系统标配,用户点击一个按钮,就要下载到相应的文件。 最早是 CSV 格式,因为其生成相对容易,而且也可以通过 Excel 软件进行查看,加上主要是内部用户,偶有无法打开也只要简单培训就能解决。 但随着用户类型变得广泛起来,这种“偶尔”也逐渐变成无法忍受,那么干脆直接导出 Excel 文件吧,反正开源库也已经成熟,于是使用 SheetJS

By 熊立丁
浙ICP备15043004号-1