坏蛋Dan
知乎@坏蛋Dan
发布时间:2025.8.18

前言

额,文章是先发到知乎上的,之前没同步过来。。所以时间对不上的问题请忽略。。

上半年有一个技术需求是把一个项目构建工具从webpack迁移至rspack

这算是当前比较推荐的提升构建速度的方案,基本上能做到无缝迁移

软的(优化构建速度的方案)不行,咱们直接来硬的(改变构建工具)。

当前整体提升速度在2-3倍左右(win11,32G,i7 13代的配置),不太符合预期,而且会因为当前内存多少而影响构建速度(影响幅度很大,快能到一分钟内,慢的直接去到3分钟)。。。

扯远了。我们来看下问题。


bug

项目简介

该项目是一个electron项目,在生产环境使用了字节码编译 + 源码空字符替代 + 文件加密 + electron asar pack的方式来加密,字节码编译的原理可以去看下这篇文章:基于 Node.js Addon 和 v8 字节码的 Electron 代码保护解决方案,但实际执行方案会因为项目而有些变化。

原因

因为用了字节码编译 + 源码空字符替代,所以就不能再依赖webpack/rspack自身的chunk加载方案,因此需要改写这块运行时代码,如何实现这里不多说,核心就是依赖文档没有提到的loadScriptRuntimeModulecompilation.hooks.runtimeRequirementInTree来做到改写webpack/rspack自身的loadScript方案为自己自定义的。

迁移过程中因为rspack在这块存在一些差异,具体是其中某些没有暴露出来,所以需要我这边手动去实现(实际上就是去rspack源码里看下咋写的,然后整理搬过来,从webpack里搬也行,但不确定是否存在差异)。

那这过程必然和原来的代码有差异,其中就有我们的主角

原来的:

改动后的:

其中xxx:

本地构建跑通了,好,咱们上流水线!

然后流水线出的包就报错了,大体报错如下:

这个js-md5是用来对输入加密的。然后我看了下其它动态引入的包也没啥问题,就唯独这货。。。

经过很长一大段时间的排查(断断续续的,偶尔空闲回来看一下,因为当时有替代方案,所以这里优先级就不太高),从字节码编译到rspack源码到js-md5 加密导致异常,来来回回分析,最终确定是rspack运行时这块有问题,但是新搞一个rspack demo却不能复现(因为简化了上面改写动态引入的方案所以无法复现。。)

但我又很确定是rspack这边运行时的问题,所以目标自然就怀疑到上面提到的那块代码里。

于是我把上面那块代码单独拎出来,结果观察到:

好像也没问题?但实际上有问题,转义符\没了,没了就意味着它会匹配的目标不是.js。。。。

好像还是没问题?然而构建过程中这个文件的名字早就变了

。。。我真气笑了,花了那么长的时间去排查,结果在这栽了跟头。。。。。。。。

我是知道这个点的模板字符串,但是我这里没看到!!!!并且当时我还去看过构建后的代码,也没发现!!!


总结

干活还是得眼神好。。。。眼瞎是真受罪