慣性聚合 高效追讀感興趣之博客、新聞、科技資訊
閱原文 以慣性聚合開啟

推薦訂閱源

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

阮一峰的网络日志

科技爱好者周刊(第 396 期):互联网通信的替代方案 科技爱好者周刊(第 396 期):互联网通信的替代方案 - 阮一峰的网络日志 科技爱好者周刊(第 395 期):软件开发的第三种方式 科技爱好者周刊(第 395 期):软件开发的第三种方式 - 阮一峰的网络日志 科技爱好者周刊(第 393 期):脑腐状态 科技爱好者周刊(第 392 期):axios 投毒与好莱坞式骗术 科技爱好者周刊(第 391 期):AI 的贫富分化 科技爱好者周刊(第 390 期):没有语料,大模型就是智障 套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的"套壳"疑云 科技爱好者周刊(第 389 期):未来如何招聘程序员 科技爱好者周刊(第 388 期):测试是新的护城河 零安装的"云养虾":ArkClaw 使用指南 科技爱好者周刊(第 387 期):你是领先的 科技爱好者周刊(第 386 期):当外卖员接入 AI 字节全家桶 Seed 2.0 + TRAE 玩转 Skill 科技爱好者周刊(第 385 期):马斯克害怕中国车企吗? 智谱旗舰 GLM-5 实测:对比 Opus 4.6 和 GPT-5.3-Codex 科技爱好者周刊(第 384 期):为什么软件股下跌 科技爱好者周刊(第 383 期):你是第几级 AI 编程 Kimi 的一体化,Manus 的分层 科技爱好者周刊(第 382 期):独立软件的黄昏 AI native Workspace 也许是智能体的下一阶段 科技爱好者周刊(第 381 期):中国 AI 大模型领导者在想什么 科技爱好者周刊(第 380 期):为什么人们拥抱"不对称收益" 科技爱好者周刊(第 379 期):《硅谷钢铁侠》摘录 我如何用 AI 处理历史遗留代码:MiniMax M2.1 升级体验 科技爱好者周刊(第 378 期):预测是新的互联网热点 科技爱好者周刊(第 377 期):14万美元的贫困线 科技爱好者周刊(第 376 期):太空数据中心的争议 科技爱好者周刊(第 375 期):一扇门的 Bug 终于有人做了 Subagent,TRAE 国内版 SOLO 模式来了 科技爱好者周刊(第 374 期):6GHz 的问题 VS Code 使用国产大模型 MiniMax M2 教程 科技爱好者周刊(第 373 期):数据模型是新产品的核心 国产大模型接入 Claude Code 教程:以 Doubao-Seed-Code 为例 科技爱好者周刊(第 372 期):软件界面如何设计 大模型比拼:MiniMax M2 vs GLM 4.6 vs Claude Sonnet 4.5 科技爱好者周刊(第 371 期):一个乐观主义者的专访 科技爱好者周刊(第 370 期):正确的代码高亮 错误处理:异常好于状态码 科技爱好者周刊(第 369 期):Tim 与罗永浩的对谈 科技爱好者周刊(第 368 期):不要这样管理软件团队 一天之内,智谱和 Anthropic 都发了最强编程模型 科技爱好者周刊(第 367 期):Nano Banana 的几个妙用 科技爱好者周刊(第 366 期):旧金山疯狂的 AI 广告 科技爱好者周刊(第 365 期):流量变现正在崩塌 科技爱好者周刊(第 364 期):最难还原的魔方 科技爱好者周刊(第 363 期):最好懂的神经网络解释 科技爱好者周刊(第 362 期):GitHub 工程师谈系统设计 科技爱好者周刊(第 361 期):暗网 Tor 安全吗?
打包工具Rollup.js入门教程
阮一峰 · 2022-05-05 · via 阮一峰的网络日志

rollup.js者,JavaScript 之打包器也。是文所述,其用法之基也。

一、简略

打包器之用,合众 JavaScript 脚本为一,以供浏览器之用。

浏览器需脚本打包,其故有三。

(1)昔时浏览器不支模块,大者必先合为单脚本而后行。

(2)Node.js 之模块,与浏览器不谐,必藉打包器以协之。

(3)浏览器载一大脚本,较载众小脚本,性能更优。

今时,最常用者,莫过于 Webpack。其能虽宏,然学之难,用之艰,人皆非之。

rollup.js 之作,本意在于创制一 ES 模块打包之器,简易直用,无需配置。此志,彼实已偿。

其后渐次演进,亦能打包 CommonJS 模块。然此际,须经繁复之配置,实则较 Webpack,简易未几。

是故,当仅以 rollup.js 装束 ES 模块,方得尽其所长。下文可见,此乃何等简易之事。

若尔项目用 CommonJS 模块,不荐 rollup.js,其利甚微。

倘尔未谙 ES 模块与 CommonJS 模块之异同,详参 ES6 教程

其二、安装

本文所取,乃全局安装 rollup.js。


$ npm install --global rollup

然,子若不欲安装,亦可直用,惟需将下文诸令中rollup,易为npx rollup(参看《npx 使用教程》)。

初试之,可运行下令,察其助。


$ rollup --help
# 或者
$ npx rollup --help

其三、示例

今以 rollup.js,包二简脚本:库文 add.js,及入口 main.js。


// add.js
const PI = 3.14;
const E = 2.718;

export function addPi(x) {
  return x + PI;
}

export function addE(x) {
  return x + E; 
}

前文之码中,模块 add.js,输出二工函数addPi()addE()


// main.js
import { addPi } from './add.js';

console.log(addPi(10));

之码中,主脚本 main.js 载 add.js 之工函数addPi()

继而,以 rollup.js 打包之。


$ rollup main.js

打包时,但示主脚本 main.js,rollup 自能将依项打包之。

打包之果,默认输出于屏。


const PI = 3.14;

function addPi(x) {
  return x + PI;
}

console.log(addPi(10));

可见,importexport之句已无,为原码所易。

复有,函数addE()未打包之,盖未用也。此性谓摇树(tree-shaking),即打包时自能去未用之码。

由前二点,rollup 输之码甚洁,且体小于他打包之器。

,以--file [FILENAME],存打包之果于所定之文。


$ rollup main.js --file bundle.js

,此令存打包之果于bundle.js。

,四、用之当察

(一)若有诸入口之文,则次第书其名,以--dir,定输出之域。


$ rollup m1.js m2.js --dir dist

,此令于dist,打包为众文:m1.js、m2.js,及其共依(若有)。

(二)--format iife,则置打包之果于一自执行之函数中。


$ rollup main.js --format iife

(三)欲使打包后之文极简,则用--compact


$ rollup main.js --compact

又有他法,可藉专器为之。


$ rollup main.js | uglifyjs --output bundle.js

前令分两途:初以 rollup 装束,次以 uglifyjs 精约,终书于 bundle.js。

(4)rollup 之用,得依配置之文(rollup.config.js),悉陈其要于中,下举一例。


// rollup.config.js
export default {
  input: 'main.js',
  output: {
    file: 'bundle.js',
    format: 'es'
  }
};

参数-c启配置之文。


$ rollup -c

吾不荐此,盖增繁复之故。常境之下,令行参数已足,且易览也。

五、化 CommonJS 模块

终,rollup 尚能化 ES 模块为 CommonJS 模块,用其参数--format cjs则可矣。


$ rollup add.js --format cjs

所化之CommonJS模块,其码如下。


'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

const PI = 3.14;
const E = 2.718;

function addPi(x) {
  return x + PI;
}

function addE(x) {
  return x + E; 
}

exports.addE = addE;
exports.addPi = addPi;

(终)