rollup学习笔记

一直使用的webpack,最近突然想了解下rollup,就花点时间学习下.

一,什么是rollup?

rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,比如我们的es6模块化代码,它就可以进行tree shaking,将无用代码进行清除,打包出精简可运行的代码包.
业务开发项目的时候,我们一般是使用的webpack,它的功能更全面,但是如果我们只是为了打包js库之类的代码,那么使用rollup更为方便.

二,快速开始

2.1,安装

npm install --global rollup

创建入口文件:

mkdir src
touch src/main.js

编写入口文件内容main.js:

import foo from "./foo.js";
export default function () {
  console.log(foo);
}

同样在src下创建foo.js文件,然后编写foo.js文件内容:

export default {
    say:'hello world'
}

项目根目录下新增文件 rollup.config.js(看你怎么写的,如果是export default这种es6的写法,就用mjs结尾或者在package.json文件中指明type:‘module’)

export default {
    input: "src/main.js",
    output: {
      file: "bundle.js",
      format: "cjs",
    },
  };

2.2,打包

在控制台执行

rollup -c

就可以生成boundle.js:

'use strict';
var foo = "hello world!";
function main () {
  console.log(foo);
}
module.exports = main;

三,使用第三方npm类库

如果我们使用的是第三方类库,则有两点东西需要考虑处理.
安装lodash:

npm i lodash

先修改main.js文件,引入使用lodash.

import foo from "./foo.js";
import { isString } from 'lodash-es';
console.log(isString("hello"))
export default function () {
  console.log(foo);
}

3.1,@rollup/plugin-commonjs将commonjs转es模块

这个插件的作用就是将 CommonJS 模块转换为 ES 模块,以便在 Rollup 中进行打包。使用 @rollup/plugin-commonjs,你可以在 Rollup 中引入和使用来自 npm 包的 CommonJS 模块,而无需手动进行转换。这个插件还支持一些高级功能,比如解析动态导入语法和处理循环依赖。通过在 Rollup 配置文件中添加 @rollup/plugin-commonjs,你可以更方便地使用 Rollup 打包项目中的 CommonJS 模块。
安装:

npm install @rollup/plugin-commonjs --save-dev

使用:

import commonjs from '@rollup/plugin-commonjs'
export default {
    input: "src/main.js",
    output: {
      file: "bundle.js",
      format: "esm",
    },
    plugins: [commonjs()],
  };

修改main.js和打包后是这样的:
在这里插入图片描述

3.2,使用@rollup/plugin-node-resolve解析Node.js模块

安装插件:

npm i @rollup/plugin-node-resolve --save-dev

修改rollup配置:

import { nodeResolve } from "@rollup/plugin-node-resolve";
import commonjs from '@rollup/plugin-commonjs'
export default {
    input: "src/main.js",
    output: {
      file: "bundle.js",
      format: "esm",
    },
    plugins: [nodeResolve(),commonjs()]
  };

这时候打包的效果在这里插入图片描述
这时候,可以看到,lodash引入使用的string方法被直接搞出来,放到bundle.js中去了.
有些场景下,虽然我们使用了 resolve 插件,但可能我们仍然想要某些库保持外部引用状态,这时我们就需要使用 external 属性,来告诉 rollup.js 哪些是外部的类库。
这就需要external属性.
修改rollup配置:

import { nodeResolve } from "@rollup/plugin-node-resolve";
import commonjs from '@rollup/plugin-commonjs'
export default {
    input: "src/main.js",
    output: {
      file: "bundle.js",
      format: "esm",
    },
    plugins: [nodeResolve(),commonjs()],
    external: ["lodash-es"],
  };

这时候打包出来的bundle就又会变成这样:
在这里插入图片描述

四,多产物配置

我们可以将 output 改造成一个数组,对外暴露出不同格式的产物供他人使用,不仅包括 ESM,也需要包括诸如CommonJS、UMD等格式,保证良好的兼容性:
修改rollup配置文件:

