如何在Rollup中配置Tree Shaking?

简介: 如何在Rollup中配置Tree Shaking?

在 Rollup 中配置 Tree Shaking 主要通过以下步骤实现:

1. 使用 ES6 模块语法

确保项目中使用 import/export 而非 CommonJS(require/module.exports)。Rollup 依赖静态结构分析来识别未使用的代码。

示例

// 正确:ES6 模块语法
export const add = (a, b) => a + b;
export const subtract = (a, b) => a - b;

// 错误:CommonJS 语法(会破坏 Tree Shaking)
module.exports = {
    add, subtract };

2. 配置 Rollup 插件

使用支持 Tree Shaking 的插件,如 @rollup/plugin-node-resolve@rollup/plugin-commonjs(处理 CommonJS 模块)。

示例配置(rollup.config.js

import {
    nodeResolve } from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import {
    terser } from 'rollup-plugin-terser';

export default {
   
  input: 'src/main.js',
  output: {
   
    file: 'dist/bundle.js',
    format: 'es', // 使用 ES 模块格式以保留 Tree Shaking 能力
  },
  plugins: [
    nodeResolve(), // 解析第三方模块
    commonjs(),    // 将 CommonJS 转换为 ES6
    terser(),      // 压缩代码,移除未使用的部分
  ],
};

3. 处理副作用(Side Effects)

package.json 中声明有副作用的文件,避免 Rollup 误删必要代码。

示例 package.json

{
   
  "sideEffects": ["*.css", "src/init.js"]
}

4. 排除外部依赖

使用 external 选项排除不需要打包的依赖,减少包体积。

示例

export default {
   
  input: 'src/main.js',
  output: {
   
    format: 'es',
  },
  external: ['react', 'lodash'], // 不打包这些依赖
};

5. 使用正确的输出格式

优先选择 format: 'es'(ES 模块)或 format: 'esm',避免使用 umdiife 格式(可能导致 Tree Shaking 失效)。

示例

export default {
   
  output: {
   
    format: 'es', // 推荐格式
  },
};

6. 压缩代码

使用 terser 等压缩工具移除未使用的代码。

安装依赖

npm install rollup-plugin-terser --save-dev

配置插件

import {
    terser } from 'rollup-plugin-terser';

export default {
   
  plugins: [
    terser({
   
      compress: {
   
        dead_code: true, // 移除未使用的代码
      },
    }),
  ],
};

7. 验证 Tree Shaking 效果

使用 source-map-explorer 分析打包结果,检查是否包含未使用的代码:

安装工具

npm install -g source-map-explorer

生成并分析报告

npx rollup -c --sourcemap
npx source-map-explorer dist/bundle.js

完整示例配置

// rollup.config.js
import {
    nodeResolve } from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import babel from '@rollup/plugin-babel';
import {
    terser } from 'rollup-plugin-terser';

export default {
   
  input: 'src/main.js',
  output: {
   
    file: 'dist/bundle.js',
    format: 'es',
    sourcemap: true,
  },
  external: ['react', 'react-dom'], // 外部依赖不打包
  plugins: [
    nodeResolve(), // 解析第三方模块
    commonjs(),    // 处理 CommonJS 模块
    babel({
           // 转换 ES6+ 语法
      babelHelpers: 'runtime',
      exclude: 'node_modules/**',
    }),
    terser({
          // 压缩并移除未使用代码
      compress: {
   
        dead_code: true,
      },
    }),
  ],
};

常见问题与解决方案

  1. CommonJS 模块无法 Tree Shaking

    • 解决方案:使用 @rollup/plugin-commonjs 转换为 ES6 模块。
  2. CSS/样式被误删

    • 解决方案:在 package.json 中声明样式文件有副作用:
      {
             
        "sideEffects": ["*.css"]
      }
      
  3. Tree Shaking 未生效

    • 检查是否使用了 format: 'es'format: 'esm'
    • 确保未使用动态导入(如 import('./module').then(...))。

通过以上配置,Rollup 可以有效识别并移除未使用的代码,实现 Tree Shaking。

目录
相关文章
|
10天前
|
前端开发 JavaScript API
Tree Shaking在不同前端框架(如React、Vue)中的实现方式有何差异?
Tree Shaking在不同前端框架(如React、Vue)中的实现方式有何差异?
111 57
|
10天前
|
缓存 前端开发 JavaScript
如何配置Vite以确保最佳的Tree Shaking效果?
如何配置Vite以确保最佳的Tree Shaking效果?
169 56
|
4天前
|
安全 调度
基于Reactor模型的高性能网络库之核心调度器:EventLoop组件
它负责:监听事件(如 I/O 可读写、定时器)、分发事件、执行回调、管理事件源 Channel 等。
102 57
|
1月前
|
编解码 UED 开发者
【HarmonyOS Next之旅】基于ArkTS开发(二) -> UI开发之常见布局
本文主要介绍了自适应布局与响应式布局的相关内容。自适应布局部分涵盖线性布局、层叠布局、弹性布局和网格布局,详细说明了各布局的特性及使用方法,例如线性布局中的排列、拉伸与缩放,弹性布局的方向、换行与对齐方式等。响应式布局则重点讲解了栅格系统和媒体查询,阐述如何通过栅格组件和媒体查询条件实现不同设备上的适配效果。这些技术帮助开发者灵活应对多尺寸屏幕的设计需求,提升用户体验。
144 55
|
SQL 存储 人工智能
Hologres新手如何基于ChatGPT优化Hologres慢SQL
Hologres新手如何基于ChatGPT优化Hologres慢SQL。
1962 56
Hologres新手如何基于ChatGPT优化Hologres慢SQL
|
消息中间件 Java Kafka
Apache Flink 漫谈系列(15) - DataStream Connectors之Kafka
聊什么 为了满足本系列读者的需求,在完成《Apache Flink 漫谈系列(14) - DataStream Connectors》之前,我先介绍一下Kafka在Apache Flink中的使用。所以本篇以一个简单的示例,向大家介绍在Apache Flink中如何使用Kafka。
9099 57
|
数据采集 测试技术 Python
【资料下载】Python 第十讲——xpath元素定位获取及爬虫中使用实例
直播时间:4月2日 20:00——21:00 直播介绍:python是非常适合敏捷开发的语言,用python编写爬虫快速获取数据,并做数据分析,对日常生活和工作能起到一定帮助。而python爬虫有很多种爬取方式,例如Requests+正则表达式、selenium+Chrome/PhantomJS等,xpath定位是其中的一种,以其使用简便、运行高效、应用场景多的优点,被很多爬虫开发者使用。
10229 58
|
存储 索引 Python
Python 技术百问
如何让用户保持登录状态https://yq.aliyun.com/ask/495120 如何迭代Pandas Dataframe中的行https://yq.aliyun.com/ask/495119 如何在Python中查找或删除列表中的子串列表https://yq.
10085 57
|
数据采集 机器学习/深度学习 新零售
【Python 学习进阶月刊】 第二期: Python 资料汇总
欢迎订阅Python学习进阶月刊 精彩直播: Python 系列直播——深入Python与日志服务,玩转大规模数据分析处理实战 IPython/Jupyter Notebook非常流行,但随着数据量越来越大(例如几百亿条电商平台访问日志),如何继续保持灵活的交互式分析,是一个挑战。
4582 57
|
Java Python
python ThreadPoolExecutor线程池使用
最近用上ThreadPoolExecutor, 用来代替celery的方式。 主要是用在celery上的时间太少, 没有吃透, 还有,我们的应用没有复杂到那地步, 多开几个服务器,也可以实现线程池的扩展。
7247 57