86 - 《分析 import 和 export 的 6 种方式》

发布于 2022年3月30日

做工具或框架时,我们偶尔会需要拿到一个文件的 import/require 或 export 信息,用于分析其依赖和导出。Umi 中有大量应用,比如 esmi 方案中会根据此信息做智能依赖的入口级 tree-shaking;MFSU 方案中会根据此信息生成整个项目的 Module Graph;插件体系中会根据此信息分析插件临时文件的导出并自动添加到 umi 入口,实现 import all from umi 的效果;等等。

用于分析的方案一直在迭代,主要用到的依赖有 crequire、babel、cjs-module-lexer、es-module-lexer、esbuild。没有银弹,不同方案的适用场景不同,选择最合适和最高性能的吧。

代码见:https://github.com/sorrycc/module-analyze-examples

1、

crequire 是 seajs 维护者 army8735 的作品,seajs 依赖于此,用于分析一个文件中的 require 使用情况,可用于 browser 和 node 环境。

const crequire = require('crequire');
console.log(crequire(content, true));

即可拿到文件中的 require 信息,以及他们的位置信息。第二个参数传入 true 还支持分析 require.async、require.ensure 的变种使用。

缺点是,1)cjs 逐渐没落,这个库没有持续维护,暂不支持 esm,2)不支持 export 信息的分析。

2、

babel 是万能的,啥都能分析,支持 cjs、esm、jsx、typescript,可以分析 imports 和 exports。

缺点是,1)依赖大,几十M,2)慢,3)不能在浏览器中独立运行。

3、

cjs-module-lexer 是 guybedford 维护的,他同时也是 es-module-lexer、jspm、es-module-shims 的作者。

cjs-module-le

内容预览已结束

此内容需要会员权限。请先登录以查看完整内容。