纯Dart包引入可选Flutter依赖:未调用相关方法时能否被摇树移除?
关于Flutter依赖摇树优化的问题解答
结论先行
只要使用者完全没调用wrapWithFlutter方法,且你的包没有其他地方引用Flutter SDK的代码,那Flutter相关依赖会被摇树优化彻底移除。
具体原理
Dart的摇树优化(不管是Dart2JS前端编译还是AOT原生编译)核心就是只保留被实际用到的代码和依赖:
- 你的
wrapWithFlutter是唯一牵出Flutter SDK(TextPainter)的代码分支,如果这个方法全程没被调用,那整个Flutter依赖的引用链就断了。编译器会识别出这部分是“死代码”和未使用依赖,直接从最终产物里删掉。 - 例外情况:如果你的包还有其他地方悄悄用了Flutter的API(比如全局初始化逻辑、某个隐藏的工具函数),那这部分依赖不会被清掉。但只要只有
wrapWithFlutter这一处依赖且没被调用,就不用担心。
额外小贴士
- 想要更清晰地分离纯Dart核心功能和Flutter辅助功能,建议把
wrapWithFlutter拆到单独的子包(比如your_hyphenation_package/flutter),让用户按需引入。这样主包可以保持纯Dart无Flutter依赖,需要换行功能的用户再单独加子包依赖,更灵活。 - 要是想验证结果,可以自己编译产物后检查:比如编译成JS或者AOT包,看看里面有没有
TextPainter这类Flutter专属类,就能确认摇树优化有没有生效。
内容的提问来源于stack exchange,提问作者Dabbel
相关产品推荐
相关产品推荐

