rollup打包工具快速入门

news2024/9/21 14:48:53

0.开始

教学视频出处
https://www.bilibili.com/video/BV1w84y1z77V?p=3&spm_id_from=pageDriver&vd_source=0f7f337dd5a99bb975b88a48ae1b3711

日期:2022/12/3
rollup目前版本:

 "rollup": "^3.5.1"

1.rollup概述

官网
https://rollupjs.org/guide/en/#–bundleconfigascjs

Rollup 同样也是一款 ES Modules 打包器。它也可以将项目中散落的细小模块打包为整块代码,从而使得这些划分的模块可以更好的运行在浏览器环境或者 Node.js 环境。

从作用上来看,Rollup 与 Webpack 非常类似。不过相比于 Webpack,Rollup 要小巧的多。因为 Webpack 在配合一些插件的使用下,几乎可以完成开发过程中,前端工程化的绝大多数工作。而 Rollup 可以说仅仅是一个 ESM 打包器,没有其它任何额外的功能

比如 rollup中并不支持类似HMR这种高级特性

rollup的目的不是要与webpack全面竞争,初衷是提供一个充分利用esm各项特性的高效打包器

2.rollup的快速上手

1.准备示例demo

可以先执行下面的命令得到package.json

npm init -y

我们准备一个示例demo,然后这是目录结构,里面有三个esm文件
在这里插入图片描述
index.js

//导入模块成员
import {log} from './logger'
import messages from "./messages";

//使用模块成员
const msg = messages.hi;

log(msg);

logger.js

export const log = msg =>{
    console.log('-------INFO-----------')
    console.log(msg)
    console.log('----------------------')
}

export const error = msg =>{
    console.log('-------ERROR-----------')
    console.log(msg)
    console.log('----------------------')
}

messages.js

export default {
    hi: 'Hey Guys,I am zce~'
}

2.安装rollup

npm i rollup

在这里插入图片描述
然后我们直接运行一下 rollup

./node_modules/.bin/rollup

注意,yarn 的话 ,可以直接 如下 就能自己找到rollup

yarn rollup

在这里插入图片描述
从提示信息里,我们就知道可以看到它的用法,它需要提供一个入口文件
同时我们再通过 --format 指定最适合浏览器的 iife 就是自调用函数的格式

./node_modules/.bin/rollup ./src/index.js --format iife

那么此时结果就已经打印到控制台上了

在这里插入图片描述
我们再通过 --file 指定一个输出路径

./node_modules/.bin/rollup ./src/index.js --format iife --file dist/bundle.js

在这里插入图片描述

3.查看打包结果

在这里插入图片描述
我们发现它打包结果非常简洁,输出结果它只保留用到的部分,没有用到的部分都没有输出,因为rollup会默认开启tree shaking摇树去优化输出的结果,那么tree shaking的概念呢,最早就是在rollup这个打包工具提出来的。

3.rollup配置文件

rollup也支持通过配置文件配置我们打包过程中的各项参数。在项目根目录新建 rollup.config.js

那么 rollup.config.js 这个文件也是运行在node环境中,rollup会额外的处理这个配置文件所以这里我们可以直接使用esm的写法,但是,如果要使用esm的写法,那么此时你应该在你的package.json文件中添加上

"type": "module"

或者把后缀改成 rollup.config.cjs ,否则它会报错。
在这里插入图片描述

要么我们就直接使用commonjs规范导出即可(推荐)

module.exports = {
    input: 'src/index.js',
    output: {
        file: 'dist/bundle.js',
        format: 'iife'
    }
}

执行命令

./node_modules/.bin/rollup --config
# 指定配置文件
./node_modules/.bin/rollup --config

4.使用插件

rollup的功能,只是esm模块的合并和打包,那假如我们有更高级的需求,里如
1.我们要加载其它类型的资源文件
2.导入commonjs模块
3.编译ecmascript的新特性

这些额外的需求,rollup同样支持使用插件的方式实现,而且,插件时rollup的唯一拓展方式,而不像webpack它有3中拓展方式

我们这里来一个小例子,我们使用rollup-plugin-json插件来导入json文件。

npm i rollup-plugin-json

然后在rollup.config.js文件里引入插件。

在plugins字段,他是一个数组,里面直接调用函数

