慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

博客园 - 司徒正美
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。

四、使用注意點

(1)如果有多個入口腳本,就依次填寫它們的文件名,並使用參數--dir指定輸出目錄。


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

上面命令會在目錄dist,打包生成多個文件:m1.js、m2.js、以及它們共同的依賴項(如果有的話)。

(2)參數--format iife,會把打包結果放在一個自動執行函數里面。


$ rollup main.js --format iife

(3)如果希望打包後代碼最小化,使用參數--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;

(完)