这个工具能找到什么
现代网站往往把成百上千个源文件打包成一个 JavaScript 文件。这个工具会深入这个文件,尝试还原原始的模块边界——不依赖特定打包工具,而是使用真实的 AST 结构而非文本匹配,后者一旦代码被压缩就完全失效。
它会按以下顺序尝试:
- webpack 的 function-map 形式——一个立即执行函数(IIFE),其参数是一个对象或数组,其中每一项都是
(module, exports, require)形式的函数。这也能识别经典的webpackUniversalModuleDefinition包装器,无论真正的模块映射调用嵌套多深。 - webpack 的 chunk-push 形式——
(self.webpackChunkXxx = self.webpackChunkXxx || []).push([ids, {modules}, runtime]),这是 webpack 5 代码分割产生的形式。 - Rollup / esbuild / Vite 的注释标记——这一系列工具的部分未压缩构建会在每个模块代码前保留一行
// 路径/到/文件.js注释。若存在,这些注释就成为模块边界。 - 诚实的兜底方案——如果以上都没找到(几乎总是因为打包产物是压缩且作用域被扁平化的 Rollup/esbuild/Vite 构建,没有留下任何边界标记),工具会明确说明,并列出文件的顶层声明,而不是虚构一份模块列表。
如何解读结果
找到模块时,每个模块都会列出它通过字面量模块 id require() 了什么,同样有用的是,哪些其他模块反过来依赖它——这样无需执行任何代码,就能双向追踪"如果删掉这个,会影响到什么"。
设计上的诚实
动态 require(require(变量))和 import() 调用无法静态解析,因此会直接从依赖列表中省略——这可能导致依赖被低估,但绝不会凭空捏造依赖关系。同样,某个 require() 调用引用的模块 id 若不在检测到的模块映射中,依旧会作为一条边的目标显示出来,即便它没有自己的卡片;这通常意味着它存在于另一个未粘贴进来的代码块中。
隐私
一切都通过真正的 JavaScript 解析器(acorn)在你的浏览器中运行。你粘贴或上传的打包文件永远不会被发送到任何地方。
Tiny Online Tools







