Skip to content

Rollup 全解析 - 附DEMO

安装 rollup

js
pnpm add rollup

commonjs

TIP

将 CommonJS 模块转换为 ES6,这样它们就可以包含在 Rollup 包中。

如果我们默认使用commonjs模块来进行打包的话,那么代码是会报错的(module.exports)因为rollup默认支持esmodule 但是如果我们想要正常的导出es模块那么我们就需要这个插件

安装@rollup/plugin-commonjs

js
pnpm add @rollup/plugin-commonjs -D

node-resolve

因为我们rollup默认只支持esmodule, 我们如果导入的是 commonjs的文件 那么他会报错 这个插件 运用 node解析算法 对不同 文件 路径 进行解析,如果我们导入commonjs文件 那么就会报错

TIP

使用 "node 解析算法" 来定位模块,用于使用 node_modules 中的第三方模块。and COMMONJS

babel-plugin

为了正确的被使用 和 解析我们的模块 以致于 其他浏览器能够使用,我们应该使用babel来进行代码编译

为什么 需要使用babel

如果我们的 浏览器 或者 nodejs 不支持 最新的 ECMA 特性 我们就可以使用babel 来进行解析 使用本插件,可以通过 Babel 的能力将你所写的 es6/es7 代码编译转换为 es5 的,以适用那些更古老的浏览器。

安装rollup-plugin-babel

js
pnpm add rollup-plugin-babel -D

alias 插件

alias 插件就是我们在构建包的定义时对rollup 路径定义别名

TIP

使用这个插件,你可以在引入文件时,使用一个 别名 来代替那些固定的路径。

安装@rollup/plugin-alias

js
pnpm add @rollup/plugin-alias -D

beep

报错时 会提供 声音

WARNING

就是会发出 嘟嘟的声音

js
pnpm add @rollup/plugin-beep -D

html

创建一个 html文件 在其中引用rollup构建出来的包

js
pnpm add @rollup/plugin-html

inject

WARNING

一个 Rollup 插件,用于扫描模块的全局变量,并在必要时注入import语句。

就是比如我们定义一个全局变量 我们不需要引入当前引用全局变量的包 我们可以直接使用 他会在我们打包的时候自动帮助我们 进行导入 进行 import

js
pnpm add @rollup/plugin-inject -D

multi-entry

WARNING

允许我们对一个bundle 使用多个入口 打包到一个出口中

js
pnpm add @rollup/plugin-multi-entry -D

replace

WARNING

一个 Rollup 插件,在打包时替换文件中的目标字符串。

js
pnpm add @rollup/plugin-replace -D

run

WARNING

一个 Rollup 插件,一旦你的 bundle 被构建,它就会在 nodejs 中运行。

js
pnpm add @rollup/plugin-run - D

strip

WARNING

一个 Rollup 插件,用于从代码中删除 debugger 语句和诸如 assert.equal 和 console.log 类似的函数。

js
pnpm add @rollup/plugin-strip -D

url

WARNING

一个 Rollup 插件,将文件导入为 data-URIsesm 格式。 可以帮助我们 在js中内联 其他格式

这样说或者有些让人摸不着头脑,通过 demo 或许能更容易理解。

demo 详解:
index.js 分别引入了两个 .png 格式文件,分别为:

// test.png 7KB 大小
import test01 from './test.png'
// test02.png 16KB 大小
import test02 from './test02.png'

当没有 @rollup/plugin-url 支持时,构建(yarn build-url-no-plugin)行为一定会报错,因为 js 解析引擎无法解析 .png 格式的文件。

但配上 @rollup/plugin-url 插件后,结果会怎样呢?

var test01 = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOcAAAD2CAYAAAAtfpAeAAAAAXNS...(略)";

var test02 = "7822ffd3c90c0d9c.png";

对于两张图片的处理居然并不相同!
为什么呢?
官方文档解释:

内联文件的文件大小限制。如果一个文件超过这个限制(默认14KB),它将被复制到目标文件夹,并提供散列文件名。

因此, test02.png 被复制到了目标文件夹,并提供了一个新的基于散列的名称,而且导入的 test02 并不是文件,而是该文件的路径。

那么 test 呢?

test 是作为 data URIs 被导入的,关于这种格式,想详细了解的可以访问此文档查看: nodejs.cn/api/esm.htm…

简单来说,通过这种形式将 文件 作为内联形式引入,可以减少网络请求的次数,提升页面加载速度。

(这也是为什么此插件针对小文件和大文件要采取不一样的策略的原因。)

postcss

WARNING

all in js

js
pnpm add rollup-plugin-css  -D
js
// config
export default {
  ...
  plugins: [
    postcss({
      extract: true,  // css通过链接引入
      use: ["sass"],  // 编译 sass
    })
  ],
  ...
};

json

WARNING

rollup 本身不能识别 json文件 这个插件可以帮助我们识别 json文件

js
pnpm add @rollup/plugin-json -D

terser

WARNING

代码压缩 插件 缩小体积

js
pnpm add rollup-plugin-terser - D

typescript

js
pnpm add @rollup/plugin-typescript  tslib typescript -D

vue

WARNING

lib 打包的时候 我们需要用到vue的时候

js
// vue3
pnpm add rollup-plugin-vue @vue/compiler-sfc -D
// vue2 
pnpm add rollup-plugin-vue@5.1.9 vue-tempalte-compoler

postcss

WARNING

postcss 支持scss less 和其他 css 预处理器

pnpm add rollup-plugin-postcss postcss

Rollup 全解析 - 附DEMO has loaded