使用Rollup.js快速开始构建一个前端项目

Rollup 是一个用于 JavaScript 项目的模块打包器,它将小块代码编译成更大、更复杂的代码,例如库或应用程序。Rollup 对代码模块使用 ES6 模块标准,它支持 Tree-shaking(摇树优化),可以剔除那些实际上没有被用到的代码,从而生成更小的文件,这意味着它非常适合于现代 JavaScript 项目。

工作流程

当运行 Rollup 时,以下步骤大致描述了其工作流程:

  1. 初始化:解析 CLI 参数和配置文件,设置插件和加载器。
  2. 构建:解析入口文件,追踪所有依赖项,并构建一个模块依赖图。
  3. 打包:根据模块依赖图,通过遍历和连接各个模块来创建最终的输出代码。
  4. 输出:将打包后的代码写入到文件系统中。

核心模块

如下介绍Rollup.js支持的模块配置和核心的功能特性:

  1. 输入输出管理:Rollup通过配置文件定义输入文件(通常是项目的主要入口点)和输出文件(打包后的结果)。这使得开发者能精确控制打包的起点和终点,以及输出的格式(如ES模块、CommonJS、UMD等)。
  2. 模块解析:Rollup能够处理各种模块格式,包括ES模块、CommonJS、AMD等。它会解析这些模块之间的依赖关系,并将它们整合到一起。
  3. 代码转换:虽然Rollup本身不直接提供代码转换功能,但通过与Babel等转换工具的插件集成,可以实现ES6+特性的转换,确保兼容性。
  4. Code Splitting(代码拆分):允许将代码拆分为多个chunk(代码块),以便于实现懒加载和优化加载时间。这对于大型应用来说是一个非常重要的功能。
  5. Tree Shaking:这是Rollup的一个关键特性,旨在消除代码中未使用的导出。通过静态分析确定代码的使用情况,Rollup能够从最终包中移除未引用的代码,从而减小文件大小。这对于库和应用的优化尤其重要。
  6. 插件支持:Rollup 的强大之处在于其灵活的插件系统。插件允许用户扩展Rollup的功能,如支持额外的模块格式、进行代码转换(如TypeScript转JavaScript)、代码优化(如压缩)、按需加载等。插件可以在Rollup配置文件中被导入和配置。

快速开始

和其他所有的构建工具一样,rollup.js的工作就是实现前端工程化项目最终打包生成符合我们要求的前端文件:html、css、js和其他静态文件。下面介绍如何创建一个基础的基于rollup.js构建的前端项目。

安装Rollup

首先,您需要在您的项目中安装 Rollup。您可以通过 npm(Node 包管理器)来完成这个步骤:

npm install --global rollup

或者,如果您想要在本地项目中安装:

npm install rollup --save-dev

初始化项目

在您的项目目录中,创建一个 package.json 文件,如果您还没有:

npm init

配置 Rollup

创建一个 Rollup 配置文件,通常命名为 rollup.config.js。在这个文件中,您可以指定输入文件、输出格式和其他选项。以下是一个基本的配置示例:

// rollup.config.js
export default {input: 'src/main.js', // 入口文件output: {file: 'bundle.js', // 输出文件format: 'umd', // 输出格式:'amd', 'cjs', 'es', 'iife', 'umd'name: 'MyBundle', // 如果输出格式是 'iife' 或 'umd',则必须指定一个全局变量名},plugins: [], // 使用的插件列表
};

使用插件

Rollup 本身功能有限,但通过插件可以极大地扩展其功能。例如,安装并使用 Babel 插件来转译 ES6+ 代码:

npm install rollup-plugin-babel @babel/core @babel/preset-env --save-dev

然后在配置文件中添加:

import babel from 'rollup-plugin-babel';export default {// ...其他配置plugins: [babel({exclude: 'node_modules/**', // 排除不需要编译的文件夹}),],
};

运行 Rollup
在您的命令行中运行以下命令来构建您的项目:

rollup -c

