库打包工具 rollup

库打包工具 rollup


摘要

**概念:**rollup是一个模块化的打包工具

注:实际应用中,rollup更多是一个库打包工具

与Webpack的区别:

文件处理:

  • rollup 更多专注于 JS 代码,并针对 ES Module 进行打包
  • webpack 通常可以通过各种 loader 处理多种文件及其对应的依赖关系

应用场景:

  • 在实际项目开发中,通常使用webpack(比如react、angular项目都是基于webpack的)
  • 在对库文件进行打包时,通常会使用rollup(比如vue、react、dayjs源码本身都是基于rollup的,Vite底层使用Rollup)。



概念

官方对rollup的定义:

Rollup is a module bundler for JavaScript which compiles small pieces of code into something larger and more complex, such as a library or application.

Rollup是一个JavaScript的模块化打包工具,可以帮助我们编译小的代码到一个大的、复杂的代码中,比如一个库或者一个应用程序;

我们会发现Rollup的定义、定位和webpack非常的相似:

  • Rollup也是一个模块化的打包工具,但是Rollup主要是针对ES Module进行打包的,webpack则通常可以通过各种loader处理各种各样的文件,以及处理它们的依赖关系。
  • rollup更多时候是专注于处理JavaScript代码的(当然也可以处理css、font、vue等文件)。
  • rollup的配置和理念相对于webpack来说,更加的简洁和容易理解; 在早期webpack不支持tree shaking时,rollup具备更强的优势。

webpack和rollup各自的应用场景:

通常在实际项目开发中,我们都会使用webpack(比如react、angular项目都是基于webpack的)

在对库文件进行打包时,我们通常会使用rollup(比如vue、react、dayjs源码本身都是基于rollup的,Vite底层使用Rollup)。




Rollup的基本使用

安装rollup:

# 全局安装 
npm install rollup -g
# 局部安装 
npm install rollup -D

创建main.js文件,打包到bundle.js文件中:

参数:

-f : format

-f cjs // commonjs,支持node环境
-f iife // 立即执行函数表达式
-f amd // amd,支持amd环境
-f umd // umd,支持通用的模块化环境
# 打包浏览器的库 
npx rollup ./src/main.js -f iife -o dist/bundle.js # 打包AMD的库 
npx rollup ./src/main.js -f amd -o dist/bundle.js# 打包CommonJS的库 
npx rollup ./src/main.js -f cjs -o dist/bundle.js # 打包通用的库(必须跟上name) 
npx rollup ./src/main.js -f umd --name mathUtil -o dist/bundle.js

Case: 打包index为bundle.js

指令如下所示:

nathanchen@NathansMacBook-Pro rollup % npx rollup ./lib/index.js -f umd --name mathUtil -o dist/bundle.js./lib/index.js → dist/bundle.js...
created dist/bundle.js in 22ms

index.js

function foo() {console.log("foo excetion")
}export {foo
}

bundle.js

(function (global, factory) {typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :typeof define === 'function' && define.amd ? define(['exports'], factory) :(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.mathUtil = {}));
})(this, (function (exports) { 'use strict';function foo() {console.log("foo excetion");}exports.foo = foo;}));



Rollup的配置文件

我们可以将配置信息写到配置文件中rollup.config.js文件。

module.exports = {// 入口input: "./lib/index.js",// 出口output: {format: "umd",name: "nathanUtils",file: "./build/bundle.umd.js"},
}

执行命令即可,-c指的是使用配置文件:

npx rollup -c

我们可以对文件进行分别打包,打包出更多的库文件(用户可以根据不同的需求来引入)。

module.exports = {// 入口input: "./lib/index.js",// 出口output: [{format: "umd",name: "nathanUtils",file: "./build/bundle.umd.js"},{format: "amd",name: "nathanUtils",file: "./build/bundle.amd.js"},{format: "cjs",name: "nathanUtils",file: "./build/bundle.cjs.js"},{format: "iife",name: "nathanUtils",file: "./build/bundle.browser.js"},]
}



