Cirry's Blog

Rollup配置和常用插件

Feb 18, 2025
技术 jsrollup
7分钟
1322字

配置

多入口打包

此场景适用于文件打包为多个类型供第三方引用,或者多入口多文件打包。

rollup.config.js
export default [
{
input: 'src/main.js',
output: {
file: 'dist/index.umd.js',
format: 'umd',
name: 'index'
},
},
{
input: 'src/main.js',
output: {
file: 'dist/index.es.js',
format: 'es',
},
2 collapsed lines
}
]

生成后的dist文件目录结构为如下:

dist
├── index.es.js
├── index.umd.js

启动本地服务功能

Terminal window
npm install rollup-plugin-serve --save-dev
rollup.config.dev.js
import serve from 'rollup-plugin-serve'
export default {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'iife',
name: 'bundleName',
},
plugins: [
serve({
open: true,
port: 3000,
contentBase: './dist'
}),
2 collapsed lines
]
};
package.json
{
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "rollup --config rollup.config.js",
"dev": "rollup --config rollup.config.js"
}
}

常用插件

babel打包

  • @babel/core babel核心包
  • @babel/preset-env 预设
  • @babel/plugin-babel rollup插件
npm install @babel/core @babel/preset-env @babel/pulgin-babel --save-dev
rollup.config.js
import { babel } from '@rollup/plugin-babel';
export default {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',//输出文件的路径和名称
format: 'es',
},
plugins: [babel()],
}
dist/bundle.js
'use strict';
var sum = function sum(a, b) {
return a + b;
};
var result = sum(1, 2);
console.log(result);

打包第三方库

在rollup中,从node_modules中引入的包是不会打包的,也就是说,我们在main.js中引入react或者lodash使用,打包之后的文件无法直接使用。

main.js
import _ from 'lodash'
export function sumA(a, b) {
return _.add(a, b)
}

打包生成结果如下:

bundle.js
import _ from 'lodash';
function sumA(a, b) {
return _.add(a, b)
}
export {sumA};

如果想要打包第三方库需要安装插件@rollup/plugin-node-resolve@rollup/plugin-commonjs

rollup.config.js
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()],
}

这样打包出来的结果就是符合我们可以预期使用的文件了。

bundle.js
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
function getDefaultExportFromCjs(x) {
return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
}
// ... 省略10000多行

如果有的第三方库,我们需要打包,有的第三方库,又不需要打包,可以添加参数external来配置。

rollup.config.js
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()],
external: ['lodash']
}

这样打包之后的文件,还是和之前一样:

bundle.js
import _ from 'lodash';
function sumA(a, b) {
return _.add(a, b)
}
export {sumA};

添加打包css功能

npm install postcss rollup-plugin-postcss --save-dev
src/main.js
import "./style.css"
let sum = (a, b) => a + b;
let result = sum(1, 2);
console.log(result);
src/style.css
body{
background: red;
}
rollup.config.js
import postcss from 'rollup-plugin-postcss'
export default {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'iife',
name: 'bundleName',
},
plugins: [
postcss()
]
};

terser代码压缩

Terminal window
npm install @rollup/plugin-terser --save-dev
rollup.config.js
import {terser} from 'rollup-plugin-terser'
export default {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',//输出文件的路径和名称
format: 'es',
plugins: [terser()],
},
plugins: [resolve(), commonjs()],
external: ['lodash']
}

打包之后生成的bundle.js文件如下:

bundle.js
import o from "lodash";
function r(r, t) {
return o.add(r, t)
}
export {r as sumA};

重命名alias

pnpm install @rollup/plugins-alias
rollup.config.js
import alias from "@rollup/plugin-alias";
import path from "path";
export default {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',//输出文件的路径和名称
format: 'es',
},
plugins: [alias({
entries: [
{find: 'utils', replacement: path.resolve(__dirname, 'src/utils')},
]
})],
}

全局替换插件

