库打包工具 rollup

使用TS+rollup打造一个npm工具库 说到Rollup,大家可能并不陌生,它是一款JS的模块打包器,适合对工具库和组件进行打包,将多个模块合并成单个文件,与Webpack,Browserify等不太一样,其对更小更快的库比较友好。此外,他可以生成ESM、CommonJS、AMD 和 UMD等输出格式,并且支持TS输入,可以检查TS类型及代码 阅读详情

库打包工具 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)
}
前端打包工具rollup、webpack、vite的区别 rollup更适合打包库,webpack更适合打包项目,vite基于rollup实现了热更新也适合打包项目。 阅读详情

相关推荐

K8S 1.28.2 + Calico 3.27.3 保姆级安装避坑指南:解决节点NotReady问题

本文提供了一份详细的Kubernetes 1.28.2与Calico 3.27.3集群部署指南,重点解决节点NotReady这一常见问题。通过版本兼容性分析、精细化环境配置、kubeadm初始化参数详解及Calico Operator部署,手把手指导用户避开网络插件配置陷阱,确保集群从NotReady状态恢复健康并稳定运行。

weixin_28835583的博客 394

一文带你搞定搭建自己的组件库Rollup

目前Vue和React都是采用rollup.js进行打包,我们在公司开发的时候也可以用rollup搭建一个自己的组件库放到你的项目中,简化项目的结构项目性能。接下来我将带你使用rollup从0——1搭建一个在vue中使用的组件库。

而世之奇伟、瑰怪,非常之观,常在于险远,而人之所罕至焉,故非有志者不能至也! 3264

个人信息保护合规审计人员(高级)能力考核试卷+面试模拟

《个人信息保护合规审计考试与面试指南》 摘要:本文提供个人信息保护合规审计考试及面试的全面指导。考试采用闭卷笔试形式,满分100分,合格线75分,时长120分钟,包含单选、多选、判断题及综合案例分析题。内容涵盖《个人信息保护法》核心条款、审计程序、风险评估等实务要点。面试环节采用情景模拟方式,重点考察应试者在压力下处理审计独立性、客户关系与监管要求的平衡能力,以及应对数据泄露等突发事件的处置流程。案例题聚焦大型互联网平台的数据收集、共享、跨境传输等高风险环节的合规审计,要求设计完整的审计方案框架。面试评分标

qq_41525079的博客 1142

rollup从入门到打包一个按需加载的组件库

rollup 是一个 JavaScript 模块打包器,在功能上要完成的事和webpack性质一样,就是将小块代码编译成大块复杂的代码,例如 library 或应用程序。在平时开发应用程序时,我们基本上选择用webpack,相比之下,rollup.js更多是用于library打包,我们熟悉的vue、react、vuex、vue-router等都是用rollup进行打包的。

qq_30436011的博客 2101

OpenCV实战:高效检测与识别多类型条码与二维码

本文详细介绍了如何利用OpenCV的BarcodeDetector和QRCodeDetector模块,高效实现EAN-13条形码与常见二维码的检测与识别。内容涵盖从环境搭建、单码识别到处理多二维码的完整流程,并分享了提升识别率的图像预处理与性能优化等实战技巧,帮助开发者一站式解决视觉项目中的条码识别需求。

weixin_29094539的博客 493

LVGL开发新选择:深度对比NXP GUI Guider与SquareLine Studio,免费版够用吗?

本文深度对比了LVGL开发中两款主流工具NXP GUI Guider与SquareLine Studio的核心差异,包括功能定位、设计能力、代码生成质量和硬件适配等方面。针对不同项目需求,分析了免费版工具的适用性,帮助开发者根据预算和功能需求做出明智选择。特别关注了GUI设计工具在嵌入式开发中的实际应用效果。

weixin_26976635的博客 426

Rollup打包组件库

Rollup 是一个 JavaScript 模块打包工具,可以将多个小的代码片段编译为完整的库和应用。与传统的 CommonJS 和 AMD 这一类非标准化的解决方案不同,Rollup 使用的是 ES6 版本 Javascript 中的模块标准。新的 ES 模块可以让你自由、无缝地按需使用你最喜爱的库中那些有用的单个函数。这一特性在未来将随处可用,但 Rollup 让你现在就可以,想用就用。即可,更多配置选项可参考。

weixin_49428989的博客 474

读书笔记:深度学习入门-基于python的理论与实现(俗称鱼书)