这里 -c 指定使用配置文件。
监听文件变化
如果您想要在文件变化时自动重新构建,可以使用 --watch 标志:

rollup -c--watch

配置选项

如下通过配置文件的配置来了解下Rollup.js常见的支持配置项,首先来看下配置文件的格式:

import { fileURLToPath } from 'node:url';export default {input: 'src/main.js',   // 入口文件,支持string, 对象output: {              // 最终生成文件格式file: 'bundle.js',   // 最终生成的文件,单文件依赖库format: 'cjs'       // 输出格式,支持: umd、amd、cjs、ifie、es、system},external:  [            // 用于匹配需要排除在 bundle 外部的模块'some-externally-required-library',fileURLToPath(new URL('src/some-local-file-that-should-not-be-bundled.js',import.meta.url)),/node_modules/],plugins: [      // 配置需要使用的插件resolve(),commonjs(),isProduction && (await import('@rollup/plugin-terser')).default()],treeshake: {   // 开启 treeshake 优化, 减少 bundle 体积moduleSideEffects: false, // 允许模块有副作用,不能设置为false,不然会影响postcss的处理},cache: process.env.NODE_ENV === 'development',// 开发环境下开启缓存watch: {                                     // 监听地址                                  include: ['src/**', 'plugins/**','.env*'],}
};
 input

用于配置项目工程的入口文件,可以是单个入口,也可以是多个入口,可通过配置来实现区分,支持格式如下:

  • 字符串
  • 字符串数组
  • 指定entryName的map对象

如果值为一个入口文件的数组或一个将名称映射到入口文件的对象,那么它们将被打包到单独的输出 chunks。

plugins

这是个尤为重要的功能,通过插件可以帮助我们实现包含对文件的解析、转换、插入等各种类型操作,是rollup.js工具的核心功能,我们也需要通过不同类型的项目,配置不同的插件来支持项目的打包配置。如下介绍一些常见的插件:

  • @rollup/plugin-babel:用于在 Rollup 构建过程中使用 Babel 进行代码转换。
  • @rollup/plugin-commonjs:将 CommonJS 模块转换为 ES 模块,以便在 Rollup 中进行打包。使用此插件可以将依赖的 CommonJS 模块打包成 ES 模块。
  • @rollup/plugin-json:将 JSON 文件转换为 ES 模块。
  • @rollup/plugin-node-resolve:用于解析项目中引用的模块,自动引入需要的模块文件‌。
  • @rollup/plugin-replace:用于替换代码中的变量。
  • @rollup/plugin-typescript:用于将 TypeScript 代码转换为 JavaScript 代码。
  • @rollup/plugin-buble‌:用于将ES6+代码编译成ES5代码,便于更广泛的浏览器兼容性‌
  • rollup-plugin-terser:用于压缩JavaScript代码的Rollup插件,它使用Terser进行代码压缩和混淆。
  • rollup-plugin-postcss:用于处理CSS文件。它基于PostCSS,可以自动化处理CSS文件中的一些常见任务,例如自动添加浏览器前缀,压缩CSS等。
  • rollup-plugin-copy:文件复制
  • rollup-plugin-sass:处理Sass/SCSS文件并将其编译为CSS的Rollup插件。它可以将Sass/SCSS文件打包到JavaScript模块中,以便在应用程序中使用。
  • rollup-plugin-less:用于将 Less 文件转换为 CSS,并将其注入到打包后的 JavaScript 文件中。这样就可以在一个文件中同时管理 JavaScript 代码和 CSS 样式。该插件还支持 CSS Modules,允许使用类似于 BEM 的命名规范来管理样式。
  • rollup-plugin-image:用于导入和处理图像文件。
  • rollup-plugin-vue:将.vue文件转为js模块文件。
  • rollup-plugin-serve:启动一个服务器。
  • rollup-plugin-visualizer:分析打包文件大小的插件。
  • rollup-plugin-gzip:gzip压缩插件。
  • unplugin-auto-import/rollup:自动导入模块插件。
  • rollup-plugin-livereload:热更新插件。