在这里插入图片描述

index.js文件中
在这里插入图片描述
执行打包

 ./node_modules/.bin/rollup --config rollup.config.js

打包成功后我们看看结果,它除了用到的属性外,别的属性都通过 tree shaking摇树模式给优化出去了。
在这里插入图片描述

5.加载npm模块

rollup默认只能按照文件路径的方式去加载本地的文件模块,但是对于node_modules当中那些第三方的模块,并不能像webpack直接通过模块的名称导入对应的模块,那为了抹平这样的一个差异,rollup官方给出了一个

rollup-plugin-node-resolve
通过这个插件,我们就可以在代码当中,直接去使用模块名称导入对应的模块

我们来安装这个插件

npm i rollup-plugin-node-resolve

然后我们再装一个lodash库,lodash是对各种方法、函数的封装库

npm i lodash-es

注意,我们这里安装的是lodash esm版本。而不是lodash普通版本,是因为rollup默认只能处理esm模块。如果说我们要使用普通版本,我们需要做额外的处理

rollup.config.js文件引入该插件

//引入rollup-plugin-json插件
const json = require('rollup-plugin-json')
const resolve = require('rollup-plugin-node-resolve')

module.exports = {
    input: 'src/index.js',
    output: {
        file: 'dist/bundle.js',
        format: 'iife'
    },
    //使用json插件
    plugins: [
        json(),
        resolve()
    ]
}

在这里插入图片描述
在这里插入图片描述
再次打包我们发现bundle.js 里面就已经有lodash的代码了
在这里插入图片描述

6.加载commonjs模块

rollup的设计就是只处理esm模块打包,如果代码中导入commonjs模块那是不被支持的,但是呢目前,还有大量的npm模块使用commonjs的方式导出成员,所以为了兼容这些模块rollup官方呢,又给出了一个插件rollup-plugin-commonjs

安装插件

npm i rollup-plugin-commonjs

引入插件
在这里插入图片描述
创建一个commonjs的模块cjs-module.js

module.exports = {
    foo: 'bar'
}

在这里插入图片描述
在index.js里直接导入commonjs模块
在这里插入图片描述
打包

./node_modules/.bin/rollup --config rollup.config.js

找到bundle.js 拖到最下面,就发现commonjs的成员都被打包进去了。
在这里插入图片描述

7.代码拆分

在rollup最新的版本中,已经支持代码拆分了,同样可以使用符合esm标准的动态导入 Dynamic Import的方式去实现模块的按需加载,rollup内部也会自动去处理代码拆分,也就是分包

在入口文件index.js中注释掉静态导入的代码

//动态导入的方式
import('./logger').then(({log})=>{
    log('code splitting~')
})

import返回的是一个promise对象,它的then方法可以拿到模块导入的一个对象,由于模块导出的成员都会放到这个对象当中,所以我们就可以通过解构的方式去提取出来里面的方法

我们尝试运行打包

./node_modules/.bin/rollup --config

在这里插入图片描述
它会返回一个错误,意思是我们使用 code-splitting代码拆分的方式打包它要求我们的输出格式不能是iife 这种格式,原因也很简单因为自执行函数会把所有的模块放到同一个函数当中,它并没有像webpack一样有一些引导代码
所以说,它没有办法实现代码拆分 code-splitting,如果你要使用 code-splitting的话,你就要使用 amd 或者 commonjs这样一些其它的格式,那我们在浏览器的环境当中,我们只能使用amd的标准格式,所以这里我们使用amd的格式输出打包结果

./node_modules/.bin/rollup --config --format amd

又报错了
在这里插入图片描述
是告诉我们, code-splitting的方式,它需要输出多个文件,因为需要输出多个文件,我们就不能使用file这种配置方式,因为file这种方式是指定单个文件的输出文件名,那我们要输出多个文件的话,我们需要使用dir这个参数

由于我们要改的东西比较多,于是可以直接去配置文件中修改。

        dir: 'dist',//输出目录
        format: 'amd'//格式为amd

在这里插入图片描述
打包

./node_modules/.bin/rollup --config

在这里插入图片描述
然后输出目录dist就多了一个入口文件的打包文件和一个动态导入的打包文件
它们都是通过amd的方式输出的。
在这里插入图片描述

8.多入口打包

