Webpack
    ESModule SideEffect
    在导入一整个文件时,TreeShaking是无法运作的,原因如下:
    image.png
    因为ESModule的标准无法避免副作用的产生,所以所有的导入导出不管有没有被使用都会被评估和执行。所以除非引入具体的单文件(部分babel插件会干类似的事),还有就是webpack提供的,标注自己库为 sideEffect:false。这样未被使用的内容就能被剔除了。

    在esModule下,sideEffect是如何产生的。
    https://stackoverflow.com/questions/49160752/what-does-webpack-4-expect-from-a-package-with-sideeffects-false?
    esModule旨在将所有的内容控制在模块内。

    index.js 虽然只导入了 c,但是它却应该也导入 b,a。因为这里的 c 是从外部 import 的,理应导出时只会受到模块内部内容的修改,但这里 c 受到了 import 进入的 a,b 的纠缠。
    所以如果模块内有 import 进来的内容,与模块import的其他内容互相影响(有时这类操作是无法静态解析的),再导出。那这就是有副作用的导出。
    所以只有确保自己的库中没有这类操作,才可以在 package.json 中标明 sideEffect: false,让webpack的TreeShaking不会出现问题。
    image.png