umijs / mako

An extremely fast, production-grade web bundler based on Rust.
https://makojs.dev
MIT License
1.86k stars 71 forks source link

[RFC] Export Presence check #1412

Open stormslowly opened 3 months ago

stormslowly commented 3 months ago

problem

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

premise

  1. 准备好所有子节点 ESM 的 exports 的符号
  2. tree-shaking 完之后, concatenate 之前执行 import/export 语句的 exportPresence 检查

steps

1 数据准备

更新 exportAll 信息到 TreeShakingModule

对于 import { foo } from 'ambiguous_module' 的情况,需要配置策略是否报错或者调整日志 foo 可能不来自于 ambiguous_module

2. 检查方法

import * as x情况,即 import specifiers from 'source' 只需要根据 source,找到对应的 tree-shaking-module,通过 specifier 确认导出存在性

export named from 'source'import 的处理类似

如果是 import * as x from 'mod' , 需要检查 x.yx['string_literal'] member expression 字段是否在 mod 中导出。

最后根据配置,决定有不存在的 export 是 warning or Error 的形式打印日志和是否 Result::Err 给框架, 终止编译。

需要配置是否只检查项目代码,而忽略 node_modules 下的内容。

3. 执行时机

暂不新增插件切面,在 concatenate 之前执行

afc163 commented 3 months ago

RFC 最好还是按 RFC 的文档格式来写,这样视角比较完整。

PeachScript commented 3 months ago

ref https://github.com/umijs/mako/issues/1303