sideEffects 字段是向构建工具声明副作用文件的白名单,数组形式列出需保留的 CSS、polyfill 等文件;纯工具库可设为 false 以启用激进 Tree Shaking;不配置则默认全保留,导致体积膨胀。

配置 sideEffects 字段,本质是向 Webpack 等构建工具提供一份“副作用白名单”,明确哪些文件**必须保留**,其余未被引用的代码才可安全删除。它不是开关,而是精准声明。
用数组列出真实有副作用的文件或通配模式
这是最常用、最稳妥的方式,适用于大多数项目:
-
"*.css" 和 "*.scss":匹配所有 CSS/Sass 文件(包括
src/下和node_modules/中的),确保样式不被误删 - "src/polyfills.js":保留全局垫片脚本,避免运行时缺失 API
-
"*.svg" 或 "fonts/*.woff2":如果字体、图标通过
import加载,也需列入 - 路径要准确:
"*.css"能命中src/a.css和node_modules/lib/style.css;但"src/**/*.css"不会匹配node_modules下的样式
纯工具库可设为 false
如果你开发的是只导出函数、不修改全局、不引入样式或资源的工具包(如 lodash-es),可直接写:
"sideEffects": false
将一个或多个视频上传至YouTube。当用户想“上传到YouTube”“发YouTube”“批量上传”“upload to YouTube”“post videos to YouTube”或发布到YouTube时使用此技能。
这表示整个包无任何副作用,构建工具将激进删除所有未使用的导出。但务必确认:
- 模块顶层没有执行
localStorage.setItem、document.write等隐式副作用 - 没有通过
import './index.css'这类方式加载资源——一旦设为false,这类导入也会被删掉
不声明 sideEffects 等于全部保留
如果不写这个字段,构建工具默认按 "sideEffects": true 处理,即认为每个文件都可能有副作用。结果就是 Tree Shaking 基本失效,打包体积难以下降。
尤其要注意第三方库:如果它自己的 package.json 没配 sideEffects,哪怕你只 import { debounce } from 'lodash-es',整个库代码也可能全被打进去。
避开常见坑点
这些细节常导致样式丢失、polyfill 失效、全局方法不可用:
- CSS 导入必须出现在模块顶层,不能包裹在函数或条件中(否则无法静态分析)
- 动态导入
import()和require()不受sideEffects控制,也无法被 Tree Shaking 分析,尽量不用在核心逻辑里 - 第三方库的副作用由它自己声明,你无法替它改;若遇到老库没配,可考虑替换,或用
resolve.alias引导到已优化版本

















