Rollup 基础使用 #

命令行使用 #

基本命令 #

bash
# 最简单的打包
rollup src/main.js

# 指定输出文件
rollup src/main.js -o dist/bundle.js

# 指定输出格式
rollup src/main.js -o dist/bundle.js -f iife

# 生成 sourcemap
rollup src/main.js -o dist/bundle.js -m

# 使用配置文件
rollup -c

常用命令行选项 #

选项 简写 描述 示例
--input -i 入口文件 rollup -i src/main.js
--file -o 输出文件 rollup -o dist/bundle.js
--format -f 输出格式 rollup -f es
--name -n UMD 名称 rollup -n MyLib
--sourcemap -m 生成 sourcemap rollup -m
--watch -w 监听模式 rollup -w
--config -c 配置文件 rollup -c
--external -e 外部依赖 rollup -e lodash
--globals -g 全局变量 rollup -g lodash:_
--plugin -p 使用插件 rollup -p node-resolve

输出格式选项 #

bash
# IIFE - 立即执行函数(浏览器)
rollup src/main.js -f iife -o dist/bundle.js

# ESM - ES 模块
rollup src/main.js -f es -o dist/bundle.mjs

# CJS - CommonJS(Node.js)
rollup src/main.js -f cjs -o dist/bundle.cjs

# UMD - 通用模块定义
rollup src/main.js -f umd -n MyLib -o dist/bundle.umd.js

# System - SystemJS
rollup src/main.js -f system -o dist/bundle.system.js

入口文件 #

单入口 #

javascript
// rollup.config.js
export default {
  input: 'src/main.js',
  output: {
    file: 'dist/bundle.js',
    format: 'es'
  }
};

多入口 #

javascript
// 方式一:数组形式
export default {
  input: ['src/main.js', 'src/admin.js'],
  output: {
    dir: 'dist',
    format: 'es'
  }
};

// 方式二:对象形式
export default {
  input: {
    main: 'src/main.js',
    admin: 'src/admin.js',
    utils: 'src/utils.js'
  },
  output: {
    dir: 'dist',
    format: 'es'
  }
};

入口文件结构 #

text
src/
├── main.js          # 主入口
├── admin.js         # 管理入口
├── utils/
│   ├── index.js
│   └── helpers.js
└── components/
    ├── index.js
    └── Button.js

输出配置 #

单文件输出 #

javascript
export default {
  input: 'src/main.js',
  output: {
    file: 'dist/bundle.js',
    format: 'iife',
    name: 'MyApp',
    sourcemap: true,
    banner: '// Copyright 2024',
    footer: '// End of bundle'
  }
};

多文件输出 #

javascript
export default {
  input: 'src/main.js',
  output: [
    {
      file: 'dist/bundle.cjs.js',
      format: 'cjs',
      sourcemap: true
    },
    {
      file: 'dist/bundle.esm.js',
      format: 'es',
      sourcemap: true
    },
    {
      file: 'dist/bundle.umd.js',
      format: 'umd',
      name: 'MyLib',
      sourcemap: true
    }
  ]
};

输出到目录 #

javascript
export default {
  input: ['src/main.js', 'src/admin.js'],
  output: {
    dir: 'dist',
    format: 'es',
    preserveModules: true,  // 保持模块结构
    preserveModulesRoot: 'src'
  }
};

输出选项详解 #

javascript
output: {
  file: 'dist/bundle.js',
  format: 'es',
  name: 'MyLib',
  sourcemap: true,
  sourcemapFile: 'dist/bundle.js.map',
  banner: '/* My Library v1.0.0 */',
  footer: '/* End of library */',
  intro: 'var ENV = "production";',
  outro: 'console.log("Library loaded");',
  compact: false,
  extend: false,
  exports: 'auto',
  globals: { lodash: '_' },
  assetFileNames: 'assets/[name]-[hash][extname]',
  chunkFileNames: 'chunks/[name]-[hash].js',
  entryFileNames: '[name].js'
}

外部依赖 #

基本用法 #