treeshake

除屑优化旨在消除代码中未使用的导出。该选项的值设置为 false 时,Rollup 将生成更大的 bundle,但是可能会提高构建性能。

cache

配置为boolean类型,设置为True将只会对改变的模块重新分析,从而加速观察模式中后续的构建。默认为True

watch

用于指定观察模式(watch mode)的选项,或防止 Rollup 配置被观察。指定该选项为 false,将仅对 Rollup 使用数组配置时有效。其支持格式如下:

interface WatcherOptions {buildDelay?: number; //  触发重新构建到执行下一次构建需要等待的时间, 单位:毫秒chokidar?: ChokidarOptions; // 决定是否在触发重新构建时清空屏幕clearScreen?: boolean;exclude?: string | RegExp | (string | RegExp)[]; // 指定监听返回内的文件include?: string | RegExp | (string | RegExp)[]; // 指定跳过监听范围内的文件skipWrite?: boolean; // 决定是否在触发重新构建时跳过 bundle.write() 步骤
}
external

用于匹配需要排除在 bundle 外部的模块,它的值可以是一个接收模块 id 参数并返回 true (表示外部依赖)或 false (表示非外部依赖)的函数,也可以是一个模块 ID 数组或者正则表达式。

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

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

相关文章

第7章 网络请求和状态管理

一、Axios 1 Axios概述 Axios是一个基于Promise的HTTP库,可以发送get、post等请求,它作用于浏览器和Node.js中。当运行在浏览器时,使用XMLHttpRequest接口发送请求;当运行在Node.js时,使用HTTP对象发送请求。 Axios的…

【jeston】torch相关环境安装

参考:玩转NVIDIA Jetson (25)— jetson 安装pytorch和torchvision torch install 安装环境 conda create -n bisenet python3.8 conda activate bisenethttps://forums.developer.nvidia.com/t/pytorch-for-jetson/72048 import torch pri…

java异步多线程Async学习记录

java异步多线程Async学习记录 第1步:声明线程池AsyncConfiguration import org.springframework.context.annotation.Bean; import org.springframework

关联信息融合的知识图补全方法

目前,一些基于知识表示学习的补全方法没有充分考虑多步关系路径中各关系与直接关系之间的关联信息,以及头尾实体类型与直接关系之间的关联信息。 本论文对这些关联信息进行提取和利用,并提出了知识图补全的AiTransE模型。该模型利用首尾实体之…

基于华为云智慧生活生态链设计的智能鱼缸

一. 引言 1.1 项目背景 随着智能家居技术的发展和人们对高品质生活的追求日益增长,智能鱼缸作为一种结合了科技与自然美的家居装饰品,正逐渐成为智能家居领域的新宠。本项目旨在设计一款基于华为云智慧生活生态链的智能鱼缸,它不仅能够提供…

BugReport中的网络差现象

一、摘要 当出现网络不好时(日志关键字“process data stall”),会出现com.android.networkstack.process 后台进程联网访问“http://www.google.cn/generate_204”进行网络检测的行为,会额外带来功耗电流。遇到这种情况,主要是环境因素&…

Echarts图表柱状图基本用法(横向、纵向、柱宽度、圆角、图表渐变色、图表滚动条、图例样式等)

