# external
类型: | (string | RegExp)[]| RegExp| string| (id: string, parentId: string, isResolved: boolean) => boolean |
---|---|
CLI: | -e/--external <external-id,another-external-id,...> |
该选项用于匹配需要排除在 bundle 外部的模块,它的值可以是一个接收模块 id 参数并返回 true (表示外部依赖)或 false (表示非外部依赖)的函数,也可以是一个模块 ID 数组或者正则表达式。除此之外,它还可以只是单个的模块 ID 或正则表达式。被匹配的模块 ID 应该满足以下条件之一:
- 外部依赖的名称,需要和引入语句中写法完全一致。例如,如果想标记 import "dependency.js" 为外部依赖,就需要使用 "dependency.js" 作为模块 ID;而如果要标记 import "dependency" 为外部依赖,则使用 "dependency"。
- 解析过的模块 ID(如文件的绝对路径)。
// rollup.config.js
import { fileURLToPath } from 'node:url';
export default {
//...,
external: [
'some-externally-required-library',
fileURLToPath(
new URL(
'src/some-local-file-that-should-not-be-bundled.js',
import.meta.url
)
),
/node_modules/
]
};
请注意,如果要通过 /node_modules/ 正则表达式过滤掉包的引入,例如 import {rollup} from 'rollup',需要先使用类似 @rollup/plugin-node-resolve 的插件,来将引入依赖解析到 node_modules。
当用作命令行参数时,该选项的值应该是一个以逗号分隔的模块 ID 列表:
rollup -i src/main.js ... -e foo,bar,baz
当该选项的值为函数时,它提供了三个参数 (id, parent, isResolved),可以为你提供更细粒度的控制:
- id 为相关模块 id
- parent 为进行引入的模块 id
- isResolved 表示 id 是否已被插件等解析
当创建 iife 或 umd 格式的 bundle 时,你需要通过 output.globals 选项提供全局变量名,以替换掉外部引入。
如果一个相对引入,即以 ./ 或 ../ 开头,被标记为 external,rollup 将在内部将该模块 ID 解析为绝对路径,以便引入的不同外部模块可以合并。当写入生成的 bundle 后,这些引入模块将再次被转换为相对引入。例如:
// 输入
// src/main.js (入口文件)
import x from '../external.js';
import './nested/nested.js';
console.log(x);
// src/nested/nested.js
// 如果引入依赖已存在,它将指向同一个文件
import x from '../../external.js';
console.log(x);
// 输出
// 不同的依赖将会合并
import x from '../external.js';
console.log(x);
console.log(x);
如果存在多个入口,rollup 会转换回相对引入的方式,就像 output.file 或 output.dir 与入口文件或所有入口文件位于相同目录。