javascript
export default {
  input: 'src/main.js',
  external: ['lodash', 'axios', 'vue'],
  output: {
    file: 'dist/bundle.js',
    format: 'es'
  }
};

函数形式 #

javascript
export default {
  input: 'src/main.js',
  external: (id) => {
    return /lodash|axios|vue/.test(id);
  },
  output: {
    file: 'dist/bundle.js',
    format: 'es'
  }
};

排除 node_modules #

javascript
import { builtinModules } from 'module';

export default {
  input: 'src/main.js',
  external: [
    ...builtinModules,
    (id) => id.includes('node_modules')
  ],
  output: {
    file: 'dist/bundle.js',
    format: 'es'
  }
};

全局变量映射 #

javascript
export default {
  input: 'src/main.js',
  external: ['lodash', 'jquery'],
  output: {
    file: 'dist/bundle.js',
    format: 'iife',
    globals: {
      lodash: '_',
      jquery: '$'
    }
  }
};

全局变量配置 #

UMD 格式全局变量 #

javascript
export default {
  input: 'src/main.js',
  output: {
    file: 'dist/bundle.umd.js',
    format: 'umd',
    name: 'MyLibrary',
    globals: {
      lodash: '_',
      axios: 'axios'
    }
  },
  external: ['lodash', 'axios']
};

生成的代码 #

javascript
(function (global, factory) {
  typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('lodash')) :
  typeof define === 'function' && define.amd ? define(['lodash'], factory) :
  (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.MyLibrary = factory(global._));
})(this, (function (_) { 'use strict';
  // ...
}));

Source Map 配置 #

基本配置 #

javascript
export default {
  input: 'src/main.js',
  output: {
    file: 'dist/bundle.js',
    format: 'es',
    sourcemap: true  // 生成 .map 文件
  }
};

Source Map 选项 #

javascript
export default {
  input: 'src/main.js',
  output: {
    file: 'dist/bundle.js',
    format: 'es',
    sourcemap: 'inline',      // 内联 sourcemap
    sourcemap: 'hidden',      // 隐藏 sourcemap
    sourcemapBaseUrl: 'https://example.com/maps/',
    sourcemapFile: 'dist/bundle.js.map',
    sourcemapPathTransform: (relativePath) => {
      return `src/${relativePath}`;
    }
  }
};

Source Map 类型 #

描述
true 生成独立的 .map 文件
'inline' 内联到 JS 文件中
'hidden' 生成但不添加注释链接

Tree-shaking 实践 #

自动 Tree-shaking #

Rollup 默认启用 Tree-shaking:

javascript
// math.js
export function add(a, b) {
  return a + b;
}

export function subtract(a, b) {
  return a - b;
}

export function multiply(a, b) {
  return a * b;
}

// main.js
import { add } from './math.js';
console.log(add(1, 2));

// 打包后只有 add 函数

避免 Tree-shaking #

javascript
// 方式一:使用 /* @__PURE__ */ 注释
export const config = /* @__PURE__ */ createConfig();

// 方式二:保留副作用
// package.json
{
  "sideEffects": ["*.css", "*.global.js"]
}

// 方式三:配置 preserveModules
export default {
  output: {
    preserveModules: true
  }
};

副作用标记 #

json
// package.json
{
  "name": "my-library",
  "sideEffects": false
}
javascript
// 或指定有副作用的文件
{
  "sideEffects": [
    "*.css",
    "*.scss",
    "./src/polyfills.js"
  ]
}

模块解析 #

相对路径导入 #

javascript
// src/main.js
import { foo } from './utils.js';
import bar from './helpers/bar.js';

绝对路径导入 #

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

export default {
  input: 'src/main.js',
  plugins: [
    resolve({
      moduleDirectories: ['node_modules', 'src']
    })
  ]
};

别名配置 #

javascript
import alias from '@rollup/plugin-alias';

export default {
  input: 'src/main.js',
  plugins: [
    alias({
      entries: [
        { find: '@', replacement: 'src' },
        { find: '@utils', replacement: 'src/utils' },
        { find: '@components', replacement: 'src/components' }
      ]
    })
  ]
};

