《三十》模块化打包构建工具 Rollup

news2024/11/18 11:38:01

19的2小时06分钟

Rollup 是一个 JavaScript 的模块化打包工具,可以帮助编译微小的代码到庞大的复杂的代码中(例如一个库或者一个应用程序)。

Rollup 和 Webpack 的区别:

  1. Rollup 也是一个模块化的打包工具,但是它主要是针对 ESModule 进行打包的(当然也有解决办法可以处理其他模块化代码);Rollup 更多时候是专注于处理 JavaScript 代码(当然也可以处理其他文件);配置理念相对于 Webpack 来说更加简洁和容易理解。
  2. Webpack 是一个模块化的打包工具,可以针对各种模块 代码;可以通过 Loader 处理各种类型的文件以及它们之间的依赖关系。

通常在实际开发中都会使用 Webpack,例如 React、Vue、Angular 项目都是基于 Webpack 的;在对库文件进行打包时,通过会使用 Rollup,例如 React、Vue、dayjs 源码本身都是基于 Rollup 的。

Rollup 的基本使用:

在命令行中使用 Rollup:

  1. 新建一个 rollup-demo 文件,运行 npm init -y 对其进行初始化。
  2. 安装 Rollup:npm install rollup -D
  3. 新建 src/index.js 文件,并编写代码。
    const sum = (num1, num2) => {
      console.log(num1 + num2)
    }
    export {
      sum
    }
    
  4. 运行 npx rollup ./src/index.js -o dist/index_esmodule.js 命令对 src/index.js 进行打包,输出到 dist//index_esmodule.js 中。
    请添加图片描述
  5. 运行 npx rollup ./src/index.js -f cjs -o dist/index_commonjs.js 命令,使用 CommonJS 的格式对 src/index.js 进行打包,输出到 dist/index_commonjs.js 中。
    请添加图片描述
  6. 运行 npx rollup ./src/index.js -f amd -o dist/index_commonjs.js 命令,使用 AMD 的格式对 src/index.js 进行打包,输出到 dist/index_amd.js 中。
    请添加图片描述
  7. 运行 npx rollup ./src/index.js -f iife -o dist/index_browser.js 命令,使用 AMD 的格式对 src/index.js 进行打包,输出到 dist/index_browser.js 中。
    请添加图片描述

使用 Rollup 的配置文件:

  1. 在项目的根目录下创建 rollup.config.js 配置文件,并编写配置。
    module.exports = {
      // 入口
      input: './src/index.js',
      // 出口。属性值可以是一个对象类型的数组,将会输出多个结果;也可以是一个对象,只输出一个结果
      output: [
        {
          file: 'dist/index_esmodule.js'
        },
        {
          format: 'umd',
          // 一旦导出为 UMD 格式,就必须指定 name 名称
          name: 'utils',
          file: 'dist/index_umd.js'
        },
      ]
    }
    
  2. 运行 npx rollup -c 进行打包,会发现打包输出出了两种格式的文件。
    请添加图片描述

使用 Rollup 打包 CommonJS 语法的代码:

