如何在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。

目录
相关文章
|
缓存 前端开发 JavaScript
一看就懂的gulp操作指南:让前端工作变得更加轻松(一)
一看就懂的gulp操作指南:让前端工作变得更加轻松
|
前端开发 JavaScript API
Tree Shaking在不同前端框架(如React、Vue)中的实现方式有何差异?
Tree Shaking在不同前端框架(如React、Vue)中的实现方式有何差异?
520 57
|
10月前
|
移动开发 前端开发 安全
如何使用Foldables.js库?
如何使用Foldables.js库?
588 122
|
监控 前端开发 JavaScript
不用WebSocket也能搞定实时消息推送?试一试SSE吧!
在现代 Web 开发中,实时数据更新至关重要,如股票行情、聊天消息等。SSE(Server-Sent Events)是一种基于 HTTP 的简单技术,可实现服务器向客户端推送实时通知。相比 WebSocket,SSE 单向通信、易于实现且具备自动重连机制。本文通过 Go 语言与 Gin 框架,演示了如何构建 SSE 实时时间推送功能。服务端代码设置必要响应头并使用定时器发送数据,客户端通过 `EventSource` 接收并展示消息。此外,还探讨了性能优化及扩展场景,如监控仪表盘和任务进度更新,帮助开发者在实际项目中应用这一高效技术。
1111 2
不用WebSocket也能搞定实时消息推送?试一试SSE吧!
|
缓存 前端开发 JavaScript
如何配置Vite以确保最佳的Tree Shaking效果?
如何配置Vite以确保最佳的Tree Shaking效果?
1522 57
|
8月前
|
缓存 Rust 前端开发
深入理解 Webpack 与 Vite 的构建差异与性能边界
本文深入对比 Webpack 与 Vite 的构建原理与性能差异。Webpack 采用“打包优先”策略,功能强大但启动慢;Vite 基于原生 ESM 实现“按需编译”,显著提升开发效率,冷启动和 HMR 速度远超 Webpack。生产环境下 Vite 凭借 esbuild 和 Rollup 生成更小体积、更快构建。二者在生态、配置、资源消耗等方面各有优劣,适用于不同场景。新项目推荐优先考虑 Vite,追求极致开发体验;大型复杂项目仍可选用 Webpack。理解其核心差异是优化构建流程的关键。
1245 1
|
机器学习/深度学习 JSON 监控
国内最大的MCP中文社区来了,4000多个服务等你体验
国内最大的MCP中文社区MCPServers来了!平台汇聚4000多个服务资源,涵盖娱乐、监控、云平台等多个领域,为开发者提供一站式技术支持。不仅有丰富的中文学习资料,还有详细的实战教程,如一键接入MCP天气服务等。MCPServers专注模块稳定性和实用性,经过99.99% SLA认证,是高效开发的理想选择。立即访问mcpservers.cn,开启你的开发之旅!
15236 16
|
存储 缓存 JavaScript
如何优化Node.js应用的内存使用以提高性能?
通过以上多种方法的综合运用,可以有效地优化 Node.js 应用的内存使用,提高性能,提升用户体验。同时,不断关注内存管理的最新技术和最佳实践,持续改进应用的性能表现。
854 62
|
Web App开发 SQL 前端开发
前端页面加载性能指标之LCP
本文介绍了 Largest Contentful Paint (LCP),一种衡量网页加载性能的指标,专注于视口内最大图片或文本块的完全渲染时间,旨在提升用户对主要内容加载速度的感知。文章还探讨了LCP的测量方法和优化策略,如图像优化、懒加载等,以帮助改善网页性能。
2312 5