使用示例 #

javascript
// 原来的导入
import { foo } from '../../../utils/foo.js';
import Button from '../../../components/Button.js';

// 使用别名后
import { foo } from '@utils/foo.js';
import Button from '@components/Button.js';

CommonJS 模块处理 #

安装插件 #

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

配置使用 #

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

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

处理 CommonJS 模块 #

javascript
// 使用 CommonJS 模块
import lodash from 'lodash';
import express from 'express';

// 配置后可以正常打包

JSON 文件导入 #

安装插件 #

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

配置使用 #

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

export default {
  input: 'src/main.js',
  plugins: [json()]
};

使用示例 #

javascript
// src/main.js
import pkg from '../package.json';

console.log(pkg.name);
console.log(pkg.version);

实战示例 #

示例一:简单库打包 #

javascript
// rollup.config.js
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';

export default {
  input: 'src/index.js',
  output: [
    {
      file: 'dist/my-lib.cjs.js',
      format: 'cjs'
    },
    {
      file: 'dist/my-lib.esm.js',
      format: 'es'
    }
  ],
  external: ['lodash'],
  plugins: [
    resolve(),
    commonjs()
  ]
};

示例二:浏览器应用 #

javascript
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import terser from '@rollup/plugin-terser';

const isProduction = process.env.NODE_ENV === 'production';

export default {
  input: 'src/main.js',
  output: {
    file: 'dist/bundle.js',
    format: 'iife',
    name: 'App',
    sourcemap: true
  },
  plugins: [
    resolve({ browser: true }),
    commonjs(),
    isProduction && terser()
  ].filter(Boolean)
};

示例三:多页面应用 #

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

export default {
  input: {
    main: 'src/pages/main.js',
    admin: 'src/pages/admin.js',
    login: 'src/pages/login.js'
  },
  output: {
    dir: 'dist',
    format: 'iife',
    sourcemap: true
  },
  plugins: [
    resolve(),
    commonjs()
  ]
};

示例四:组件库打包 #

javascript
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import typescript from '@rollup/plugin-typescript';

export default {
  input: 'src/components/index.ts',
  output: [
    {
      dir: 'dist',
      format: 'es',
      preserveModules: true,
      preserveModulesRoot: 'src'
    }
  ],
  external: ['vue', 'vue-router'],
  plugins: [
    resolve(),
    commonjs(),
    typescript()
  ]
};

调试技巧 #

查看依赖关系 #

bash
# 显示模块依赖
rollup src/main.js --silent

输出模块信息 #

javascript
import { rollup } from 'rollup';

const bundle = await rollup({
  input: 'src/main.js'
});

// 输出模块信息
console.log(bundle.watchFiles);
console.log(bundle.cache.modules);

分析打包结果 #

javascript
import { rollup } from 'rollup';

const bundle = await rollup({
  input: 'src/main.js'
});

const { output } = await bundle.generate({
  format: 'es'
});

for (const chunk of output) {
  console.log('Chunk:', chunk.fileName);
  console.log('Size:', chunk.code.length);
  console.log('Imports:', chunk.imports);
  console.log('Exports:', chunk.exports);
}

常见问题 #

问题一:找不到模块 #

bash
Error: Could not resolve './utils' from 'src/main.js'

解决方案

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

export default {
  plugins: [resolve()]
};

问题二:CommonJS 模块报错 #

bash
Error: 'default' is not exported by node_modules/lodash/lodash.js

解决方案

javascript
import commonjs from '@rollup/plugin-commonjs';

export default {
  plugins: [commonjs()]
};

问题三:全局变量未定义 #

bash
ReferenceError: _ is not defined

解决方案

javascript
export default {
  external: ['lodash'],
  output: {
    globals: { lodash: '_' }
  }
};

下一步 #

现在你已经掌握了 Rollup 的基础使用方法,接下来学习 配置详解 深入了解各种配置选项!

最后更新:2026-03-28