终于从头到尾把鱼书看完啦,真的是非常入门,非常查漏补缺,对新手很友好,对有一定基础的人也非常不错。看完不复习等于没看,所以今天开始复盘,顺便写这篇读书笔记。希望分享给没看过这本书或者看过这本书的同僚们参考,欢迎大家指教。我将从第三章神经网络开始复习,前两章内容书里已经非常基础and清楚了。(会持续更新滴).........

博客而已 1万+

rollup 打包一个组件库(简单教程)

rollup文档 讲讲常用的插件 @rollup/plugin-node-resolve rollup node module 路径解析插件,告诉 Rollup 如何查找外部模块,如果你需要 npm 包资源打入你的源代码里面就需要配置这个,一般直接使用 external 就可以了。如果你配置了这个,import dayjs from 'dayjs' 就会从node module 文件夹里面查找...

阿臻 912

从 Integrated Configuration 到 Integration Flow,SAP PI/PO 老配置迁移的一次温和重构

很多还在运行 SAP PI/PO 的系统,Integration Directory 里都积累了不少 Integrated Configuration,也就是日常项目里常说的 ICO。它们可能稳定运行了多年,负责把采购订单、物料主数据、客户主数据、发票、发货通知从一个系统送到另一个系统。问题在于,ICO 这种对象很实用,却不够直观。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 95

面向口齿不清者的语音识别新突破:用大模型拯救“听不懂”的声音

面向构音障碍患者的语音识别新突破:大语言模型显著提升识别准确率 国际语音研究团队在Interspeech 2025发表最新成果,通过将大语言模型(LLM)融入语音识别系统,显著改善了对构音障碍(dysarthria)患者语音的识别效果。研究表明: 传统语音识别(如CTC模型)对构音障碍语音的词错误率(WER)高达50-54%,Whisper模型降至38-40%。 引入LLM解码器后,BART模型将WER降至30-32%,而Whisper-Vicuna组合更将WER降低至21-26%。 关键优势:LLM能有效

帅小柏的博客 270

webpack与rollup