rollup同样支持多入口打包,而且对于多入口那些公共的部分也会自动提取到单个文件当中作为独立的bundle

我们新建一个入口文件album.js

import fetchApi from './fetch';
import {log} from './logger'

fetchApi('/posts?albumId=1').then(data => {
    data.forEach(item => {
        log(item);
    })
})

同时 index.js 这个入口文件的内容如下

import fetchApi from './fetch';
import {log} from './logger'

fetchApi('/posts').then(data => {
    data.forEach(item => {
        log(item);
    })
})

还有一个esm,fetch.js

export default endpoint => {
    return fetch(`https://jsonplaceholder.typicode.com${endpoint}`)
        .then(response => response.json())
}

在这里插入图片描述
修改多入口打包的方式也非常简单,只需要把配置文件rollup.config.js
的input属性改成一个数组就可以了,这里需要注意,因为多入口打包内部会提取公共模块,也就是说内部会使用代码拆分,那输出格式就不能使用iife这种自调用函数的输出格式了。

    // input: 'src/index.js',
    // input: ['src/index.js', 'src/album.js'],//改成一个数组就可以了
    //多入口打包,也可以使用对象的方式重命名入口文件
    input:{
        foo:'src/index.js',
        bar:'src/album.js'
    },

在这里插入图片描述

然后我们删除 dist目录,重新打包

./node_modules/.bin/rollup --config

我们可以看一下,分别输出的结果

bar.js

define(['./logger-43f15a50'], (function (logger) { 'use strict';

    logger.fetchApi('/posts?albumId=1').then(data => {
        data.forEach(item => {
            logger.log(item);
        });
    });

}));

foo.js

define(['./logger-43f15a50'], (function (logger) { 'use strict';

    // //导入模块成员

    logger.fetchApi('/posts').then(data => {
        data.forEach(item => {
            logger.log(item);
        });
    });

}));

logger-43f15a50.js,这个就把公共用到的部分,单独打包成一个bundle。

define(['exports'], (function (exports) { 'use strict';

    var fetchApi = endpoint => {
        return fetch(`https://jsonplaceholder.typicode.com${endpoint}`)
            .then(response => response.json())
    };

    const log = msg =>{
        console.log('-------INFO-----------');
        console.log(msg);
        console.log('----------------------');
    };

    exports.fetchApi = fetchApi;
    exports.log = log;

}));

这里需要注意的是,amd这种输出格式的js文件,不能直接引用到页面上,而是需要通过实现amd标准的库去加载。

我们在dist目录中新建index.html 去尝试加载一下打包的amd格式的js文件

<!doctype html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>

<!--<script src="./dist/foo.js"></script>-->
<script src="https://cdn.jsdelivr.net/npm/requirejs@2.3.6/require.js" data-main="foo.js"></script>

</body>
</html>

在这里插入图片描述

然后打开开发者工具,发现foo.js 已经被正常引入进来,也正常工作了
在这里插入图片描述
在这里插入图片描述

9.选用原则

通过探索和尝试,我们发现rollup确实有它的优势

1.输出的结果更加扁平,那执行效率就会更高
2.自动移除未引用的代码,也就是 tree shaking
3.打包结果基本上和手写的代码一致的,打包结果对于开发者而言还是可以正常阅读的

缺点也很明显

1.加载非esm的第三方模块就比较复杂,需要插件。
2.模块最终都被打包到一个函数中,无法实现 HMR(热更新),模块热替换的开发体验。
3.在浏览器环境中,代码拆分依赖 amd的库,因为它的代码拆分就必须使用像amd这样的输出格式

综合以上的特点,如果说我们开发一个应用程序,我们就肯定需要去引入大量的第三方模块,同时我们也需要像HMR一样提升开发体验,而且我们应用一旦大了过后,还设计到必须要去分包,那这些需求呢,在rollup上都会有一些欠缺,如果我们开发的是一个javascript的类库或者框架,那这些优点就特别有必要,那它这些缺点都可以忽略,所以说,很多知名的框架 像 react vue它都使用rollup作为打包器,而并非是webpack,但是,到目前为之,开源社区大多数人还是希望这两个工具,可以共同存在相互发展相互支持和借鉴,那原因也很简单,就是希望更专业的工具去做更专业的事情