Rollup 主要是针对 ESModule 的,如果代码存在 CommonJS 语法,虽然仍然可以打包成功,但是无法识别并对其进行处理。

  1. 新建 src/js/format.js 文件并编写代码。
    const dateFormat = () => {
      return '2000-10-10'
    }
    
    module.exports = {
      dateFormat
    }
    
  2. 新建 src/index.js 文件并编写代码。
    const {dateFormat} = require('./js/format')
    console.log(dateFormat())
    
  3. 新建 src/index.html 文件并编写代码。
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    <body>
      <!-- 引入打包后的 JavaScript 文件 -->
      <script src="../dist/index.js"></script>
    </body>
    </html>
    
  4. 新建 rollup.config.js 文件并编写配置信息。
    module.exports = {
      input: './src/index.js',
      output:{
        file: 'dist/index.js'
      }
    }
    
  5. 运行 npx rollup -c 命令进行打包,会发现,rollup 仍然可以打包成功,但是在浏览器中运行会报错,因为浏览器不认识 require() 语法。
    请添加图片描述
    请添加图片描述
  6. 安装 @rollup/plugin-commonjs 插件使 Rollup 能够识别并转换代码中的 CommonJS 语法:npm install @rollup/plugin-commonjs -D
  7. rollup.config.js 文件中修改配置信息。
    // 引入 commonjs 插件
    const commonjs = require("@rollup/plugin-commonjs")
    
    module.exports = {
      input: './src/index.js',
      output:{
        file: 'dist/index.js'
      },
      // 使用 commonjs 插件
      plugins: [
        commonjs()
      ]
    }
    
  8. 修改 src/index.js 文件中的导入语法,导入时仍然需要使用 ESModule 语法,否则还是会报错。

    目的是为了保证开发者自己编写的代码仍然使用 ESModule 语法,同时兼容第三方库中使用 CommonJS 语法。因此导出允许使用 CommonJS,但是导入必须使用 ESModule。

    import {dateFormat} from './js/format.js'
    
    console.log(dateFormat())
    
  9. 运行 npx rollup -c 命令进行打包,会发现,rollup 可以打包成功,并且在浏览器中也可以成功运行。
    请添加图片描述
    请添加图片描述
  10. npm install lodash -D 安装 lodash,并在 src/index.js 文件中引入使用。会发现使用第三方库还是有问题,lodash 的源码并没有被打包进输出的文件中,在浏览器中运行也报错了。这是因为如果导入的库来自 node_modules 的话,还需要使用另一个插件。
    请添加图片描述
    请添加图片描述
  11. 安装 @rollup/plugin-node-resolve 插件来处理导入来自 node_modules 的依赖:npm install @rolluop/plugin-node-resolve -D
  12. rollup.config.js 文件中修改配置信息。
    const commonjs = require("@rollup/plugin-commonjs")
    // 引入 resolve 插件
    const resolve = require('@rollup/plugin-node-resolve') 
    
    module.exports = {
      input: './src/index.js',
      output:{
        file: 'dist/index.js'
      },
      // 使用 resolve 插件
      plugins: [
        commonjs(),
        resolve()
      ]
    }
    
  13. 运行 npx rollup -c 命令进行打包,会发现,rollup 可以打包成功,并且在浏览器中也可以成功运行。
    请添加图片描述

请添加图片描述

使用 Rollup 转换 ES+ 语法的代码:

  1. 新建 src/index.js文件,并编写代码。

    const fn = () => {
      console.log('index')
    }
    fn()
    
  2. 新建 rollup.config.js文件,并编写配置信息。

    module.exports = {
      input: './src/index.js',
      output:{
        file: 'dist/index.js'
      },
    }
    
  3. 运行 npx rollup -c 命名进行打包,会发现,打包输出的文件中并没有对 ES6+ 语法进行转换。
    在这里插入图片描述

  4. 安装 @rollup/plugin-babel 插件对 ES6+ 代码进行转换:npm install @rollup/plugin-babel -D

  5. 安装 Bable 的核心:npm install @babel/core -D

  6. 安装 Bable 中的预设:npm install @babel/preset-env -D

  7. 修改 rollup.config.js 文件中的配置信息。

    // 引入 Babel 插件
    const babel = require('@rollup/plugin-babel')
    
    module.exports = {
      input: './src/index.js',
      output:{
        file: 'dist/index.js'
      },
      plugins: [
        // 使用 Babel 插件
        babel({
          babelHelpers: 'bundled',
        }),
      ]
    }
    
  8. 新建 babel.config.js 文件,并编写 Babel 的配置信息。

    module.exports = {
      presets: [
        '@babel/preset-env',
      ]
    }
    
  9. 运行 npx rollup -c 命名进行打包,会发现,打包输出的文件中对 ES6+ 语法进行了转换。
    在这里插入图片描述