效果图: JS: function chart(){var chartDom document.getElementById(这里写div的id名称);var myChart echarts.init(chartDom);var option;myChart.clear();//图表清除,用于更新数据重新加载图表option {//编辑图表整体布局宽、高等等grid:{top:20…

Android基于gradle task检查各个module之间资源文件冲突情况

做组件化开发的时候,我们经常会遇到各个不同的module之间资源文件冲突的问题,运行也不报错,但是会出现覆盖的问题,导致运行之后发送错误的效果。 所以我们需要利用一个gradlke 脚本task,来自动化检查资源文件冲突。 …

腾讯云-云直播

云直播(Cloud Streaming Services)为您提供极速、稳定、专业的直播云端处理服务,根据业务中不同直播场景的需求,云直播提供标准直播、快直播、慢直播和云导播台服务,分别针对大规模实时观看、高并发推流录制及超低延时…

Jenkins配置流水线任务-实践操作(Pipeline-script)

Jenkins配置流水线任务-实践操作(Pipeline-script) 1、新增jenkins 任务,选择流水线 2、参数化 3、流水线配置 pipeline {agent anystages {stage(aoePlugin_mysql) {steps {echo "xxx,数据库:Mysql"echo "${HOST},${USER_NAME}"b…

AGI|如何构建一个RAG应用?入门新手攻略!

目录 一、概述 二、过程概述 三、如何优化提问? 四、路由和高级查询 五、丰富索引结构 六、重排序上下文 七、总结 一、概述 Retrieval Augmented Generation RAG 检索增强的内容生成。 从字面上来看检索只是一种手段途径,在人工智能领域中存在多种…

leetcode计数排序

计数排序(counting sort)通过统计元素数量来实现排序,通常应用于整数数组。 给定一个长度为 的数组 nums ,其中的元素都是“非负整数” def counting_sort(nums: list[int]):"""计数排序"""# 完整实…

从调用NCCL到深入NCCL源码

本小白目前研究GPU多卡互连的方案,主要参考NCCL和RCCL进行学习,如有错误,请及时指正! 内容还在整理中,近期不断更新!! 背景介绍 在大模型高性能计算时会需要用到多卡(GPU&#xf…

三勾点餐|后台页面更新

项目介绍 三勾点餐系统基于thinkphp8element-plusuniapp打造的面向开发的小程序商城,方便二次开发或直接使用,可发布到多端,包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。 功能说明…

从头开始的可视化数据 matplotlib:初学者努力绘制数据图

从头开始学习使用 matplotlib 可视化数据,对于初学者来说,可能会有些挑战,但 matplotlib 的核心理念非常清晰:绘制图表需要了解如何设置图形、坐标轴以及如何用数据填充它们。我们可以通过一些简单的例子来逐步介绍基本步骤。 1. …

代码审计笔记-PHP

PHP 1.php的弱类型 PHP 的“弱类型”是指在这门编程语言中,变量的类型在赋值时会被自动推断,而不是在变量声明时显式地指定类型。这意味着在 PHP 中,您可以将不同类型的值赋给同一个变量,而不需要进行类型转换或重新声明变量。 举…

基于Opencv中的DNN模块实现图像/视频的风格迁移

一、DNN模块的介绍 1、简介 OpenCV中的DNN(Deep Neural Network)模块是一个功能强大的组件,它支持深度学习网络模型的加载和推理。虽然DNN模块不提供模型的训练功能,但它可以与主流的深度学习框架(如TensorFlow、Caf…

并行 parallel broadcast partition pruning 分区裁剪 optimizer_dynamic_sampling=7

insert into abc 没有PDML所以不是全部并行 只有select 的情况 全部并行,没有 px send broadcast ,所以rows没从103M变成103*8M select *from A,B where A.Pkey B.Pkey and A.Pkey XX A B表都会进行分区裁剪 ----并行为什么更…

Linux操作系统——外存的管理(实验报告)

实验 Linux系统外存管理 一、实验目的 熟练Linux系统外存管理的方法与命令。 二、实验环境 硬件:PC电脑一台,网络正常。 配置:win10系统,内存大于8G 硬盘500G及以上。 软件:VMware、Ubuntu16.04。 三、实验内容 …

pymobiledevice3 xonsh-afc shell使用介绍

1、进入xonsh-afc shell: pymobiledevice3 apps afc bundle_id 2、进入shell后默认的目录是:[com.apple.mobile.house_arrest:/]$,这个目录是指定bundle_id的沙盒目录。 3、沙盒目录中如果包含带有空格的文件夹,直接使用cd App…