import { nodeResolve } from "@rollup/plugin-node-resolve";
import commonjs from '@rollup/plugin-commonjs'
export default {
    input: "src/main.ts",
    output: [
      {
        file: 'dist/bundle-iife.js',
        format: 'iife'
      },
      {
        file: 'dist/bundle-esm.js',
        format: 'esm'
      },
      {
        file: 'dist/bundle-cjs.js',
        format: 'cjs'
      },
      {
        file: 'dist/bundle-umd.js',
        format: 'umd',
        name: 'bundle'
      }
    ],
    plugins: [nodeResolve(),commonjs()],
    external: ["lodash-es"],
 };

这样打包出来就是dist下多个产物.

五,引入typescript

要使用typescript就需要依赖这个插件,当然这个插件本身还依赖了typescript和tslib,因此我们需要导入3个包:

npm i typescript tslib @rollup/plugin-typescript -D

然后修改rollup配置为:

import { nodeResolve } from "@rollup/plugin-node-resolve";
import commonjs from '@rollup/plugin-commonjs'
import typescript from '@rollup/plugin-typescript';
export default {
    input: ["src/main.ts"],
    output: [
      {
        file: 'dist/bundle-iife.js',
        format: 'iife'
      },
      {
        file: 'dist/bundle-esm.js',
        format: 'esm'
      },
      {
        file: 'dist/bundle-cjs.js',
        format: 'cjs'
      },
      {
        file: 'dist/bundle-umd.js',
        format: 'umd',
        name: 'bundle'
      }
    ],
    plugins: [
      typescript(),
      nodeResolve(),
      commonjs()
    ],
    external: ["lodash-es"],
 };

就可以看到打包的效果:
在这里插入图片描述

六,使用压缩插件

安装

npm install @rollup/plugin-terser --save-dev

使用:

import terser from '@rollup/plugin-terser';

export default {
  input: 'src/index.js',
  output: {
    dir: 'output',
    format: 'cjs'
  },
  plugins: [terser()]
};

得到的结果解释压缩了空格回车之类的精简代码.

七,使用rollup-plugin-dts生成ts配置文件

在前端开发中,我们经常需要将 TypeScript 代码转换为 JavaScript 以便在浏览器或 Node.js 环境下运行,而 rollup 是一个强大的打包工具,用于将代码库打包为一个或多个 bundle。但是,当我们希望使用 TypeScript 编写 npm 包并将其发布到 npm 时,我们需要为我们的包创建 .d.ts(TypeScript类型定义)文件,以允许 TypeScript 用户在其代码中正确使用我们的包。这时候我们就可以使用 rollup-plugin-dts 了,该插件可以帮助我们自动生成 .d.ts 文件。
安装:

npm install --save-dev rollup-plugin-dts

配置修改:

import { dts } from "rollup-plugin-dts";
export default {
    plugins: [
    	dts()
    ]
 };

实现的效果是dist输出目录下多生成了一个名为dts的文件夹.里面就是ts的类型定义:

/**
 * 深拷贝
 * @param obj 需要深拷贝的对象
 * @returns 深拷贝对象
 */
export declare const deepClone: <T>(obj: T) => T;
export declare const getRandomNum: (min: number, max: number) => number;

八,使用@rollup/plugin-html生成html并引用打包文件

可以使用@rollup/plugin-html生成html,并引用打包文件.
安装

npm i @rollup/plugin-html. -S

使用方式

import html from '@rollup/plugin-html'
export default {
    input: ["src/main.ts"],
    output: [
      {
        file: 'dist/bundle-cjs.js',
        format: 'cjs'
      }
    ],
    plugins: [
      html({
        title: "LeaferJS",
        meta: [{charset: 'utf-8'}, {name: 'viewport', content: 'width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no'}]
      }),
    ],
    external: ["lodash-es"],
 };

这样打包之后,就可以在dist目录下生成一个html文件了.

九,使用rollup-plugin-serve 插件来生成静态服务器

Rollup 还可以作为开发服务器来使用。安装 rollup-plugin-serve 插件:
安装:

npm install rollup-plugin-serve --save-dev