使用 Rollup 对打包后的 JavaScript 代码进行压缩:

  1. 新建 ·src/index.js 文件,并编写代码。

    const fn = (num1, num2) => {
      console.log(num1, num2)
      return num1 + num2
    }
    const result = fn(10, 20)
    console.log(result)
    
  2. 新建 rollup.config.js 文件,并编写配置信息。

    module.exports = {
      input: './src/index.js',
      output:{
        file: 'dist/index.js'
      },
    }
    
  3. 运行 npx rollup -c 命名进行打包,会发现,打包输出的文件中并没有对 JavaScript 代码进行压缩。
    在这里插入图片描述

  4. 安装 @rollup/plugin-terser 插件用来对打包后的 JavaScript 代码进行压缩 :npm install @rollup/plugin-terser -D

  5. 修改 rollup.config.js 文件中的配置信息。

    // 引入 terser 插件
    const terser = require('@rollup/plugin-terser')
    
    module.exports = {
      input: './src/index.js',
      output:{
        file: 'dist/index.js'
      },
      plugins: [
        // 使用 terser 插件
        terser()
      ]
    }
    
  6. 运行 npx rollup -c 命名进行打包,会发现,打包输出的文件中对 JavaScript 代码进行了压缩。
    在这里插入图片描述

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

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

相关文章

JUnit 之初体验

文章目录 1.定义2.引入1&#xff09;使用 Maven 工具2&#xff09;使用 Gradle 工具3&#xff09;使用 Jar 包 2.样例0&#xff09;前提1&#xff09;测试类2&#xff09;测试方法3&#xff09;测试断言4&#xff09;实施 总结 1.定义 JUnit 是一个流行的 Java 单元测试框架&a…

精选Axure原型设计模板,RP原型组件库(PC端移动端元件库及Axure函数及运算符说明)

好的原型组件会大大的提高产品经理的工作效率&#xff0c;小7在陆续整理、精选Axure 8的原型设计模板&#xff0c;包含了原型设计的常用元素和AxureRP 8函数及运算符的说明文档&#xff0c;及各种设备模板框架。 本文也是基于小7另一篇文章的补充&#xff0c;更多更详细的资料…

C++编程法则365天一天一条(24)RTTI运行时类型信息typeid和type_info

文章目录 基本用法编译时或运行时判定 基本用法 typeid 是 C 的一个运算符&#xff0c;它用于获取表达式的类型信息。它返回一个 std::type_info 对象引用&#xff0c;该对象包含有关表达式的类型的信息。 要使用 typeid 运算符&#xff0c;需要包含 <typeinfo> 头文件…

FPGA 低延时 TCP UDP IP协议栈兼容1G 10G 25G MAC

在计算和数据中心、军事和航天、政府、仪器与测量、金融服务和广播和视频等行业&#xff0c;需要高可靠性的硬件和软件产品&#xff0c;帮助客户更快地开发部署新一代产品&#xff0c;减少技术和市场风险&#xff0c;我司研发的低延迟TCP/IP的IP核的传输速率高于传统网口&#…

二十一章总结

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmission…

Nginx基础篇:Nginx搭建、Nginx反向代理、文件服务器部署配置。

Nginx Linux系统安装以及反向代理的配置 简介优点nginx 环境安装常用Nginx 命令nginx 文件服务器搭建 简介 Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点…

AI:94-基于深度学习的微小目标检测与定位

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的核心代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新…

目标检测、目标跟踪、重识别

文章目录 环境前言项目复现特征提取工程下载参考资料 环境 ubuntu 18.04 64位yolov5deepsortfastreid 前言 基于YOLOv5和DeepSort的目标跟踪 介绍过针对行人的检测与跟踪。本文介绍另一个项目&#xff0c;结合 FastReid 来实现行人的检测、跟踪和重识别。作者给出的2个主…

Dantzig-Wolfe分解

