《三十》模塊化打包構建工具 Rollup

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.pswp.cn/news/211110.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211110.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211110.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

排序:非遞歸的快排

目錄 非遞歸的快排&#xff1a; 代碼分析&#xff1a; 代碼演示&#xff1a; 非遞歸的快排&#xff1a; 眾所周知&#xff0c;遞歸變成非遞歸&#xff0c;而如果還想具有遞歸的功能&#xff0c;那么遞歸的那部分則需要變成循環來實現。 而再我們的排序中&#xff0c;我們可…

深入理解asyncio:異步編程的基礎用法

引言&#xff1a; 隨著計算機硬件的不斷發展&#xff0c;對于異步編程的需求也越來越強烈。Python中的asyncio模塊為開發者提供了一種強大而靈活的異步編程方式。本文將介紹asyncio的基礎用法&#xff0c;包括async/await/run語句的使用、多個協程的并發執行、以及在協程中進行…

Let和Var的區別

一&#xff1a;區別 Let不能重復聲明&#xff0c;且必須先聲明再調用&#xff1b; 但也可以只聲明不賦值&#xff0c;默認賦值undefined&#xff1b; 二&#xff1a;實例 let x 10; let x 20; // 這里將會報錯&#xff0c;因為 x 已經被聲明過了 console.log(y); let b …

Azure Machine Learning - 使用 Azure OpenAI 服務生成圖像

在瀏覽器/Python中使用 Azure OpenAI 生成圖像&#xff0c;圖像生成 API 根據文本提示創建圖像。 關注TechLead&#xff0c;分享AI全維度知識。作者擁有10年互聯網服務架構、AI產品研發經驗、團隊管理經驗&#xff0c;同濟本復旦碩&#xff0c;復旦機器人智能實驗室成員&#x…

【動態規劃】【廣度優先】LeetCode2258:逃離火災

作者推薦 本文涉及的基礎知識點 二分查找算法合集 動態規劃 二分查找 題目 給你一個下標從 0 開始大小為 m x n 的二維整數數組 grid &#xff0c;它表示一個網格圖。每個格子為下面 3 個值之一&#xff1a; 0 表示草地。 1 表示著火的格子。 2 表示一座墻&#xff0c;你跟…

pytorch:YOLOV1的pytorch實現

pytorch&#xff1a;YOLOV1的pytorch實現 注&#xff1a;本篇僅為學習記錄、學習筆記&#xff0c;請謹慎參考&#xff0c;如果有錯誤請評論指出。 參考&#xff1a; 動手學習深度學習pytorch版——從零開始實現YOLOv1 目標檢測模型YOLO-V1損失函數詳解 3.1 YOLO系列理論合集(Y…

Redis對象類型檢測與命令多態

一. 命令類型 Redis中操作鍵的命令可以分為兩類。 一種命令可以對任意類型的鍵執行&#xff0c;比如說DEL&#xff0c;EXPIRE&#xff0c;RENAME&#xff0c;TYPE&#xff0c;OBJECT命令等。 舉個例子&#xff1a; #字符串鍵 127.0.0.1:6379> set msg "hello world&…

第76講:MySQL數據庫中常用的命令行工具的基本使用

文章目錄 1.mysql客戶端命令工具2.mysqladmin管理數據庫的客戶端工具3.mysqlbinlog查看數據庫中的二進制日志4.mysqlshow統計數據庫中的信息5.mysqldump數據庫備份工具6.mysqllimport還原備份的數據7.source命令還原SQL類型的備份文件 MySQL數據庫提供了很多的命令行工具&#…

python 畫條形圖(柱狀圖)

目錄 前言 基礎介紹 月度開支的條形圖 前言 條形圖&#xff08;bar chart&#xff09;&#xff0c;也稱為柱狀圖&#xff0c;是一種以長方形的長度為變量的統計圖表&#xff0c;長方形的長度與它所對應的變量數值呈一定比例。 當使用 Python 畫條形圖時&#xff0c;通常會使…

python代碼:如何控制一個exe程序只能執行一次

import ctypes import sys def is_program_running(): # 創建互斥體 mutex_name "Global\\MonitorClientMutex" h_mutex ctypes.windll.kernel32.CreateMutexW(None, False, mutex_name) # 檢查互斥體是否已經存在 if ctypes.windll.kernel32.Get…