使用:

import serve from 'rollup-plugin-serve';
plugin中配置:
serve({
        contentBase: ['dist'],
        port: 9000
})

这个配置使用 rollup-plugin-serve 插件启动了一个本地服务器,将端口号设置为 8080,并指定静态文件根目录为 dist 文件夹。
现在我们可以在终端中运行以下命令来启动 Rollup 开发服务器:

rollup -c -w

这个命令将 Rollup 配置文件传递给 Rollup 命令行工具,并启用监视模式 -w,使 Rollup 可以监听文件变化并重新构建源代码和输出代码。一旦命令运行成功,我们就可以在浏览器中访问 http://localhost:8080 来查看我们的应用程序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Linux] 系统管理

全局配置文件 用户个性化配置 配置文件的种类 alias命令和unalias命令 进程管理 进程表

AI视频智能监管赋能城市管理:打造安全有序的城市环境

一、方案背景 随着城市化进程的加速和科技的飞速发展&#xff0c;街道治安问题日益凸显&#xff0c;治安监控成为维护社会稳定和保障人民安全的重要手段。当前&#xff0c;许多城市已经建立了较为完善的治安监控体系&#xff0c;但仍存在一些问题。例如&#xff0c;监控设备分…

基于PHP的奶茶商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的奶茶商城系统 一 介绍 此奶茶商城系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;ajax实现数据交换。系统角色分为用户和管理员。系统在原有基础上添加了糖度的选择。 技术栈 phpmysqlajaxphpstudyvscode 二 功能 用户…

深入了解RTMP推流技术:视频汇聚EasyCVR低延迟与高稳定性分析

RTMP&#xff08;Real Time Messaging Protocol&#xff09;视频推流技术&#xff0c;作为音视频传输领域的关键技术之一&#xff0c;已经在直播、视频会议、在线教育等多个场景中得到了广泛应用。RTMP以其独特的优势&#xff0c;为实时音视频传输提供了高效、稳定的解决方案。…

前端框架中的路由(Routing)和前端导航(Front-End Navigation)

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介前端框架中的路由&#xff08;Routing&#xff09;和前端导航&#xff08;Front-End Navigation&#xff09;1. 路由&#xff08;Routing&#xff09;1.1 定义1.2 路由的核心概念1.2.1 路由表&#xff08;Route Table&#xff09;1…

Renesas MCU之IO应用介绍

目录 概述 1 软硬件环境 1.1 软件版本信息 1.2 硬件接口介绍 2 FSP配置项目 2.1 项目参数配置 2.2 生成项目框架 3 IO OutPut功能 3.1 IO输出功能实现 3.2 IO输出功能测试代码 4 IO InPut功能 4.1 IO Input功能实现 4.2 测试代码实现 5 测试结果 概述 本文主要…

springboot应用cpu飙升的原因排除

1、通过top或者jps命令查到是那个java进程&#xff0c; top可以看全局那个进程耗cpu&#xff0c;而jps则默认是java最耗cpu的&#xff0c;比如找到进程是196 1.1 top (推荐)或者jps命令均可 2、根据第一步获取的进程号&#xff0c;查询进程里那个线程最占用cpu&#xff0c;发…

Redis的缓存击穿与解决

缓存击穿问题也叫热点Key问题&#xff0c;就是一个被高并发访问并且缓存重建业务较复杂的Key突然失效了&#xff0c;无数的请求访问会在瞬间给数据库带来巨大的冲击。 Redis实战篇 | Kyles Blog (cyborg2077.github.io) 目录 解决方案 互斥锁 实现 逻辑过期 实现 解决方案…

FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg

《FFmpeg开发实战&#xff1a;从零基础到短视频上线》一书的“第11章 FFmpeg的桌面开发”介绍了如何在Windows环境对Qt结合FFmpeg实现桌面程序&#xff0c;那么Windows系统通过Visual Studio开发桌面程序也是很常见的&#xff0c;下面就介绍如何在Visual Studio的C工程中集成F…

Day13—大语言模型

