174 - 《如何从文件里提取 exports 数据》

发布于 2022年8月24日

昨天(2022.8.23)在群里抛一个问题,感觉没人知道答案?我也是才刚在 umi 4 的 mpa 场景里用的这种方式。umi 3 的约定式路由组件属性分析里其实也有实现,但方式不同。

问题是这样,

一个文件,比如 foo.ts,他会通过 export 的方式声明一些信息,export const props = { foo: 1, bar: 2 },然后我们需要在 node 环境中通过编程的方式拿到这些属性,比如 foo.ts 的输出就是 { foo: 1, bar: 2 } 。

一些拍脑袋能想到的方案,

1、直接 require foo.ts
2、用 Babel 分析 foo.ts 的 ExportDeclaration
3、用 es-module-lexer 分析

方案 1 有几个问题,1)node 模块系统是不支持 .ts 的,需要额外通过 register 或者 loader 支持,2)foo.ts 所在的场景不是 node,而是 browser,这意味着除了 .ts、.tsx、.js,还会有 .css、.svg、.png 等其他类型文件的引用,这些 require 支持不了或者支持起来很 hack。

方案 2 是 umi 3 中使用的,相关代码在 https://github.com/umijs/umi/tree/3.x/packages/ast/src/getExportProps 。通过 Babel,用静态语法分析的方式,能做,但也有问题。问题是,1)复杂,2)场景支持不全,比如遇到 export const

内容预览已结束

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