pnpm install @rollup/plugin-replace
main.js
console.log(__TEST__)
document.getElementById('app').innerHTML = __TEST__;
main.js
import replace from '@rollup/plugin-replace'
export default {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',//输出文件的路径和名称
format: 'es',
},
plugins: [
replace(
{
preventAssignment: true,
__TEST__: "123456",
}
)
2 collapsed lines
],
}

打包之后的文件输出结果:

bundle.js
console.log(123456);
document.getElementById('app').innerHTML = 123456;

eslint插件

pnpm install @rollup/plugin-eslint eslint

添加.eslintrc.js配置:

.eslintrc.js
// .eslintrc.js 示例,非正规项目使用
module.exports = {
"env": {
"browser": true,
"es2021": true
},
"extends": "eslint:recommended",
"parserOptions": {
"ecmaVersion": "latest",
"sourceType": "module"
},
}
rollup.config.js
import eslint from "@rollup/plugin-eslint";
export default {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',//输出文件的路径和名称
format: 'es',
},
plugins: [
eslint({
throwOnError: true, // 设置eslint检查有错误的情况下会编译失败
}),
],
}

image插件

@rollup/plugin-image 插件可以将图片导入为 Base64 编码的字符串。

如果不想将图片处理为base64,而是作为文件额外的文件引入,可以使用@rollup/plugin-url,或者将图片复制到输出目录,可以使用rollup-plugin-copy

pnpm i @rollup/plugin-image
main.js
import img from "./images/avatar.png"
console.log(img)
rollup.config.js
import image from "@rollup/plugin-image";
export default {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',//输出文件的路径和名称
format: 'es',
},
plugins: [
image()
],
}

strip插件

移除多余的console

pnpm i @rollup/plugin-strip
rollup.config.js
import image from "@rollup/plugin-image";
export default {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',//输出文件的路径和名称
format: 'es',
},
plugins: [
image()
],
}

添加typescript

npm install tslib typescript @rollup/plugin-typescript --save-dev
src/main.ts
const myName: string = "cirry";
const age: number = 18;
console.log(age)
rollup.config.js
import typescript from '@rollup/plugin-typescript';
export default {
input: 'src/index.ts',
output: {
dir: 'output',
format: 'cjs'
},
plugins: [typescript()]
};
dist/bundle.js
(function () {
'use strict';
var age = 18;
console.log(age);
})();

生成ts配置文件:tsc --init

tsconfig.json
{
"compilerOptions": {
"target": "es5",
"module": "ESNext",
"strict": true,
"skipLibCheck": true,
"forceConsistentCasingInFileNames": true
}
}

打包cdn引入的包

src/main.js
import _ from 'lodash';
import $ from 'jquery';
console.log(_.concat([1,2,3],4,5));
console.log($);
export default 'main';
dist/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>rollup</title>
</head>
<body>
<script src="https://cdn.jsdelivr.net/npm/lodash/lodash.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery/jquery.min.js"></script>
<script src="bundle.js"></script>
</body>
</html>
rollup.config.js
import babel from 'rollup-plugin-babel';
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
export default {
input:'src/main.js',
output:{
file:'dist/bundle.cjs.js',//输出文件的路径和名称
format:'iife',//五种输出格式:amd/es6/iife/umd/cjs
name:'bundleName',//当format为iife和umd时必须提供,将作为全局变量挂在window下
globals:{
lodash:'_', //告诉rollup全局变量_即是lodash
jquery:'$' //告诉rollup全局变量$即是jquery
}
},
plugins:[
8 collapsed lines
commonjs(),
babel({
exclude:"node_modules/**"
}),
resolve(),
],
external:['lodash','jquery'],
}
本文标题:Rollup配置和常用插件
文章作者:Cirry
发布时间:Feb 18, 2025
感谢大佬送来的咖啡☕
alipayQRCode
wechatQRCode
总访问量
总访客数人次