Open stormslowly opened 3 months ago
ref:https://github.com/umijs/mako/issues/1303
支持类似 Webpack 的 exportPresence 配置项,用于在引入不存在的 exports 时报错,内部场景需要用到这个配置让开发者显式感知 OneAPI services 的变化,可以暂时收敛到 experimental.exportPresence = 'warn' | 'error'。
ERROR in ./src/import-not-found.js 3:12-13 export 'a' (imported as 'a') was not found in './assets' (module has no exports) webpack 5.89.0 compiled with 1 error and 1 warning in 343 ms
exportPresence
更新 exportAll 信息到 TreeShakingModule
export * from 'mod'
export
ExportsCollector
fill_all_export_start_export_info
mod
AllExports::Ambiguous
对于 import { foo } from 'ambiguous_module' 的情况,需要配置策略是否报错或者调整日志 foo 可能不来自于 ambiguous_module。
import { foo } from 'ambiguous_module'
foo
ambiguous_module
非 import * as x情况,即 import specifiers from 'source' 只需要根据 source,找到对应的 tree-shaking-module,通过 specifier 确认导出存在性
import * as x
import specifiers from 'source'
source
specifier
export named from 'source' 和 import 的处理类似
export named from 'source'
import
如果是 import * as x from 'mod' , 需要检查 x.y 和 x['string_literal'] member expression 字段是否在 mod 中导出。
import * as x from 'mod'
x.y
x['string_literal']
最后根据配置,决定有不存在的 export 是 warning or Error 的形式打印日志和是否 Result::Err 给框架, 终止编译。
需要配置是否只检查项目代码,而忽略 node_modules 下的内容。
暂不新增插件切面,在 concatenate 之前执行
RFC 最好还是按 RFC 的文档格式来写,这样视角比较完整。
ref https://github.com/umijs/mako/issues/1303
problem
ref:https://github.com/umijs/mako/issues/1303
premise
exportPresence
检查steps
1 数据准备
更新 exportAll 信息到 TreeShakingModule
export * from 'mod'
的模块,只需要分析export
语句即可ExportsCollector
visitorexport * from 'mod'
的模块,需要递归的分析 mod 的导出fill_all_export_start_export_info
mod
是一个 cjs 的情况,那么模块的导出需要退化为AllExports::Ambiguous
2. 检查方法
非
import * as x
情况,即import specifiers from 'source'
只需要根据source
,找到对应的 tree-shaking-module,通过specifier
确认导出存在性export named from 'source'
和import
的处理类似如果是
import * as x from 'mod'
, 需要检查x.y
和x['string_literal']
member expression 字段是否在mod
中导出。最后根据配置,决定有不存在的 export 是 warning or Error 的形式打印日志和是否 Result::Err 给框架, 终止编译。
需要配置是否只检查项目代码,而忽略 node_modules 下的内容。
3. 执行时机
暂不新增插件切面,在 concatenate 之前执行