「工具链🛠️」Rollup是什么?卷起来!🌮🌮(简单用例带你上手现代 JavaScript 打包工具)

298 阅读4分钟

Hi!这里是JustHappy🎸🎸,今天我们来聊聊 Rollupwebpack不同,这是一款专注于优化打包效率和代码体积的工具。你可能熟悉 Webpack 或 Vite,但 Rollup 也一直在前端打包工具中占据重要位置。虽然它的学习曲线比起 Webpack 稍微平滑一点,但它却很屌,尤其是在打包现代 JavaScript 模块时,Rollup 可以提供更加精简的输出。

在这篇文章中,我们将一起探索 Rollup 的基本概念、使用方法,以及一些核心特性,帮助你更好地理解这个工具,提升你的开发体验。

image.png

这里是Rollup文档链接

什么是 Rollup?🤔🤔

Rollup 是一个 JavaScript 模块打包工具,旨在通过优化打包过程,提高代码的执行效率。与 Webpack 等工具相比,Rollup 特别适合用于打包库、组件库以及单一用途的模块,特别是在支持 ES6 模块时,Rollup 可以做到更高效的 Tree Shaking 和更小的最终包体积。

Rollup 和 Webpack 有什么不同?🔍🔍

image.png

虽然 Webpack 在前端开发中占有主导地位,但 Rollup 也有它的独特优势:

  • 模块打包:Rollup 使用 ES6 模块系统来进行打包,而 Webpack 则更偏向 CommonJS。
  • Tree Shaking:Rollup 能更好地进行 Tree Shaking(去除无用代码),Rollup在JS生态中也是最早支持Tree Shaking的打包工具,因为它原生支持 ES 模块,能够智能分析并移除未使用的代码,从而减小最终输出的文件体积。
  • 更快的构建速度:对于打包库和小型项目,Rollup 比 Webpack 更快,因为它的设计简洁,处理模块的方式也更高效。

Rollup 的核心特性 💡💡

1. 小而精简的包体积

Rollup 的 Tree Shaking 非常优秀,能够移除死代码,使得最终打包出的文件体积更小。例如,如果你只使用了某个库中的部分功能,Rollup 会自动将未使用的部分剔除,从而减小最终的输出文件大小。

2. 支持多种插件

Rollup 拥有丰富的插件生态系统,可以支持各种类型的文件转换和优化。例如,rollup-plugin-babel 可以将你的 ES6+ 代码转换为 ES5,rollup-plugin-node-resolve 允许你解析第三方库中的模块等。

3. 高效的模块解析

Rollup 支持 ES6 模块,并且能在构建时高效地解析模块依赖关系。它会根据模块间的引用关系,自动优化和合并文件。

4. 持久化缓存

Rollup 在构建过程中会使用缓存机制来加速构建。如果你没有修改某个模块,Rollup 会跳过重新打包这个模块,从而提高构建效率。

rollup 提供了一个演示打包结果的在线演练场,大家可以去试试

image.png

使用 Rollup 构建项目 🚀

现在,我们来试一下如何用 Rollup 来构建一个最简单的 JavaScript 项目。

初始化一个 Rollup 项目

首先,我们需要创建一个新的项目,并安装 Rollup 和相关插件:

npm init -y
npm install --save-dev rollup

配置 Rollup

在项目根目录下,创建一个名为 rollup.config.js 的文件,配置 Rollup 打包选项:

// rollup.config.js
export default {
  input: 'src/index.js', // 入口文件
  output: {
    file: 'dist/bundle.js', // 输出文件
    format: 'iife', // 输出格式,iife 为立即执行函数
    name: 'MyBundle', // 打包后的全局变量名
  },
};

编写代码

在项目目录下创建 src/index.js,然后写入一些简单的 JavaScript 代码:

// src/index.js
import { greet } from './greet';

console.log(greet('World'));

再创建一个 src/greet.js 文件:

// src/greet.js
export function greet(name) {
  return `Hello, ${name}!`;
}

构建项目

接下来,我们可以运行 Rollup 来进行构建:

npx rollup -c

这会使用 rollup.config.js 配置文件,打包并输出到 dist/bundle.js 文件中。

打包后的结果

打包后的 dist/bundle.js 文件内容如下:

(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
  typeof define === 'function' && define.amd ? define(factory) :
  (global.MyBundle = factory());
}(this, (function () { 'use strict';

  function greet(name) {
    return `Hello, ${name}!`;
  }

  console.log(greet('World'));

  return greet;

})));

你可以看到,Rollup 将 src/index.jssrc/greet.js 进行了打包,并生成了一个立即执行函数 (IIFE) 格式的输出,适合直接在浏览器中使用。

Rollup 插件介绍 🔧🔧

Rollup 支持丰富的插件生态,下面介绍几个常用插件:

1. Babel 插件

如果你需要支持较老版本的浏览器,你可以使用 rollup-plugin-babel 插件将你的代码转换为 ES5:

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

然后在 rollup.config.js 中使用该插件:

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

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

2. Node 模块解析插件

如果你需要解析 node_modules 中的第三方库,可以使用 @rollup/plugin-node-resolve 插件:

npm install --save-dev @rollup/plugin-node-resolve

rollup.config.js 中添加:

import resolve from '@rollup/plugin-node-resolve';

export default {
  input: 'src/index.js',
  output: {
    file: 'dist/bundle.js',
    format: 'iife',
    name: 'MyBundle',
  },
  plugins: [resolve()],
};

3. 外部依赖插件

如果你的代码依赖于外部库(比如 React 或 Vue),并且你希望打包时不要将这些库包含在内,可以使用 external 配置来排除这些依赖。

export default {
  input: 'src/index.js',
  output: {
    file: 'dist/bundle.js',
    format: 'iife',
    name: 'MyBundle',
    globals: {
      react: 'React',
    },
  },
  external: ['react'],
};

总结 🎉🎉

Rollup 是一款轻量级、高效的 JavaScript 打包工具,非常适合用于打包库和组件。通过优化模块依赖关系、支持 Tree Shaking 和丰富的插件生态,Rollup 能帮助我们生成更小、更高效的代码。

如果你想进一步了解 Rollup,可以查看官方文档:Rollup 文档