解决commonjs和第三方库问题

**问题背景:**引入第三方包,比如 Lodash,进行打包时,发现没有对 引入包 进行打包。

原因:

默认 lodash 没有被打包是因为它使用的是 commonjs,rollup默认情况下只会处理 ES Module

解决方案:

安装解决commonjs的库:

npm install @rollup/plugin-commonjs -D

安装解决node_modules的库:

npm install @rollup/plugin-node-resolve -D

npx rollup -c 进行打包即可,可以发现 Lodash 被打包进入 bundle.js

不过在实际应用中,我们一般排除打包依赖包,当用户使用时包时,让他们自己进行安装即可

rollup.config.js

module.exports = {output: [{format: "umd",name: "nathanUtils",file: "./build/bundle.umd.js",globals: {lodash: "_" // 给 lodash 全局命名为 _}},],external: ["lodash"],
}



Babel 转换代码

**需求:**如果我们希望将ES6转成ES5的代码,可以在rollup中使用babel。

安装rollup对应的babel插件:

npm install @rollup/plugin-babel -D

修改配置文件:

配置 rollup.config.js

配置 babelHelpers ,不让 Babel 处理 node_modules

// 使用代码转换和压缩
const babel = require('@rollup/plugin-babel')module.exports = {...plugins: [babel({babelHelpers: "bundled",exclude: /node_modules/})]
}

配置babel.config.js

module.exports = {presets: ["@babel/preset-env"]
}

产物:

打包前 babel.config.js

import { sum, mul } from './utils/math'const foo = () => {console.log("foo excetion")
}export {foo,sum,mul
}

打包后 bundle.js

(function (global, factory) {typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :typeof define === 'function' && define.amd ? define(['exports'], factory) :(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.mathUtil = {}));
})(this, (function (exports) { 'use strict';function sum(num1, num2) {return num1 + num2}function mul(num1, num2) {return num1 * num2}function foo() {console.log("foo excetion");}exports.foo = foo;exports.mul = mul;exports.sum = sum;}));



Teser 代码压缩

如果我们希望对代码进行压缩,可以使用@rollup/plugin-terser

npm install @rollup/plugin-terser -D

配置terser:babel.config.js

const terser = require('@rollup/plugin-terser')module.exports = {...plugins: [terser()]
}

打包后 bundle.js

!function(e,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((e="undefined"!=typeof globalThis?globalThis:e||self).nathanUtils={})}(this,(function(e){"use strict";e.foo=function(){console.log("foo excetion")},e.mul=function(e,n){return e*n},e.sum=function(e,n){return e+n}}));



处理css文件

如果我们项目中需要处理css文件,可以使用postcss:

npm install rollup-plugin-postcss postcss -D

配置postcss的插件:可以补充安装下 postcss-preset-env ,处理下样式兼容性问题

const postcss = require('rollup-plugin-postcss')module.exports = {...plugins: [postcss({ plugins: [require("postcss-preset-env")]})]
}



处理vue文件

处理vue文件我们需要使用rollup-plugin-vue插件

注意:默认情况下我们安装的是vue2.x的版本,所以我这里指定了一下rollup-plugin-vue的版本;

npm install rollup-plugin-vue @vue/compiler-sfc -D

使用vue的插件:vue()

打包vue报错:

在我们打包vue项目后,运行会报如下的错误:

Uncaught ReferenceError: process is not defined

这是因为在我们打包的vue代码中,用到 process.env.NODE_ENV,所以我们可以使用一个插件 rollup-plugin-replace 设置它对应的值:

npm install @rollup/plugin-replace -D

配置插件信息:

replace({'process.env.NODE_ENV': JSON.stringify('production')
})



搭建本地服务器

第一步:使用rollup-plugin-serve搭建服务

npm install rollup-plugin-serve -D

rollup.config.js

module.exports = {...plugins: [...serve({port: 8000,open: true,contentBase: '.' // 服务当前文件夹})]
}

第二步:当文件发生变化时,自动刷新浏览器

npm install rollup-plugin-livereload -D

第三步:启动时,开启文件监听

npx rollup -c -w

效果:

image.png




区分开发环境

我们可以在 package.json 中创建一个开发和构建的脚本:

"scripts": {"build": "rollup -c --environment NODE_ENV:production","serve": "rollup -c --environment NODE_ENV:development -w"
},

rollup.config.js

if (isProduction) {plugins.push(terser())
} else {const extraPlugins = [serve({port: 8000,open: true,contentBase: '.' // 服务当前文件夹}),]plugins.push(...extraPlugins)
}

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

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

相关文章

软件工程 软考

开发大型软件系统适用螺旋模型或者RUP模型 螺旋模型强调了风险分析,特别适用于庞大而复杂的、高风险的管理信息系统的开发。喷泉模型是一种以用户需求为动力,以对象为为驱动的模型,主要用于描述面向对象的软件开发过程。该模型的各个阶段没有…

“高级Java编程复习指南:深入理解并发编程、JVM优化与分布式系统架构“

我的个人主页 接下来我将方享四道由易到难的编程题,进入我们的JavaSE复习之旅。 1:大小写转换------题目链接 解题思路: 在ASCII码表中,⼤写字⺟A-Z的Ascii码值为65- 90,⼩写字⺟a-z的Ascii码值为97-122。每个字 ⺟…

基于Zynq FPGA对雷龙SD NAND的性能测试评估

文章目录 一、SD NAND特征1.1 SD卡简介1.2 SD卡Block图 二、SD卡样片三、Zynq测试平台搭建3.1 测试流程3.2 SOC搭建 四、软件搭建五、测试结果六、总结 一、SD NAND特征 1.1 SD卡简介 雷龙的SD NAND系列有多种型号,本次测试使用的是CSNP4GCR01-AMW和CSNP32GCR01-A…

使用AT指令通过ESP8266实现TCP/IP服务器的创建、发送数据和接收数据

1. 初始化ESP8266 首先,确保ESP8266模块进入AT指令模式。 AT 2. 设置ESP8266为STA或APSTA模式 首先,确保ESP8266处于正确的模式。为了创建TCP/IP服务器,通常需要设置为STA模式(连接到外部路由器)或APSTA模式&#x…

Springboot+Vue+mysql前后端分离的Java项目部署教程

参考了网上许多文章,有的使用的是nginx,eclipse,其实只要是数据库或者java的软件基本都大同小异。 本人使用phpstudy对项目进行部署,亲测有效。 需要的软件: 1.Node.js安装(ps:这一步我也不知道…

【MySQL】数据库整合攻略 :表操作技巧与详解

前言:本节内容讲述表的操作, 对表结构的操作。 是对表结构中的字段的增删查改以及表本身的创建以及删除。 ps:本节内容本节内容适合安装了MySQL的友友们进行观看, 实操更有利于记住哦。 目录 创建表 查看表结构 修改表结构 …

常用的c++新特性-->day03

断言和异常 断言断言的基本使用 静态断言静态断言的基本使用 异常异常基本使用c98异常案例 noexceptnoexcept简单案例 断言 断言的基本使用 #include <iostream> #include <cassert>// >>>>>>>>>>>>>>>> 断言的…

Python数据分析NumPy和pandas(二十七、数据可视化 matplotlib API 入门)

数据可视化或者数据绘图是数据分析中最重要的任务之一&#xff0c;是数据探索过程的一部分&#xff0c;数据可视化可以帮助我们识别异常值、识别出需要的数据转换以及为模型生成提供思考依据。对于Web开发人员&#xff0c;构建基于Web的数据可视化显示也是一种重要的方式。Pyth…

shell中执行hive指令以及hive中执行shell和hdfs指令语法

0. 简介 主要介绍了三种环境命令执行语法&#xff1a; shell中执行hive指令hive中执行shell指令hive中执行hdfs指令 1. shell中执行hive指令 语法&#xff1a;hive [-hiveconf xy]* [<-i filename>]* [<-f filename> | <-e query-string>] [-S] 说明&…

区块链技术入门:以太坊智能合约详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术入门&#xff1a;以太坊智能合约详解 区块链技术入门&#xff1a;以太坊智能合约详解 区块链技术入门&#xff1a;以太…

【若依框架】代码生成详细教程,15分钟搭建Springboot+Vue3前后端分离项目,基于Mysql8数据库和Redis5,管理后台前端基于Vue3和Element Plus,开发小程序数据后台

今天我们来借助若依来快速的搭建一个基于springboot的Java管理后台&#xff0c;后台网页使用vue3和 Element Plus来快速搭建。这里我们可以借助若依自动生成Java和vue3代码&#xff0c;这就是若依的强大之处&#xff0c;即便你不会Java和vue开发&#xff0c;只要跟着石头哥也可…

AI与OCR:数字档案馆图像扫描与文字识别技术实现与项目案例

文末有免费工具可在线体验&#xff0c;或者网络搜索关键词“思通开源AI能力平台” 一、扫描与图像预处理 技术实现过程 在纸质档案的数字化过程中&#xff0c;首先需要使用高精度扫描仪对纸质文档进行扫描&#xff0c;生成高清的数字图像。这一步骤是整个OCR流程的基础&#xf…

科学计算服务器:如何计算算力?如何提升科学研究效率?

在现代科学研究的舞台上&#xff0c;科学计算服务器犹如一位强大的幕后英雄&#xff0c;为复杂科学计算任务的攻克提供着坚实支撑。准确计算其算力并充分发挥优势&#xff0c;对提升科学研究效率意义非凡。 服务器的中央处理器&#xff08;CPU&#xff09;计算力。在科学计算服…

Python爬虫基础-正则表达式!

前言 正则表达式是对字符串的一种逻辑公式&#xff0c;用事先定义好的一些特定字符、及这些特定字符的组合&#xff0c;组成一个“规则的字符串”&#xff0c;此字符串用来表示对字符串的一种“过滤”逻辑。正在在很多开发语言中都存在&#xff0c;而非python独有。对其知识点…

【go从零单排】迭代器(Iterators)

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;迭代器的实现通常不是通过语言内置的迭代器类型&#x…

基于SpringBoot和Vue的公司文档管理系统设计与开发(源码+定制+开发)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

使用vite构建一个react网站,并部署到Netlify上

这篇教程中&#xff0c;我会教你如何用vite快速构建一个react网站&#xff0c;并把网站免费部署到Netlify上&#xff0c;让别人可以经由网址访问你的react网站。 1. 使用vite构建基础框架 npm create vitelatestcd vite-project npm install npm run dev2. 网站内容设计 3. 构…

青藤深度参编的终端安全国家标准正式发布

近日&#xff0c;国家市场监督管理总局、国家标准化管理委员会发布中华人民共和国国家标准公告&#xff0c;由TC260&#xff08;全国网络安全标准化技术委员会&#xff09;归口&#xff0c;公安部第三研究所牵头的GB/T 29240-2024《网络安全技术 终端计算机通用安全技术规范》&…

Python爬虫如何处理验证码与登录

Python爬虫如何处理验证码与登录 Python 爬虫在抓取需要登录的网站数据时&#xff0c;通常会遇到两个主要问题&#xff1a;登录验证和验证码处理。这些机制是网站用来防止自动化程序过度抓取数据的主要手段。本文将详细讲解如何使用 Python 处理登录与验证码&#xff0c;以便进…

Stream流(JAVA笔记第三十三期)

p.s.这是萌新自己自学总结的笔记&#xff0c;如果想学习得更透彻的话还是请去看大佬的讲解 目录 Stream流的使用步骤获取Stream流Stream流的中间方法Stream中的终结方法收集方法collect Stream流可以比作工厂的流水线 Stream流的概念 Stream流的使用步骤 先得到一条Stream流(…