参考资料&#xff1a;Introduction to Linear Programming&#xff0c; Dimitris Bertsimas etc 这篇博客是个人笔记的电子版(●ˇ∀ˇ●)&#xff0c;希望之后的自己也能看懂吧 在这本教材的Dantzig-Wolfe分解章节中&#xff0c;作者主要列举了两个小例子&#xff0c;结合坐标…

深入理解Os--调用劫持

1.调用劫持 以Linux系统为例&#xff0c;介绍三种可实现调用劫持的技术。 1.1.编译时调用劫持 以一个实例展开介绍 (1).main.cpp #include <stdio.h> #include <malloc.h> int main() {int* p (int*)malloc(32);free(p);return (0); }(2).mymalloc.cpp #inclu…

30、卷积 - 参数 stride 的作用

在卷积运算中,还有一个参数叫做 stride,它对卷积的运算以及运算结果影响也很大。 还是先看卷积动图,从图上你能猜到 stride 参数在哪吗? 在卷积操作中,stride 指的是卷积核在滑动过程中每次跳过的像素数量。 stride 决定了卷积核在输入图像上移动的速度。例如,如果 str…

【Angular 开发】Angular 信号的应用状态管理

自我介绍 做一个简单介绍&#xff0c;年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【架构…

STM32基于USB串口通信应用开发

✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进&#xff0c; 代码获取、问题探讨及文章转载可私信。 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 &#x1f34e;获取更多嵌入式资料可点击链接进群领取&#xff0c;谢谢支持&#xff01;…

使用selenium的edge浏览器登录某为

互联网上基本都是某哥的用法&#xff0c;其实edge和某哥的用法是一样的就有一下参数不一样。 一、运行环境 Python&#xff1a;3.7 Selenium&#xff1a;4.11.2 Edge&#xff1a;版本 120.0.2210.61 (正式版本) (64 位) 二、执行代码 from time import sleepfrom selenium…

Course2-Week4-决策树

Course2-Week4-决策树 文章目录 Course2-Week4-决策树1. 决策树的直观理解2. 构建单个决策树2.1 熵和信息增益2.2 构建决策树——二元输入特征2.3 构建决策树——多元输入特征2.4 构建决策树——连续的输入特征2.5 构建回归树——连续的输出结果(选修)2.6 代码实现-递归构建单个…

基于K-means与CNN的遥感影像分类方法

基于K-means与CNN的遥感影像分类 一、引言 1.研究背景 航天遥感技术是一种通过卫星对地观测获取遥感图像信息数据的技术&#xff0c;这些图像数据在各领域都发挥着不可或缺的作用。遥感图像分类主要是根据地面物体电磁波辐射在遥感图像上的特征&#xff0c;判断识别地面物体的属…

BUUCTF pwn rip WriteUp

文件分析 下载附件&#xff0c;分析文件 可以看到是64位ELF文件&#xff0c;elf可以理解为Linux中的可执行文件&#xff0c;就像Windows中的exe文件 用ida打开文件 查看main函数的伪代码&#xff0c;可以看到有一个15位的字符数组&#xff0c;该数组通过gets函数传值 还有一…

Jupyter notebook修改背景主题

打开Anaconda Prompt&#xff0c;输入以下内容 1. pip install --upgrade jupyterthemes 下载对应背景主题包 出现Successfully installed jupyterthemes-0.20.0 lesscpy-0.15.1时&#xff0c;说明已经下载安装完成 2. jt -l 查看背景主题列表 3. jt -t 主题名称&#xff08;…

AI:92-基于深度学习的红外图像人体检测

🚀 本文选自专栏:人工智能领域200例教程专栏 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的核心代码,详细讲解供大家学习,希望可以帮到大家。欢迎订阅支持,正在不断更新…

SQL命令---修改字段的数据类型

介绍 使用sql语句修改字段的数据类型。 命令 alter table 表明 modify 字段名 数据类型;例子 有一张a表&#xff0c;表里有一个id字段&#xff0c;长度为11。使用命令将长度修改为12 下面使用命令进行修改&#xff1a; alter table a modify id int(12) NOT NULL;下面使修…