webpack与rollup关于webpack和rollup关于两个打包工具的选择 关于webpack和rollup 一、Webpack 始于2012年,由 Tobias Koppers发起,用于解决当时现有工具未解决的的一个难题: 构建复杂的单页应用程序(SPA)。特别是 webpack 的两个特性改变了一切: 1、代码拆分(Code Splitting) :可以将应用程序分解成可管理的代码块,可以按需加载,这意味着你的用户可以快速获取交互性的网站,而不必等到整个应用程序下载和解析完成。 2.静态资源(S

ziyouniao1993的博客 833

PCL学习笔记(四)——点云曲面重建

文章目录一、凸包算法二、 单纯的点云数据固然很好,但仅仅是点的话仍是不够的,因为这不利于我们后续对实体对象的渲染与各种应用,如计算实体的表面积、体积等等,所以这就需要我们对实体进行点云的曲面重建。 一、凸包算法 在计算机图形学中,凸包是指在任意维空间中包含某一有限点集P的最小凸集,它由凸包顶点构成,在二维上其表现形式为一个凸多边形,而在三维上则表现为一个凸多面体。在二维层面上来讲,最常用的凸包算法有Graham扫描法和Jarvis卷包裹法,但前者并不适用于三维层面,后者倒是可以扩展到三维。除此之外,在

dayuhaitang1的博客 6912

Rollup: 打造现代化JavaScript模块打包工具

Rollup: 打造现代化JavaScript模块打包工具 【免费下载链接】rollup rollup/rollup: Rollup是一个JavaScript模块打包器,专注于ES6模块的优化编译,能够将多个模块文件转换并打包成单个文件,并进行代码优化。它特别适用于构建库或工具,确保生成的代码体积小、加载速度快。 ...

gitblog_00086的博客 441

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

rollup入门 - 学习笔记(1)

在package.json中,script/build配置。打包项目用webpack , 打包js库用rollup。在package.json中配置type:module。可以在dist/bundle.js文件中找到打包的文件。创建module/mymodule.js文件。创建配置文件rollup.config.js。然后执行命令npm run build即可。创建src/main.js文件。rollup打包工具。

weixin_44707050的博客 305

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

webpack和rollup的区别

webpack和rollup都是目前主流的打包工具,但它们的设计理念和应用场景有所不同。本文将从多个角度对比这两个工具的异同。webpack是一个全能型的打包工具,特别适合构建应用rollup更专注于库的打包,生成更清爽的代码如果是开发应用,建议使用webpack如果是开发JavaScript库,建议使用rollup有些项目会同时使用两者,比如Vue、React等框架。

exlink2012的专栏 906

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

前端打包工具 - Rollup 打包工具笔记

Rollup是一款专注于JavaScript打包的工具,相比Webpack更轻量简洁。它支持ES6模块静态分析,能自动去除未引用代码(Tree Shaking),输出干净的打包结果。Rollup特别适合构建JavaScript库,支持多种输出格式(cjs/amd/esm/iife/umd),可通过简单配置实现多格式打包。其设计理念更偏向库开发,而非Webpack的应用开发全面性。常用插件可扩展功能,如处理node_modules、CommonJS转换、Babel转译等。

REDcker的博客 1646

Rollup

Rollup 是一个用于 JavaScript 的模块打包工具,它将小的代码片段编译成更大、更复杂的代码,例如库或应用程序。它使用 JavaScript 的 ES6 版本中包含的新标准化代码模块格式,而不是以前的 CommonJS 和 AMD 等特殊解决方案。ES 模块允许你自由无缝地组合你最喜欢的库中最有用的个别函数。这在未来将在所有场景原生支持,但 Rollup 让你今天就可以开始这样做。

在所有的事情背后,要有一颗坚定的的本心,要有一颗应对变革和提升自我的本心,世界瞬息万变,本心要坚持到底,保持学习,时刻复盘 1212

Rollup-plugin-multi-input 常见问题解决方案

Rollup-plugin-multi-input 常见问题解决方案 1. 项目基础介绍和主要编程语言 **项目介绍:**Rollup-plugin-multi-input 是一个用于 Rollup 打包工具的插件,它允许开发者使用多个入口点来打包模块化的库。这个插件支持使用 glob 语法来指定输入文件,并且可以保持源代码目录结构在输出目录中。 **主要编程语言:**JavaScript 2. ...

gitblog_00590的博客 339

JavaScript 模块化打包工具对比:Webpack、Vite、Rollup 适用场景

同时,Vite 对 ES 模块的原生支持使其更符合现代浏览器的发展趋势,对于无需兼容低版本浏览器的项目(如内部管理系统、移动端 H5 等),Vite 是理想的选择。例如,一个包含数千个模块的大型项目,Webpack 的启动时间可能长达数十秒,热更新也需要几秒才能完成,这在频繁调试的开发过程中会造成明显的效率损耗。总之,Webpack、Vite、Rollup 各有其独特的优势与适用场景,没有绝对的 “最佳工具”,只有 “最适合项目的工具”。一、核心定位与设计理念​。三、功能特性与生态支持​。

2509_93051135的博客 383

rollup_简单介绍

总的来说,Rollup 是一个强大而灵活的 JavaScript 模块打包器,在现代前端开发中扮演着重要角色。功能以及对 ES 模块的原生支持,使其成为开发 JavaScript 库和小型应用的理想选择。它生成的 bundle 倾向于更小、更纯净,适合那些希望发布最小化且高效利用模块化的库。安装 Rollup 非常简单,可以通过 npm 进行全局安装或本地安装。Rollup 是一个流行的 JavaScript 模块打包工具,Rollup 还支持代码分割,允许你将代码分成多个块,这些块可以。

浪漫韫秋 522

为什么组件库打包用 Rollup 而不是 Webpack?

Rolup 是一个打包工具,类似 Webpack。组件库打包基本都是用 Rollup。那 Webpack 和 Rollup 有什么区别呢?为什么组件库打包都用 Rollup 呢?我们来试一下:mkdirrollup-test cdrollup-test npminit-y我们创建两个模块:src/index.jsimport{add}from'./utils'; functio...

奇舞周刊 370

rollup详细使用教程

rollup详细教程

一名渣渣程序员 1355

Rollup、Webpack、Esbuild 和 Vite 前端打包工具

Rollup、Webpack、Esbuild 和 Vite 都是前端开发中常用的打包工具,它们各有特点,以下是对它们的详细对比:

weixin_42283818的博客 1773

Rollup入门与进阶:为现代Web应用构建超小的打包文件

Rollup 是一个轻量且高效的 JavaScript 打包工具,特别适用于构建库和模块化应用程序。与 Webpack 相比,Rollup 能生成更精简的代码,通过 tree-shaking 去除未使用的代码,优化模块。Rollup 支持 ES 模块格式,插件丰富,可高度自定义。本文详细介绍了 Rollup 的初始化、配置、Babel 转换、多入口打包、加载三方依赖、TypeScript 支持、代码压缩、HTML 模板生成、开发服务器启动、Vue 组件处理以及 CSS 压缩等功能。

ztK63LrD的博客 2071
上一篇: 快速开发工具 Vite
下一篇: webpack 性能优化方案 - 代码分离(分包)
CaptainDrake
博客等级 码龄6年 5362粉丝 187原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值