Rollup 是一个现代的 JavaScript 模块打包器,专门设计用于处理 ES6 模块(即 .mjs
和 .js
文件)和其他形式的模块(如 CommonJS 和 AMD)。它能够将多个小的模块合并为一个大的模块,同时保留模块内部的依赖关系,以便在浏览器或服务器环境中高效加载和运行。
Rollup 是一个现代的 JavaScript 模块打包器,专门设计用于处理 ES6 模块(即 .mjs
和 .js
文件)和其他形式的模块(如 CommonJS 和 AMD)。它能够将多个小的模块合并为一个大的模块,同时保留模块内部的依赖关系,以便在浏览器或服务器环境中高效加载和运行。
Rollup 的主要作用是将多个模块打包成一个单独的文件,方便在生产环境中部署。其优势包括:
- 模块化支持:Rollup 支持最新的 ES6 模块语法,这意味着你可以编写高度模块化的代码,同时 Rollup 能够理解并处理这些模块之间的依赖关系。
- 按需打包:你可以配置 Rollup 只打包项目中实际用到的代码,避免引入不必要的代码,减少打包后的文件体积。
- 代码优化:Rollup 可以对打包后的代码进行各种优化处理,例如去重、压缩和混淆,从而提高加载速度和减少代码体积。
- 支持多种输出格式:Rollup 可以将打包后的代码输出为各种格式,包括 ES5、CommonJS 和 UMD,方便在不同的运行环境中使用。
Rollup 插件系统允许你添加额外的功能和优化以增强打包过程。这些插件可以处理诸如代码转换(例如将 ES6+ 代码转换为 ES5)、代码分析、代码压缩、代码混淆等功能。
插件通常通过 npm 包的形式提供,你可以通过 npm install
命令安装所需的插件。
要在本地系统上安装 Node.js 和 npm,首先访问 Node.js 官方网站下载并安装最新版本的 Node.js。安装过程中,会自动安装 npm(Node Package Manager),这是用于管理和安装 Node.js 应用程序依赖的工具。
# 安装Node.js的版本管理器nvm(推荐)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash
source ~/.bashrc
nvm install --lts
或者直接下载 Node.js 的最新的 LTS 版本:
# 下载并安装Node.js
https://nodejs.org/en/download/
验证安装是否成功:
node -v
npm -v
输出版本号表示安装成功。
初始化项目和安装Rollup首先,使用 Node.js 创建一个新的项目目录并初始化 npm 项目:
mkdir my-rollup-project
cd my-rollup-project
npm init -y
接下来,安装 Rollup 并将其添加为项目的开发依赖:
npm install --save-dev rollup
配置Rollup的基本配置文件
创建一个 rollup.config.js
文件,这是 Rollup 的配置文件,用于定义打包任务的基本设置:
import { rollup } from 'rollup';
import commonjs from '@rollup/plugin-commonjs';
import resolve from '@rollup/plugin-node-resolve';
import { terser } from 'rollup-plugin-terser';
export default {
input: 'src/main.js', // 入口文件
output: {
file: 'dist/bundle.js', // 输出文件路径
format: 'iife', // 输出格式
sourcemap: true, // 是否生成源映射文件
},
plugins: [
resolve(), // 解析 Node 模块
commonjs(), // 将 CommonJS 模块转换为 ES6 模块
terser(), // 压缩代码
],
};
常用Rollup插件介绍
插件的作用和应用场景
Rollup 插件可以扩展其功能,以满足不同项目的需求。下面是一些常用的 Rollup 插件及其应用场景:
-
@rollup/plugin-node-resolve:
- 作用:允许使用
import
和require
语法导入 Node 模块。 - 应用场景:当你需要导入 Node 模块时,例如使用
import fs from 'fs'
。 - 安装:
npm install --save-dev @rollup/plugin-node-resolve
- 作用:允许使用
-
@rollup/plugin-commonjs:
- 作用:将 CommonJS 模块转换为 ES6 模块。
- 应用场景:当你需要打包 CommonJS 模块时。
- 安装:
npm install --save-dev @rollup/plugin-commonjs
- @rollup/plugin-terser:
- 作用:压缩和混淆代码,减少文件体积。
- 应用场景:在生产环境中,为了减少文件体积和加载时间。
- 安装:
npm install --save-dev rollup-plugin-terser
安装插件:
npm install --save-dev @rollup/plugin-node-resolve @rollup/plugin-commonjs rollup-plugin-terser
配置插件:
import resolve 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: 'iife',
sourcemap: true,
},
plugins: [
resolve(), // 解析 Node 模块
commonjs(), // 将 CommonJS 模块转换为 ES6 模块
terser(), // 压缩代码
],
};
示例代码和配置
示例代码
假设我们有一个简单的 JavaScript 文件 src/main.js
,它依赖于 Node 模块 fs
:
import fs from 'fs';
console.log(fs.readFileSync(__dirname + '/file.txt', 'utf8'));
其中 file.txt
文件的内容如下:
Hello, Rollup!
配置
import resolve 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: 'iife',
sourcemap: true,
},
plugins: [
resolve(), // 解析 Node 模块
commonjs(), // 将 CommonJS 模块转换为 ES6 模块
terser(), // 压缩代码
],
};
运行 Rollup:
npx rollup -c rollup.config.js
Rollup 插件实战:打包JavaScript模块
创建简单的模块
在项目中创建一个简单的模块。假设有以下两个文件:
src/module1.js
export function add(a, b) {
return a + b;
}
src/module2.js
import { add } from './module1.js';
export function multiply(a, b) {
return add(a, b) * 2;
}
使用Rollup打包模块
配置 rollup.config.js
文件来打包以上模块:
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import { terser } from 'rollup-plugin-terser';
export default {
input: 'src/module2.js',
output: {
file: 'dist/bundle.js',
format: 'iife',
sourcemap: true,
},
plugins: [
resolve(), // 解析 Node 模块
commonjs(), // 将 CommonJS 模块转换为 ES6 模块
terser(), // 压缩代码
],
};
运行 Rollup:
npx rollup -c rollup.config.js
生成的 dist/bundle.js
文件将包含打包后的代码。
去除未使用的代码
使用 @rollup/plugin-terser
插件压缩代码,并设置 sourcemap
选项为 true
生成源映射文件:
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import { terser } from 'rollup-plugin-terser';
export default {
input: 'src/module2.js',
output: {
file: 'dist/bundle.js',
format: 'iife',
sourcemap: true,
},
plugins: [
resolve(), // 解析 Node 模块
commonjs(), // 将 CommonJS 模块转换为 ES6 模块
terser({
compress: {
drop_console: true, // 去除 console.log
},
mangle: true, // 混淆变量名
}), // 压缩代码
],
};
优化输出格式
配置 external
选项来指定哪些模块应该被外部化(不打包在输出文件中):
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import { terser } from 'rollup-plugin-terser';
export default {
input: 'src/module2.js',
output: {
file: 'dist/bundle.js',
format: 'iife',
sourcemap: true,
external: ['fs', 'path'], // 指定外部化模块
},
plugins: [
resolve(), // 解析 Node 模块
commonjs(), // 将 CommonJS 模块转换为 ES6 模块
terser(), // 压缩代码
],
};
运行 Rollup:
npx rollup -c rollup.config.js
解决常见问题
常见错误及解决方法
缺少依赖模块
错误提示:Could not resolve '...' as an ES module
解决方法:确保你安装了所需的模块,并且在 rollup.config.js
中配置了 resolve
插件:
import resolve from '@rollup/plugin-node-resolve';
export default {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'iife',
sourcemap: true,
},
plugins: [
resolve(), // 解析 Node 模块
],
};
代码混淆错误
错误提示:SyntaxError: Unexpected token
解决方法:确保你配置了正确的插件。例如,使用正确的压缩插件配置:
import { terser } from 'rollup-plugin-terser';
export default {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'iife',
sourcemap: true,
},
plugins: [
terser({
compress: {
drop_console: true, // 去除 console.log
},
}), // 压缩代码
],
};
插件配置注意事项
- 外部化模块:使用
external
选项指定不需要打包的模块。 - 输出格式:根据目标环境选择合适的输出格式,例如
esm
、cjs
、iife
等。 - 插件顺序:插件的执行顺序可能会影响打包结果,确保插件顺序合理。
- 查看错误日志:Rollup 打包时会输出详细的错误日志,可以通过日志信息定位问题。
- 生成源映射文件:使用
sourcemap
配置生成源映射文件,方便调试原代码。 - 使用 Rollup 自带的命令:使用
rollup -w
开启实时打包,方便监控代码变化。
本文介绍了 Rollup 的基本概念、安装和配置方法、常用的 Rollup 插件及其配置,以及如何使用 Rollup 打包 JavaScript 模块。此外,还讨论了常见的错误和解决方法,以及调试技巧。
Rollup 插件的其他高级用法- 代码分割:使用
rollup-plugin-split
插件将代码分割成多个文件,以实现按需加载。 - 环境变量处理:使用
rollup-plugin-environment
插件处理环境变量。 - 动态导入:使用
rollup-plugin-dynamic-import-vars
插件处理动态导入。
- 官方文档:Rollup 官方文档详细介绍了 Rollup 的配置和插件使用方法。
- 慕课网:提供免费和付费课程,涵盖各种前端技术。
- GitHub:搜索 Rollup 相关的开源项目和插件。
- Stack Overflow:查找和提问有关 Rollup 的问题。