Rollup 前端新利器

如果您在使用webpack1.X,您就会知道其无法避免引入冗余模块代码,导出打包出来的bundle文件难免有点臃肿。
当然,您可以通过ES2015的解构赋值语法引入模块,可以让打包工具最终编译出来的代码尽可能最小化,但是如果您比较习惯用类似webpack做模块化打包的话,可能有点折腾。所以,今天和大家介绍一个新的前端模块化的打包工具Rollup,Rollup在编译打包模块过程中,通过Tree-shaking的方式,利用ES6模块能够静态分析语法树的特性,剔除各模块中最终未被引用到的方法,通过仅保留被调用到的代码块来减小bundle文件大小。它和webpack 2.X在一定程度上很相似,孰优孰劣,在这我们就不去讨论,这篇文章重点是向大家简单介绍一下Rollup。

使用

通过npm进行安装

npm install -g rollup

执行打包方式和webpack类似:

*******************************************************
将入口文件src/main.js打包输出-o/--output为rel/bundle.js
*******************************************************
rollup src/main.js -o rel/bundle.js

Rollup打包新增编译运行格式-f/--format参数,您通过指定参数可以编译出来的模块执行您想要的格式

*****************************************
commonjs
*****************************************
rollup src/main.js -o rel/bundle.js -f cjs

还有其他可选格式:
amdes6iifeumd

来看看官方simple project,带我们入门
首先,创建例子入口文件

// src/main.js
import { cube } from './maths.js';
console.log( cube( 5 ) );

再搞个maths.js引入文件

// src/maths.js
export function square ( x ) {
    return x * x;
}
export function cube ( x ) {
    return x * x * x;
}

最终得到bundel.js内容如下:

'use strict';

function cube ( x ) {
    // rewrite this as `square( x ) * x`
    // and see what happens!
    return x * x * x;
}

console.log( cube( 5 ) );

上面可以看出maths未调用过的square方法经过Tree-shaking的作用后并未在bundel.js里出现。
另外Tree-shaking 会抽取引用到的模块内容,将它们置于同一个作用域下,进而直接用变量名就可以访问各个模块的接口。而不像 webpack 这样每个模块外还要包一层函数定义,再通过合并进去的 define/require 相互调用。当然,这种方法需要 ES2015 的解构赋值语法来配合,多亏了它,Rollup 才能有效地对模块内容进行可靠的静态分析。

Using config files

和webpack一样,Rollup也支持通过config file 来灵活使用。我们在根目录下建个rollup.config.js文件:

export default {
  entry: 'src/main.js',
  format: 'cjs',
  dest: 'rel/bundle.js' 
};

在此目录下执行打包:

*****************************************
rollup -c /--config [config filename]
*****************************************
rollup -c

当然,它也是支持使用插件的,直接写到配置文件里plugins里即可:

import babel from 'rollup-plugin-babel';

export default {
  entry: 'src/main.js',
  format: 'cjs',
  plugins: [ babel() ],
  dest: 'rel/bundle.js' 
};

执行npm安装rollup-plugin-babel

npm install rollup-plugin-babel

不过大家要注意的是,Rollup类似babel的预设不能像webpack可以直接写在配置文件里,必须通过.babelrc的configured文件来进行,此文件存放目录不规定一定在根目录下

//src/.babelrc
{
  "presets": [
    ["latest", {
      "es2015": {
        "modules": false
      }
    }]
  ],
  "plugins": ["external-helpers"]
}

并执行npm安装babel-preset-es2015-rollup

npm install babel-preset-es2015-rollup

这样就可以配合babel一起把es6的模块编译为es5的bundle进行使用。
为了方便跟gulp等工具协作,Rollup也支持被调用执行,比如:

//rollup.config.js
var rollup = require( 'rollup' );
var babel = require('rollup-plugin-babel');

rollup.rollup({
    entry: 'src/main.js',
    plugins: [ babel() ]
}).then( function ( bundle ) {
    bundle.write({
        format: 'umd',
        moduleName: 'main', //umd或iife模式下,若入口文件含 export,必须加上该属性
        dest: 'rel/bundle.js',
        sourceMap: true  //设置 source map,会自动生成一个 rel/bundle.js.map 关联到 rel/bundle.js 中。也可以设置为inline直接内联在 bundle 里而不是独立生成一个 map 文件
    });
});

然后node执行

node rollup.config.js

注意 “rollup.rollup()”返回一个带着 bundle 作为 resolve 回调参数的 Promise 对象,我们常规直接使用语法糖 bundle.write 来打包输出文件:

bundle.write({
     format: 'umd',
     moduleName: 'main',
     dest: 'rel/bundle.js'
});

//其等价于
var result = bundle.generate({
    format: 'umd',
    moduleName: 'main',
    dest: 'rel/bundle.js',
  });

  fs.writeFileSync( 'rel/bundle.js', result.code );

Rollup简单的介绍就到这,Rollup的出现也有一段时间了,如果您对它感兴趣的话可以去了解和使用,前端这些年出现的利器不少,它之所以没红起来,我想有个很大的原因就是前端生出利器时间过短,人们没反应过来。所以,要当好一个前端就得加快学习的脚本,共勉!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容