当前位置: 首页 > news >正文

前端打包工具 - Rollup 打包工具笔记

Rollup 打包工具笔记

来源:《Webpack实战:入门、进阶与调优(第2版)》- 居玉皓


目录

  • 一、Rollup 简介
    • 1.1 与 Webpack 的对比
    • 1.2 适用场景
  • 二、基本使用
    • 2.1 安装
    • 2.2 配置文件
    • 2.3 项目文件
    • 2.4 打包命令
    • 2.5 打包结果
  • 三、Rollup vs Webpack 打包对比
    • 3.1 Webpack 打包配置
    • 3.2 Webpack 产出结果
    • 3.3 对比结论
  • 四、Tree Shaking(去除死代码)
    • 4.1 特性说明
    • 4.2 示例代码
    • 4.3 Rollup 打包结果
  • 五、输出格式(Output Format)
    • 5.1 支持的格式
    • 5.2 多格式输出
  • 六、应用场景
    • 6.1 实际应用
    • 6.2 设计理念
  • 七、补充知识
    • 7.1 常用配置选项
    • 7.2 常用插件
    • 7.3 命令行选项
    • 7.4 项目内安装(推荐)
    • 7.5 适用场景总结
  • 八、总结

一、Rollup 简介

1.1 与 Webpack 的对比

  • Webpack 的优势:更全面,基于"一切皆模块"的思想而衍生出丰富的可以满足各种使用场景的 loader 和 plugin
  • Rollup 的特点:更像一把手术刀,更专注于 JavaScript 的打包

1.2 适用场景

如果当前的项目需求仅仅是打包 JavaScript,比如一个 JavaScript 库,那么 Rollup 很多时候会是我们的第一选择。


二、基本使用

2.1 安装

与 Webpack 一般装在项目内部不同,Rollup 直接全局安装即可:

(sudo) npm i rollup -g

2.2 配置文件

创建 rollup.config.js 配置文件:

// rollup.config.js
module.exports = {input: 'src/app.js',output: {file: 'dist/bundle.js',format: 'cjs',},
};

2.3 项目文件

// src/app.js
console.log('My first rollup app.');

2.4 打包命令

rollup -c rollup.config.js

-c 参数是告诉 Rollup 使用该配置文件。

2.5 打包结果

'use strict';
console.log('My first rollup app.');

可以看到,打包出来的东西很干净,Rollup 并没有添加什么额外的代码(就连第1行的 'use strict' 都可以通过配置 output.strict 去掉)。


三、Rollup vs Webpack 打包对比

3.1 Webpack 打包配置

// webpack.config.js
module.exports = {entry: './src/app.js',output: {filename: 'bundle.js',},mode: 'production',
};

3.2 Webpack 产出结果

!(function(e) {var t = {};function r(n) {if (t[n]) return t[n].exports;var o = (t[n] = { i: n, l: !1, exports: {}, });return e[n].call(o.exports, o, o.exports, r), (o.l = !0), o.exports;}// 此处省略了50行Webpack代码
})([function(e, t) {console.log('My first rollup app.');}
]);

可以看到,即便项目本身仅仅有一行代码,Webpack 也需要将自身代码注入进去(大概50行左右)。

3.3 对比结论

显然 Rollup 的产出更符合我们的预期,它不包含无关代码,资源体积更小。


四、Tree Shaking(去除死代码)

4.1 特性说明

  • 在前面介绍 Webpack 时已经介绍过去除死代码(tree shaking),而实际上这个特性最开始是由 Rollup 实现的,之后被 Webpack 借鉴了过去
  • Rollup 去除死代码也是基于对 ES6 Module 的静态分析,找出没有被引用过的模块,将其从最后生成的 bundle 中排除

4.2 示例代码

// app.js
import { add } from './util';
console.log(`2 + 3 = ${add(2, 3)}`);// util.js
export function add(a, b) {return a + b;
}
export function sub(a, b) {return a - b;
}

4.3 Rollup 打包结果

'use strict';function add(a, b) {return a + b;
}console.log(`2 + 3 = ${add(2, 3)}`);

可以看到,util.js 中的 sub 函数没有被引用过,因此也没有出现在最终的 bundle.js 中。与之前一样,输出的内容非常清晰简洁,没有附加代码。


五、输出格式(Output Format)

5.1 支持的格式

Rollup 有一项 Webpack 不具备的特性,即通过配置 output.format,开发者可以选择输出资源的模块形式:

  • cjs(CommonJS):Node.js 环境常用
  • amd(AMD):RequireJS 等使用
  • esm(ES Module):现代浏览器和 Node.js 支持
  • iife(立即执行函数):浏览器全局变量
  • umd(Universal Module Definition):通用模块定义,同时支持多种环境
  • system:SystemJS 模块格式

5.2 多格式输出

这项特性对于打包 JavaScript 库特别有用,因为往往一个库需要支持多种不同的模块形式,而通过 Rollup,用几个命令就可以把一份源代码打包为多份。

示例配置:

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

六、应用场景

6.1 实际应用

实际应用中,Rollup 经常被用于打包一些库或框架(比如 React 和 Vue)。

