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

目录
相关文章
|
4月前
|
前端开发 JavaScript API
Tree Shaking在不同前端框架(如React、Vue)中的实现方式有何差异?
Tree Shaking在不同前端框架(如React、Vue)中的实现方式有何差异?
298 57
Threejs实现模拟管道液体流动
Threejs实现模拟管道液体流动
3310 0
Threejs实现模拟管道液体流动
|
4月前
|
缓存 前端开发 JavaScript
如何配置Vite以确保最佳的Tree Shaking效果?
如何配置Vite以确保最佳的Tree Shaking效果?
809 56
|
3月前
|
人工智能 运维 Go
Coze与Dify深度对比:AI应用开发最佳利器的选择指南
Coze与Dify两大开源AI平台各有特色:Dify采用Python一体化架构,适合快速开发部署,社区成熟;Coze基于Go微服务设计,扩展灵活但部署复杂。选择需结合团队技术栈,Python系选Dify追求效率,Go系选Coze注重定制。两者都能显著降低AI应用开发门槛。
|
前端开发 JavaScript
前端使用fingerprintjs2获取浏览器指纹
前端使用fingerprintjs2获取浏览器指纹
3165 0
|
前端开发 JavaScript
Webpack 中多个 Loader 的配置
【10月更文挑战第12天】使用多个 Loader 进行配置是 Webpack 中常见的操作,可以实现对各种资源的精细处理和优化。在配置时,需要根据具体需求合理选择和排列 Loader,并注意它们之间的顺序和交互关系。同时,不断了解和掌握新的 Loader 以及它们的特性,有助于更好地发挥 Webpack 的强大功能,提升项目的开发效率和质量。通过深入理解和熟练运用多个 Loader 的配置方法,你将能够更加灵活地处理各种资源,满足项目的多样化需求。
356 58
|
11月前
|
JavaScript 开发工具 git
工程化:Commitlint / 规范化Git提交消息格式
通过这些思维导图和分析说明表,您可以更加直观地理解Commitlint的安装、配置和使用方法,从而有效规范Git提交消息,提升团队协作效率和代码质量。
870 9
|
Web App开发 自然语言处理 前端开发
可访问性测试(无障碍测试)
可访问性测试(无障碍测试)
508 0
可访问性测试(无障碍测试)
|
安全 JavaScript
如何在`package.json`中正确设置依赖版本范围?
正确设置 `package.json` 中的依赖版本范围需要综合考虑项目的需求、依赖库的稳定性和兼容性,以及开发和维护的便利性等因素。通过合理选择版本范围符号,并结合定期的审查和测试,可以有效地管理项目依赖,确保项目的稳定运行。
418 1
|
安全 关系型数据库 Linux
什么叫网站国产化改造?哪些CMS符合国产化标准?
国产化需求在未来的互联网话题上是只会越来越多、越来越重要的,这个国产化改造不单单针对网站项目上,还会逐步涉及到各大软件和系统上,所以,相关的单位提前了解国产化的改造标准和需求,到传达的时候、不会显得出手无策。
750 5