Rollup 打包工具教程

96 阅读4分钟

Rollup 打包工具教程

Rollup 是一个高效的 JavaScript 模块打包工具,专注于 ES6 模块的优化编译,特别适合构建库或工具。它的主要特点是支持 Tree-shaking,可以移除未使用的代码,生成体积更小、加载更快的代码。

一、环境准备与安装

1. 环境要求

  • Node.js 环境(建议使用 LTS 版本)
  • npm 或 yarn 包管理工具
  • 基本的命令行操作知识

2. 安装方式

全局安装
npm install rollup --global
本地安装(推荐)
# 创建项目目录
mkdir rollup-demo && cd rollup-demo

# 初始化项目
npm init -y

# 安装为开发依赖
npm install rollup --save-dev

二、创建第一个 Rollup 项目

1. 项目结构

rollup-demo/
├── src/
│   ├── main.js        # 入口文件
│   └── utils/
│       └── math.js    # 工具模块
├── rollup.config.js   # 配置文件
└── package.json       # 项目配置

2. 创建源文件

src/utils/math.js

// 加法函数
export const add = (a, b) => a + b;

// 乘法函数
export const multiply = (a, b) => a * b;

src/main.js

import { add } from './utils/math.js';

export default function() {
  console.log('2 + 3 =', add(2, 3));
}

三、配置 Rollup

1. 基础配置文件

rollup.config.js

export default {
  // 入口文件
  input: 'src/main.js',
  // 输出配置
  output: {
    // 输出文件路径
    file: 'dist/bundle.js',
    // 输出格式 (cjs: CommonJS, esm: ES模块, iife: 立即执行函数)
    format: 'cjs'
  }
};

2. 配置 package.json 脚本

在 package.json 中添加构建脚本:

{
  "scripts": {
    "build": "rollup --config"
  }
}

四、基本使用命令

1. 使用命令行参数

# 直接打包,指定入口和输出格式
rollup src/main.js -o bundle.js -f cjs

# -i 或 --input: 指定入口文件
# -o 或 --output.file: 指定输出文件
# -f 或 --output.format: 指定输出格式 (amd, cjs, esm, iife, umd)

2. 使用配置文件

# 使用默认配置文件 (rollup.config.js)
rollup -c

# 使用指定配置文件
rollup --config rollup.prod.js

# 通过 npm 脚本运行
npm run build

五、多格式输出

可以配置 Rollup 同时输出多种格式:

export default {
  input: 'src/main.js',
  output: [
    {
      file: 'dist/bundle.cjs.js',
      format: 'cjs'
    },
    {
      file: 'dist/bundle.esm.js', 
      format: 'esm'
    },
    {
      file: 'dist/bundle.umd.js',
      format: 'umd',
      name: 'MyLibrary'  // UMD 格式需要指定全局变量名
    }
  ]
};

六、使用插件扩展功能

Rollup 的核心功能可以通过插件来扩展。以下是几个常用插件的使用方法:

1. 导入 JSON 文件

安装插件:

npm install --save-dev @rollup/plugin-json

配置插件:

import json from '@rollup/plugin-json';

export default {
  input: 'src/main.js',
  output: {
    file: 'dist/bundle.js',
    format: 'cjs'
  },
  plugins: [json()]
};

2. 使用 Babel 转译

安装插件:

npm install --save-dev @rollup/plugin-babel @babel/core @babel/preset-env

配置插件:

import babel from '@rollup/plugin-babel';

export default {
  input: 'src/main.js',
  output: {
    file: 'dist/bundle.js',
    format: 'cjs'
  },
  plugins: [
    babel({
      babelHelpers: 'bundled',
      presets: ['@babel/preset-env']
    })
  ]
};

3. 代码压缩

安装插件:

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

配置插件:

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

export default {
  input: 'src/main.js',
  output: {
    file: 'dist/bundle.min.js',
    format: 'cjs'
  },
  plugins: [terser()]
};

七、Tree-shaking 特性

Rollup 的一大优势是原生支持 Tree-shaking,可以自动移除未使用的代码。

例如,在之前的 math.js 中我们导出了 add 和 multiply 两个函数,但在 main.js 中只使用了 add 函数,那么 Rollup 打包时只会包含 add 函数的代码。

八、代码分割

Rollup 支持代码分割,将代码分割成多个文件,实现按需加载:

export default {
  input: {
    main: 'src/main.js',
    another: 'src/another.js'
  },
  output: {
    dir: 'dist',
    format: 'amd'  // 或 'esm',支持动态导入
  }
};

九、开发环境配置

使用开发服务器

安装插件:

npm install --save-dev rollup-plugin-serve rollup-plugin-livereload

配置插件:

import serve from 'rollup-plugin-serve';
import livereload from 'rollup-plugin-livereload';

export default {
  input: 'src/main.js',
  output: {
    file: 'dist/bundle.js',
    format: 'iife'
  },
  plugins: [
    serve('dist'),
    livereload('dist')
  ]
};

十、常见问题与最佳实践

1. 最佳实践

  • 使用 ES 模块语法编写代码
  • 为不同环境输出多种格式 (ESM、CommonJS、UMD)
  • 使用插件处理特殊需求
  • 利用 Tree-shaking 减小包体积

2. 适用场景

  • 构建 JavaScript 库或工具
  • 需要小体积输出文件的项目
  • 强调性能优化的项目

十一、完整配置示例

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

const production = !process.env.ROLLUP_WATCH;

export default {
  input: 'src/main.js',
  output: [
    {
      file: 'dist/bundle.cjs.js',
      format: 'cjs'
    },
    {
      file: 'dist/bundle.esm.js',
      format: 'esm'
    },
    {
      file: 'dist/bundle.umd.js',
      format: 'umd',
      name: 'MyLibrary',
      sourcemap: !production
    }
  ],
  plugins: [
    resolve(), // 解析 Node.js 模块
    commonjs(), // 转换 CommonJS 为 ES6
    json(),
    babel({
      babelHelpers: 'bundled',
      exclude: 'node_modules/**'
    }),
    production && terser() // 生产环境下压缩代码
  ].filter(Boolean)
};

通过这个教程,你应该能够快速上手 Rollup 并应用于实际项目中。Rollup 的简洁配置和优化能力使其成为构建 JavaScript 库的理想选择。