6.2 设计理念

Rollup 在设计之初就主要偏向于 JavaScript 库的构建,以至于它没有 Webpack 对于应用开发那样强大的支持(各种 loader、plugin、HMR 等)。


七、补充知识

7.1 常用配置选项

// rollup.config.js
export default {// 入口文件input: 'src/index.js',// 输出配置output: {file: 'dist/bundle.js',format: 'cjs',name: 'MyLibrary', // 用于 UMD/IIFE 格式的全局变量名sourcemap: true,   // 生成 source mapstrict: false,     // 是否添加 'use strict'},// 外部依赖(不打包进 bundle)external: ['lodash', 'react'],// 插件plugins: [// 常用插件示例// resolve(),      // 解析 node_modules 中的模块// commonjs(),     // 将 CommonJS 转换为 ES6// babel(),        // 使用 Babel 转译// terser(),       // 代码压缩],
};

7.2 常用插件

  • @rollup/plugin-node-resolve:解析 node_modules 中的模块
  • @rollup/plugin-commonjs:将 CommonJS 模块转换为 ES6
  • @rollup/plugin-babel:使用 Babel 转译代码
  • @rollup/plugin-typescript:支持 TypeScript
  • rollup-plugin-terser:代码压缩
  • rollup-plugin-postcss:处理 CSS

7.3 命令行选项

# 使用配置文件
rollup -c rollup.config.js# 监听模式(开发时使用)
rollup -c rollup.config.js --watch# 指定环境变量
rollup -c rollup.config.js --environment NODE_ENV:production# 输出到标准输出
rollup -c rollup.config.js --stdout

7.4 项目内安装(推荐)

虽然可以全局安装,但在项目中本地安装更推荐:

# 安装为开发依赖
npm install --save-dev rollup# 在 package.json 中添加脚本
{"scripts": {"build": "rollup -c rollup.config.js"}
}

7.5 适用场景总结

适合使用 Rollup:

  • JavaScript 库/框架的打包
  • 需要生成多种模块格式
  • 追求更小的打包体积
  • 简单的 JavaScript 项目

不适合使用 Rollup:

  • 复杂的应用开发(缺少 HMR、丰富的 loader 等)
  • 需要处理大量非 JavaScript 资源
  • 需要复杂的代码分割策略

八、总结

Rollup 是一个专注于 JavaScript 打包的工具,特别适合用于构建库和框架。它的主要优势包括:

  1. 输出简洁:不包含额外的运行时代码,打包体积小
  2. Tree Shaking:原生支持,基于 ES6 Module 静态分析
  3. 多格式输出:支持多种模块格式,适合库的发布
  4. 专注性强:专注于 JavaScript 打包,设计简洁

但同时也需要注意,Rollup 在应用开发场景下的支持不如 Webpack 全面,选择时需要根据项目需求进行权衡。

http://www.dtcms.com/a/581138.html

相关文章:

  • 北大 UCLA 推出 ROCKET-2,AI 助力 3D 游戏零样本迁移
  • Linux 抓取 RAM Dump 完整指南
  • 用 Vue + DeepSeek 打造一个智能聊天网站(完整前后端项目开源)
  • 昌吉市建设局网站游戏工作室招聘信息
  • 基于MATLAB/Simulink的500kW三相光伏逆变器仿真
  • 大数据python招聘数据分析预测系统 招聘数据平台 +爬虫+可视化 +django框架+vue框架 大数据技术✅
  • 教育培训机构如何搭建自己的在线教育小程序?
  • Vue3+vant4+Webpack+yarn项目创建+vant4使用注意明细
  • 中山网站建设网站网站开发结构图
  • NumPy 简介与安装
  • AWS CloudFront 可观测最佳实践
  • 化学结构式乱码?InDraw与ChemDraw/Word/WPS兼容性完整指南
  • npm run 的工作原理和工作流程
  • 本地搭建Flinkcdc-mysql-kafka-flink-Doris实时数据集成
  • 极简风网站网站制作周期
  • 【Hadoop】hadoop3.3.1完全分布式配置
  • 如何安装 PDF Reader Pro for Mac v3.2.1.0?超简单DMG安装步骤(附安装包)
  • XML与CSS:构建现代网页的关键技术
  • 无锡品牌学会网站建设wordpress账号注册页面
  • 一次由 PageHelper 分页污染引发的 Bug 排查实录
  • 记录一个IDEA的神奇bug
  • Spark-3.5.7文档3 - Spark SQL、DataFrame 和 Dataset 指南
  • 无需 iTunes,将 iPhone 语音备忘录传输到电脑
  • 三个好思路:SQL并行化处理、混淆矩阵和特征交叉
  • 5 种无需 iTunes 将 iPad 照片传输到电脑的方法
  • 网站制作网站设计自助建站网站程序源码
  • Jenkins 定时触发(cron)使用说明
  • Kubernetes 架构
  • 自己做有趣的网站娱乐网站名字
  • 黑马JAVAWeb-09 文件上传-文件存储到服务器本地磁盘-文件存储在阿里云