Rollup 编译资源离不开 plugin
rollup 也是一个 JavaScript 的模块化编译工具,可以帮助我们处理资源。
与webpack比较
rollup相比 webpack 理念更为简单,能处理的场景也更有限。
| 资源类型 | 处理方式 | 应用场景 | |
|---|---|---|---|
| webpack | 所有资源 | loader、plugin | 大型项目 |
| rollup | ES Module 为主 | plugin | 库文件 |
命令行
通过 npm install rollup -D 先安装到项目中,也可以全局安装。在 src 文件夹下增加入口 index.js 文件,编写代码后使用命令行 npx rollup ./src/index.js -f iife -o dist/bundle.js 编译。
-o 表示输出目录
-c 表示使用默认文件
-w 表示 --watch 监听文件
-f 表示 --format 格式化方式,有四种类型
- cjs ( commonjs 的执行命令 )
- iife ( esmodule 的执行命令,编译后文件会将代码放到闭包中 )
- amd ( amd 方式的执行命令,编译后文件会通过 define 来定义 )
- umd --name xxUtils ( 表示对多个环境支持,需要指定 name,作为全局的属性 )
编译后文件内容按原样输出

配置文件
命令行可以直接使用,当处理规则较多时命令行需要定义很长,还是通过配置文件会更为方便,默认的配置文件为 rollup.config.js
配置文件中使用 input 定义入口文件,output 定义编译后文件位置,可定义多个,因为 rollup 主要支持 esmodule,所以使用 export default 的方式导出。
export default {
input: './src/index.js',
output: [
{
format: 'umd',
name: 'iceUtils',
file: './dist/ice.umd.js',
},
{
format: 'iife',
name: 'iceUtils',
file: './dist/ice.iife.js',
},
{
format: 'cjs',
file: './dist/ice.cjs.js',
},
{
format: 'amd',
file: './dist/ice.amd.js',
},
],
};
通过 npx rollup -c 即可通过配置文件编译出四份代码。

支持 commonjs
rollup 中默认不支持 commonjs ,如果使用 module.exports 这种方式导出。
// math.js
const sum = (a, b) => a + b;
const mul = (a, b) => a * b;
module.exports = {
sum,
mul,
};
// index.js
const { sum, mul } = require('./math');
console.log(sum(10, 20));
console.log(mul(10, 20));
代码可以通过编译,但将 js 文件引入到 html 文件中,浏览器将无法识别

使用 @rollup/plugin-commonjs 可以解决这个问题
import commonjs from '@rollup/plugin-commonjs';
export default {
input: './src/index.js',
output: [
{
format: 'cjs',
file: './dist/ice.cjs.js',
exports: 'auto',
},
],
plugins: [commonjs()],
};
// index.js 要通过 esmodule 的方式引入
import { sum, mul } from './math';
如果引入了第三方资源,如 lodash,要使用 @rollup/plugin-node-resolve 来对资源进行解析,此时第三方资源会被打包进编译后的文件,这样使得编译后文件的体积非常大,通过 external 属性排除打包,并在 html 页面引入资源地址。
import commonjs from '@rollup/plugin-commonjs';
import nodeResolve from '@rollup/plugin-node-resolve';
export default {
input: './src/index.js',
output: [
{
format: 'umd',
file: './dist/ice.umd.js',
name: 'iceUtils',
globals: { lodash: '_' },
},
],
external: ['lodash'],
plugins: [commonjs(), nodeResolve()],
};
// index.html
<script src="./node_modules/lodash/lodash.min.js"></script>
<script src="./dist/ice.umd.js"></script>
处理css和vue
将 css 资源引入直接编译会报错,告知我们需要合适的 plugin

css 使用 rollup-plugin-postcss 来处理,如果项目中有 vue 文件,则需要通过 rollup-plugin-vue 来处理,rollup-plugin-replace 定义全局变量。
import vue from 'rollup-plugin-vue';
import replace from 'rollup-plugin-replace';
plugins: [
vue(),
replace({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
}),
],
转换和压缩
以上代码转换后都与原编写文件一致,没有进行转换和压缩,在 webpack 中使用到的是 babel 和 terser 工具,在 rollup 中也类似。
import babel from '@rollup/plugin-babel';
import { terser } from 'rollup-plugin-terser';
plugins: [
babel({
babelHelpers: 'bundled',
}),
terser(),
],
这样编译后的资源就经过了代码转换和压缩

