如何在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',避免使用 umd 或 iife 格式(可能导致 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。

目录
相关文章
|
监控 前端开发 JavaScript
不用WebSocket也能搞定实时消息推送?试一试SSE吧!
在现代 Web 开发中,实时数据更新至关重要,如股票行情、聊天消息等。SSE(Server-Sent Events)是一种基于 HTTP 的简单技术,可实现服务器向客户端推送实时通知。相比 WebSocket,SSE 单向通信、易于实现且具备自动重连机制。本文通过 Go 语言与 Gin 框架,演示了如何构建 SSE 实时时间推送功能。服务端代码设置必要响应头并使用定时器发送数据,客户端通过 `EventSource` 接收并展示消息。此外,还探讨了性能优化及扩展场景,如监控仪表盘和任务进度更新,帮助开发者在实际项目中应用这一高效技术。
1201 2
不用WebSocket也能搞定实时消息推送?试一试SSE吧!
|
移动开发 前端开发 安全
如何使用Foldables.js库?
如何使用Foldables.js库?
685 122
|
11月前
|
缓存 Rust 前端开发
深入理解 Webpack 与 Vite 的构建差异与性能边界
本文深入对比 Webpack 与 Vite 的构建原理与性能差异。Webpack 采用“打包优先”策略,功能强大但启动慢;Vite 基于原生 ESM 实现“按需编译”,显著提升开发效率,冷启动和 HMR 速度远超 Webpack。生产环境下 Vite 凭借 esbuild 和 Rollup 生成更小体积、更快构建。二者在生态、配置、资源消耗等方面各有优劣,适用于不同场景。新项目推荐优先考虑 Vite,追求极致开发体验;大型复杂项目仍可选用 Webpack。理解其核心差异是优化构建流程的关键。
1472 1
|
Java API 网络架构
深入理解并实践响应式编程(Reactive Programming)
深入理解并实践响应式编程(Reactive Programming)
1638 83
|
存储 缓存 JavaScript
如何优化Node.js应用的内存使用以提高性能?
通过以上多种方法的综合运用,可以有效地优化 Node.js 应用的内存使用,提高性能,提升用户体验。同时,不断关注内存管理的最新技术和最佳实践,持续改进应用的性能表现。
942 62
|
前端开发
CSS-实现文字描边效果
一、介绍 文字描边分为两种:内外双描边和单外描边,也就是指在给文字加上描边效果后,描边的方向是向内外同时占用文字空间还是只向外扩充文字空间的区别。
|
供应链 搜索推荐 数据可视化
我用低代码平台,简单搭建了一套管理系统
我用低代码平台,简单搭建了一套管理系统
890 0
|
JavaScript 开发工具 git
工程化:Commitlint / 规范化Git提交消息格式
通过这些思维导图和分析说明表,您可以更加直观地理解Commitlint的安装、配置和使用方法,从而有效规范Git提交消息,提升团队协作效率和代码质量。
1621 9
|
Ubuntu Linux 开发工具
linux离线安装docker与compose
linux离线安装docker与compose
1235 0

热门文章

最新文章