Centos7.9安裝谷歌【解決依賴問題】

安裝過程 mkdir /home/app cd /home/app wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpmyum install -y redhat-lsb-core-4.0-7.el6.centos.x86_64 yum install -y libX11-devel --nogpg yum install -y cmake gcc gcc-c gtk-devel gim…

vscode 編譯運行c++ 記錄

一、打開文件夾&#xff0c;新建或打開一個cpp文件 二、ctrl shift p 進入 c/c配置 進行 IntelliSense 配置。主要是選擇編譯器、 c標準&#xff0c; 設置頭文件路徑等&#xff0c;配置好后會生成 c_cpp_properties.json&#xff1b; 二、編譯運行&#xff1a; 1、選中ma…

zabbix 通過 odbc 監控 mssql

1、環境 操作系統&#xff1a;龍蜥os 8.0 zabbix&#xff1a;6.0 mssql&#xff1a;2012 2、安裝odbc 注意&#xff1a;需要在zabbix server 或者 zabbix proxy 安裝 odbc驅動程序 dnf -y install unixODBC unixODBC-devel3、安裝mssql驅動程序 注意&#xff1a;我最開始嘗試…

Tomcat管理功能使用

前言 Tomcat管理功能用于對Tomcat自身以及部署在Tomcat上的應用進行管理的web應用。在默認情況下是處于禁用狀態的。如果需要開啟這個功能&#xff0c;需要配置管理用戶&#xff0c;即配置tomcat-users.xml文件。 &#xff01;&#xff01;&#xff01;注意&#xff1a;測試功…

react 學習筆記 李立超老師 | (學習中~)

文章目錄 react學習筆記01入門概述React 基礎案例HelloWorld三個API介紹 JSXJSX 解構數組 創建react項目(手動)創建React項目(自動) | create-react-app事件處理React中的CSS樣式內聯樣式 | 內聯樣式中使用state (不建議使用)外部樣式表 | CSS Module React組件函數式組件和類組…

【數據結構和算法】反轉字符串中的單詞

其他系列文章導航 Java基礎合集數據結構與算法合集 設計模式合集 多線程合集 分布式合集 ES合集 文章目錄 其他系列文章導航 文章目錄 前言 一、題目描述 二、題解 2.1 方法一&#xff1a;雙指針 2.2 方法二&#xff1a;分割 倒序 三、代碼 3.1 方法一&#xff1a;雙…

不同品牌的手機如何投屏到蘋果MacBook?例如小米、華為怎樣投屏比較好?

習慣使用apple全家桶的人當然知道蘋果手機或iPad可以直接用airplay投屏到MacBook。 但工作和生活的多個場合里&#xff0c;并不是所有人都喜歡用同一品牌的設備&#xff0c;如果同事或同學其他品牌的手機需要投屏到MacBook&#xff0c;有什么方法可以快捷實現&#xff1f; 首先…

1 億個數據取出最大前 100 個有什么方法?

1 億個數據取出最大前 100 個有什么方法&#xff1f; 大家好&#xff0c;這是一道經常在面試中被遇到的一個問題&#xff0c;我之前面試也是被問到過得&#xff0c;現在一起學習下&#xff0c;下次再被問到就可以輕松地用對。 在計算機科學和數據處理領域&#xff0c;我們經常…

【GDB】

GDB 1. GDB調試器1.1 前言1.2 GDB編譯程序1.3 啟動GDB1.4 載入被調試程序1.5 查看源碼1.6 運行程序1.7 斷點設置1.7.1 通過行號設置斷點1.7.2 通過函數名設置斷點1.7.3 通過條件設置斷點1.7.4 查看斷點信息1.7.5 刪除斷點 1.8 單步調試1.9 2. GDB調試core文件2.1 設定core文件的…

(五)五種最新算法(SWO、COA、LSO、GRO、LO)求解無人機路徑規劃MATLAB

一、五種算法&#xff08;SWO、COA、LSO、GRO、LO&#xff09;簡介 1、蜘蛛蜂優化算法SWO 蜘蛛蜂優化算法&#xff08;Spider wasp optimizer&#xff0c;SWO&#xff09;由Mohamed Abdel-Basset等人于2023年提出&#xff0c;該算法模型雌性蜘蛛蜂的狩獵、筑巢和交配行為&…