本地服务
本地服务通过 rollup-plugin-serve 开启,当资源文件发生变化时,rollup-plugin-livereload 会实时刷新浏览器。
import serve from 'rollup-plugin-serve';
import livereload from 'rollup-plugin-livereload';
plugins: [
serve({
open: true,
port: 8000,
contentBase: '',
}),
livereload(),
],

环境区分
上面的 plugin 都是写到一块的,没有区分开发模式或者生产模式,每次编译都会用到所有的插件,我们可以通过参数来做一个区分。
// 在 package.json 中定义指令
"scripts": {
"build": "npx rollup -c --environment NODE_ENV:production",
"serve": "rollup -c --environment NODE_ENV:development -w"
},
// rollup.config.js
const isProduction = process.env.NODE_ENV === 'production';
const plugins = [
commonjs(),
nodeResolve(),
replace({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
}),
postcss(),
vue(),
];
if (isProduction) {
const prodPlugin = [
babel({
babelHelpers: 'bundled',
}),
terser(),
];
plugins.push(...prodPlugin);
} else {
const devPlugin = [
serve({
open: true,
port: 8000,
contentBase: '',
}),
livereload(),
];
plugins.push(...devPlugin);
}
这样编译开发环境就可以直接通过指令 npm run build,编译生产模式则用 npm run serve 来执行
总结
rollup 主要用于处理 esmodule 的 js 资源,通过命令行可以直接执行,需要指定入口出口文件,以及编译的方式。
默认不被支持的资源处理需要通过 plugin,自己通过 commonjs 导出的资源使用 @rollup/plugin-commonjs,第三方库解析通过 @rollup/plugin-node-resolve,处理 css 需要 rollup-plugin-postcss,vue 得依赖 rollup-plugin-vue 和 rollup-plugin-replace,转换和压缩离不开 @rollup/plugin-babel 和 rollup-plugin-terser,最后通过 rollup-plugin-serve 和 rollup-plugin-livereload 开启服务。
区分环境通过 --environment 配置参数。
以上就是 Rollup 编译资源 的介绍, 更多有关 前端、工程化 的内容可以参考我其它的博文,持续更新中~
Rollup 编译资源离不开 plugin的更多相关文章
- [转]QGis2.9在windows下的编译以及二次开发包下载
今天心血来潮,将QGis在github上的代码更新后,又编译了一下.留意到源代码包里面的INSTALL文件有更新,于是本次编译完全基于官方的编译说明.编译过程非常顺利,除了在CMake的第一次conf ...
- android studio教学视频资源(点开即看)
android studio教学视频资源(点开即看) 自从Google推出android studio之后.包含github在内的非常多第三方代码库项目很多其它的採用的android studio编译 ...
- [Cordova] 无法编译Visual Studio项目里Plugin副本的Native Code
[Cordova] 无法编译Visual Studio项目里Plugin副本的Native Code 问题情景 开发Cordova Plugin的时候,开发的流程应该是: 建立Cordova Plug ...
- 【反编译系列】一、反编译代码(dex2jar + jd-gui)和反编译资源(apktool)
版权声明:本文为HaiyuKing原创文章,转载请注明出处! [反编译系列]二.反编译代码(jeb) [反编译系列]三.反编译神器(jadx) [反编译系列]四.反编译so文件(IDA_Pro) 概述 ...
- BuildPipeline.BuildAssetBundle 编译资源包
原文出自:http://blog.csdn.net/nateyang/article/details/7567831 1.导出.unity3d格式资源: http://game.ceeger.com/ ...
- DisUnity——Unity3D反编译资源提取利刃
1.资源 软件及项目源码地址:https://github.com/ata4/disunity/releases 2.使用方法: 将待反编译的文件放入文件夹中:如:E:\Demo\ 在disunity ...
- Python3.6编译安装以及python开发之virtualenv与virtualenvwrapper
Python3.6编译安装 下载python源码包 先到安装目录 cd /opt 下载源码包 wget https://www.python.org/ftp/python/3.6.2/Python-3 ...
- 【ProtoBuffer】windows上安装ProtoBuffer3.1.0 (附已编译资源)
------- 17.9.17更新 --- 以下这些方法都是扯淡,对我的机器不适用,我后来花了最后成功安装并亲测可用的方法不是靠vs编过的,vs生成的库引入后函数全部报undefine refere ...
- Xcode工程编译错误之iOS开发之Xcode9报错 Compiling IB documents for earlier than iOS7 is no longer supported.
概要: 在我们升级到Xcode9时,最低的编译版本为iOS8,但是在使用一些SDK的时候就会报出Compiling IB documents for earlier than iOS7 is no l ...
- android 编译错误 Error:(1, 0) Plugin with id 'com.android.application' not found.
在导入一个项目时,由于它本身的gradle版本比较高,你试用比较旧版本的gradle时就报出Plugin with id 'com.android.application' not found.的错误 ...
随机推荐
- 雪球 app 实战(1)
开头 因为理论篇结束之后,需要一个实战,估选用了雪球app作为一个作业 业务场景: 雪球 app 自选设置(入口位于 行情 模块) 作业内容 使用 百度脑图 编写 思维导图 [自选设置]模块的测试用例 ...
- 2022-02-19:安装栅栏。 在一个二维的花园中,有一些用 (x, y) 坐标表示的树。由于安装费用十分昂贵,你的任务是先用最短的绳子围起所有的树。只有当所有的树都被绳子包围时,花园才能围好栅栏。
2022-02-19:安装栅栏. 在一个二维的花园中,有一些用 (x, y) 坐标表示的树.由于安装费用十分昂贵,你的任务是先用最短的绳子围起所有的树.只有当所有的树都被绳子包围时,花园才能围好栅栏. ...
- javaer你还在手写分表分库?来看看这个框架怎么做的 干货满满
java orm框架easy-query分库分表之分表 高并发三驾马车:分库分表.MQ.缓存.今天给大家带来的就是分库分表的干货解决方案,哪怕你不用我的框架也可以从中听到不一样的结局方案和实现. 一款 ...
- Doris(五) -- 数据的导入导出
数据导入 使用 Insert 方式同步数据 用户可以通过 MySQL 协议,使用 INSERT 语句进行数据导入 INSERT 语句的使用方式和 MySQL 等数据库中 INSERT 语句的使用方式类 ...
- R 语言 download.file 的几点知识
R 语言中,不管是安装包,还是下载数据,很多时候都会用到download.file这个函数.如果你在安装包或者下载数据过程中出现中断,或者异常,想要判断是远程源服务器的问题,还是自身服务器的问题,还是 ...
- bugku xxx二手交易市场
打开靶场 分析 很明显需要先注册一个账号才行 完成后发现两个上传图片的地方 一个是更换头像, 一个是发布内容 先更换头像试试 首先上传一个木马图片,会发现一直转圈圈,(卡住了) 只能先上传正常的图片了 ...
- 【保姆级教学】抓包工具Wireshark使用教程
wireshark介绍 今天讲一下另一款底层抓包软件,之前写过两篇抓包软件 分别是 fiddler抓包[https://www.cnblogs.com/zichliang/p/16067941.htm ...
- Lucene检索全流程学习笔记
一 简介 写作目的 1 为什么学习Lucene lucene是基于倒排索引的检索工具库,倒排索引是典型的文本匹配,它能够精确匹配用户搜索的query,它的缺点是不擅长语义理解,而深度学习检索模型擅长的 ...
- 强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验
强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述.序列决策.动作空间定义.策略价值函数.探索与利用.Gym强化学习实验 1.强化学习核心概念 强化学习(reinforcement le ...
- LeetCode 周赛 350(2023/06/18)01 背包变型题
本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问. 往期回顾:LeetCode 单周赛第 348 场 · 数位 DP ...