总结呢 就是 webpack是大而全,rollup是小而美

那在对两者之间的选择上,如果我们正在开发应用程序,建议大家使用webpack,如果是开发类库或者框架,建议 rollup,不过这不是一个绝对的标准,只是一个经验法则,因为rollup同样也可以构建绝大多数的应用程序,webpack同样可以构建类库或者框架,只不过相对来讲有种术业有专攻的感觉,随着近几年webpack的发展,rollup的优势已经逐渐被抹平了,例如,像 rollup这种扁平化输出,在wepack中就可以使用对应的插件去输出。


到这里视频里面的教程已经完结了。下面是我自己的一些需要用到插件和对rollup的一些探索。

babel

官方提供的 @rollup/plugin-babel,只有新版 rollup2 才有 @rollup/xxx 作用域开头的子依赖库,能不用原来 rollup-xxx 开头的库就不用,在 babel7 和 vue3 都在作用域管理的大潮下,我们要向作用域包看齐。

npm i -D @rollup/plugin-babel

压缩js

@rollup/plugin-terser

打包scss

rollup-plugin-scss

改变文件实时监听

./node_modules/.bin/rollup --config -w

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60264.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

N32G45之串口+DMA数据收发

N32G45之串口DMA数据收发 1.串口简介   通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信&#xff0c;也支持LI…

【云原生】nacos权限制认证

鉴权 服务端如何开启鉴权 非Docker环境 按照官方文档配置启动,默认是不需要登录的&#xff0c;这样会导致配置中心对外直接暴露。而启用鉴权之后&#xff0c;需要在使用用户名和密码登录之后&#xff0c;才能正常使用nacos。 开启鉴权之前&#xff0c;application.properti…

0115 查找算法Day4

剑指 Offer 03. 数组中重复的数字 在一个长度为 n 的数组 nums 里的所有数字都在 0&#xff5e;n-1 的范围内。数组中某些数字是重复的&#xff0c;但不知道有几个数字重复了&#xff0c;也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1&#xff1a; …

Linux-CPU之平均负载

一般我们觉得系统变慢了&#xff0c;都会执行 top 或者 uptime 命令&#xff0c;来了解系统的负载情况。 uptime11:29:06 up 0 min, 2 users, load average: 1.21, 0.29, 0.10// 当前时间 // 系统运行时间 // 正在登录用户数 //1 分钟、5 分钟、15 分钟的平均负载概念&…

补知识点:Stream API

一、创建Stream 首先创建Stream的话&#xff0c;有四种创建方式&#xff1a; 注&#xff1a; 第一种集合的方式是最常用的 package com.atguigu.gulimall.gateway;import com.atguigu.gulimall.streamapi.Employee; import com.atguigu.gulimall.streamapi.EmployeeData; impo…

【应用】Docker

DockerDocker 的安装基本安装流程配置镜像加速Docker 常用命令镜像相关命令容器相关命令DockerfileDockerfile 常用指令Dockerfile 简单使用案例Dockerfile 构建 java 项目镜像Docker ComposeDocker compose 基本参数services 配置参数Docker 的安装 基本安装流程 使用虚拟机…

Linux JDK8下载安装

JDK安装 整体步骤介绍 操作步骤: 1 查看自己linux版本位 getconf LONG_BIT(64位) 2. 下载jdk的安装包 这里提供三种方法下载: (以jdk-8u171-linux-x64.tar.gz为例) 2.1 官网下载jdk: 官网: https://www.oracle.com/downloads/ jdk最新版本下载: https://www.oracle.com…

带你玩转序列模型之seq2seq模型定向(集束)搜索

目录 一.基础模型 二.选择最可能的句子 三.定向搜索 四.改进定向搜索 五.定向搜索的误差分析 一.基础模型 在这一周&#xff0c;你将会学习seq2seq&#xff08;sequence to sequence&#xff09;模型&#xff0c;从机器翻译到语音识别&#xff0c;它们都能起到很大的作用…

【数据结构1】数据结构的基本概念

数据结构的基本概念 数据&#xff1a;数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 数据元素、数据项&#xff1a;数据元素是数据的基本单位&#xff0c;通常作为一…

以太网 TCP协议(TCP交互过程中出现丢包时的解决机制-列举部分)