定义 大语言模型&#xff08;Large Language Models&#xff09;是一种基于深度学习的自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;用于处理和生成人类语言文本。 一、认识NLP 什么是NLP ​ NLP&#xff08;Natural Language Processing&#xff09;&#xff0…

Word2Vec基本实践

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

西木科技Westwood-Robotics人型机器人Bruce配置和真机配置

西木科技Westwood-Robotics人型机器人Bruce配置和真机配置 本文内容机器人介绍Bruce机器人Gazebo中仿真代码部署Bruce真机代码部署 本文内容 人形机器人Brcue相关介绍docker中安装Gazebo并使用Bruce机器人控制器更换环境配置 机器人介绍 公司&#xff1a;西木科技Westwood-R…

企业UDP文件传输工具测速的方式(下)

在前一篇文章中&#xff0c;我们深入讨论了UDP传输的基本概念和镭速UDP文件传输工具如何使用命令行快速进行速度测试。现在&#xff0c;让我们进一步探索更为高级和灵活的方法&#xff0c;即通过整合镭速UDP的动态或静态库来实现网络速度的测量&#xff0c;以及如何利用这一过程…

CVPR24最佳论文 | 谷歌:生成图像动力学

原文&#xff1a;Generative Image Dynamics 地址&#xff1a;https://generative-dynamics.github.io/ 代码&#xff1a;未知 出版&#xff1a;CVPR 2024 机构: 谷歌 1 研究问题 本文研究的核心问题是: 如何从单张静止图片生成逼真的长时间动态视频&#xff0c;同时支持用…

Socket 原理和思考

众所周知Reactor是一种非常重要和应用广泛的网络编程模式&#xff0c;而Java NIO是Reactor模式的一个具体实现&#xff0c;在Netty和Redis都有对其的运用。而不管上层模式如何&#xff0c;底层都是走的Socket&#xff0c;对底层原理的了解会反哺于上层&#xff0c;避免空中楼阁…

【数学建模】解析几何与方程模型

文章目录 解析几何与方程模型1.几何建模思想2.Numpy在线性代数中的使用3.国赛求解3.1题目3.2 问题1求解建立模型代码求解 3.3 问题2求解 4.问题答疑Q1:什么是行列式&#xff0c;其使用场景是什么行列式的定义行列式的性质行列式的使用场景 Q2:2023B题问题一用相似三角形求解覆盖…

htb_Editorial

hack the book Editorial 端口扫描 80 22 目录扫描 /upload 是一个上传book information的页面 其中最顶上有一个可以上传书本封面的地方&#xff0c;可以从本地上传&#xff0c;也可以从远程下载 这里可能涉及ssrf和本地文件上传&#xff0c;逐一尝试 随便上传一个图片…

使用高斯混合模型(GMM)进行猫狗音频聚类(Kaggle Audio Cats and Dogs)

Audio Cats and Dogs | Kaggle 目录 一、实验目标 二、数据分析 三、实验结果 四、改进方向 一、实验目标 数据集包括164个标注为猫的.wav文件&#xff0c;总共1323秒和113个标注为狗叫声的.wav文件&#xff0c;总共598秒&#xff0c;要求判别每个音频是狗叫还是猫叫 二、…

Spark SQL函数详解:案例解析(第8天)

系列文章目录 1- Spark SQL函数定义&#xff08;掌握&#xff09; 2- Spark 原生自定义UDF函数案例解析&#xff08;掌握&#xff09; 3- Pandas自定义函数案例解析&#xff08;熟悉&#xff09; 4- Apache Arrow框架案例解析&#xff08;熟悉&#xff09; 5- spark常见面试题…

Centos 配置安装Mysql

linux安装配置mysql的方法主要有yum安装和配置安装两种&#xff0c;由于yum安装比较简单&#xff0c;但是会将文件分散到不同的目录结构下面&#xff0c;配置起来比较麻烦&#xff0c;这里主要研究一下配置安装mysql的方法 1、环境说明 centos 7.9 mysql 5.7.372、环境检查 …