2.7.3 以太网 TCP协议&#xff08;TCP交互过程中出现丢包时的解决机制-列举部分&#xff09; 参考&#xff1a;CSDN_TCP的重传机制_博主.Pr Young&#xff0c;对描述进行了整理与结合个人的理解进行编写。 一、超时重传机制 在发送数据时&#xff0c;设定一个定时器&#xff0c…

Ubuntu下cmake使用入门

CMake是一个跨平台的安装&#xff08;编译&#xff09;工具&#xff0c;可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件。其包含自己的语法结构&#xff0c;只要按照其语法编写成CMakeLists.txt&#xff0c;然后camke程序就能对…

MAML:User Diverse Preference Modeling by Multimodal AttentiveMetric Learning

一、摘要 大多数现有的推荐系统用特征向量表示用户的偏好&#xff0c;当预测该用户对不同项目的偏好时&#xff0c;假设该特征向量是固定的。然而&#xff0c;同一个向量不能准确地捕捉用户对所有项目的不同偏好&#xff0c;特别是在考虑各种项目的不同特征时。为了解决这个问…

【应用】Kubernetes

Kubernetesk8s 安装流程安装前配置安装 docker 以及 k8s 组件初始化 k8s 集群测试使用&#xff1a;安装 kubernetes-dashboardk8s 基础概念k8s 核心技术概念k8s 内部组件k8s 中的 IP 地址K8S 服务暴露的三种方式k8s 安装流程 k8s-masterk8s-node01k8s-node02192.168.86.140192…

【编程题】【Scratch四级】2022.09 三个数排序

三个数排序 输入三个数&#xff0c;比较三个数的大小&#xff0c;并将这三个数按照从小到大的顺序说出。 1. 准备工作 &#xff08;1&#xff09;保留小猫角色&#xff0c;默认位置&#xff1b; &#xff08;2&#xff09;白色背景。 2. 功能实现 &#xff08;1&#xff…

Java基于SSM框架的教室预约申请管理系统 毕业设计

本教室管理系统主要包括系统用户管理模块、楼层信息管理模块、校内新闻管理、教室信息管理、登录模块、和退出模块等多个模块。它帮助教室管理实现了信息化、网络化,通过测试,实现了系统设计目标,相比传统的管理模式,本系统合理的利用了教室管理数据资源,有效的减少了教室管理的…

四旋翼无人机学习第13节--Padstack Editor的简单使用

文章目录0 前言1 绘制MP2120 QFN10封装焊盘(初步学习)1.1 数据手册确定焊盘种类1.2 软件设置焊盘11.3 软件设置焊盘22 绘制DM9000A LQFP48L封装焊盘(初步学习)2.1 数据手册确定焊盘种类2.2 软件设置焊盘3 绘制STC89C51 PDIP-40封装通孔焊盘(初步学习)3.1 数据手册确定焊盘种类3…

【Spring源码系列】Bean生命周期-Bean销毁

前言 Spring给我们提供了一种当bean销毁时调用某个方法的方式。那么&#xff0c;Spring底层到底是如何实现的呢&#xff1f;接下来&#xff0c;我们将从源码案例的方式来解析&#xff1a;spring如何实现当bean销毁时调用某个方法的。 一、Bean销毁介绍 bean销毁的时机 当sp…

[附源码]计算机毕业设计springboot智能衣橱APP

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

数据增强 - 当数据有限时如何使用深度学习(一)

本文是对图像的深度学习数据增强技术的全面综述前言我们都遇到过这种情况&#xff1a;您有一个可以使用机器学习模型实现的机会&#xff0c;但当您打开网络浏览器并搜索相关数据&#xff0c;很有可能&#xff0c;您会发现一个只有几百张图像的数据集。您记得最受欢迎的数据集的…

【项目_03】日历的回显、搭建热门精选、下拉加载更多、搜索框搭建 | 基于Vue3全家桶

&#x1f4ad;&#x1f4ad; ✨: 日历的回显、搭建热门精选、下拉加载更多、搜索框搭建 | 旅途拾景   &#x1f49f;&#xff1a;东非不开森的主页   &#x1f49c;: 心若有所向往&#xff0c;何惧道阻且长&#x1f49c;&#x1f49c;   &#x1f338;: 如有错误或不足之处&…