rollup打包环境搭建

林林总总

前言

本文主要介绍 \color{#CD5C5C}{rollup} \color{grey}{[JavaScript Api]}使用,将一步步带领大家搭建一个\color{#CD5C5C}{library}打包脚本。本文也将不单独介绍命令行调用,如需要请链接rollup中文文档

rollup中文文档
rollup和webpack使用场景
git项目demo传送门

Rollup 是一个 JavaScript 模块打包器,可以用于library 或应用程序将复杂代码解耦,从小块代码编译成大块代码。【...更多概念性的东西就不多介绍了】 直接进入正文

目录结构

首先创建如下目录结构,src目录放置需要打包的library的源码,scripts放置打包脚本。本文只做案例,所有结构逻辑可按具体业务需求自行搭配。

目录

下载依赖包

\color{grey}{安装rollup}

npm i rollup -D

\color{grey}{安装rollup-plugin-babel} 官方传送门
rollup-plugin-babelRollupBabel之间来转换ES6 / 7代码,并使用Rollup生成独立包的无缝集成插件。在安装的时候,需要注意根据不同的babel版本安装对应的插件版本,否则很容易报错哟。本文将以babel 6.x的版本进行安装

babel 7.x

npm i -D rollup-plugin-babel@latest

babel 6.x

npm i -D rollup-plugin-babel@3

\color{grey}{安装rollup-plugin-node-resolve} 官方传送门
因为rollup打包library的时候,无法对node_modules的文件进行打包,所以我们需要引入rollup-plugin-node-resolve来使用第三方模块node_modules

npm i  -D rollup-plugin-node-resolve

\color{grey}{安装rollup-plugin-uglify} 官方传送门
rollup-plugin-uglify只能压缩和转换es5语法,如果是es6+请使用rollup-plugin-uglify-es

npm i  -D rollup-plugin-uglify

\color{grey}{安装babe-core} 官方传送门

// 6.x版本
npm i -D babel-core

\color{grey}{安装babel-preset-env} 官方传送门
babel-preset-env 可以根据配置的目标浏览器或者运行环境来自动将ES2015+的代码转换为es5

npm i -D babel-preset-env

\color{grey}{安装babel-plugin-external-helpers} 官方传送门
babel-plugin-external-helpers 把 helpers 收集到一个共享模块或共享文件。helper 函数是 babel 在 transform 时候常用的工具函数,对编译模块时,会将用到的 helpers 放到模块顶部。如果编译多个文件,就会重复引用,导致每个模块都定义一份。

npm i -D babel-plugin-external-helpers

脚本文件

\color{grey}{scripts/base.js}
base.js是一个基础配置文件。为dev.jsbuild.js输出基础配置。本文将默认format:umd格式,如果设置umd,必须设置name哦。其他类型配置,请参考大选项列表

/**@base rollup config基础配置*/
const babel = require("rollup-plugin-babel")
const resolve = require("rollup-plugin-node-resolve")

module.exports = {
    // 打包入口
    input: 'src/index.js',
    // 插件
    plugins: [
        resolve(),
        babel({
            exclude: 'node_modules/**',
            plugins: ['external-helpers'],
            externalHelpers: true
        })
    ],
    // 输出配置
    output: {
        file: 'dist/Hon.js',
        format: 'umd',
        name: 'Hon'
    }
}

\color{grey}{scripts/dev.js}
dev主要涉及到rollup.watch的使用,监听src/*(可配置)下源码的变化,实现自动打包更新

/**@dev 构建*/
const rollup = require('rollup')
const config = require('./base')

// 初始化配置文件 可以根据需求扩展config
const watcher = rollup.watch(config);

watcher.on('event', event => {
    // 状态码
    console.log(event.code)
    // logic
});

\color{grey}{scripts/build.js}
build主要涉及到rollup.rollup的使用,打包到dist目录

/**@build 构建*/
const rollup = require('rollup')
const {uglify} = require('rollup-plugin-uglify')
const config = require('./base')
const version = process.env.VERSION || require('../package.json').version

// 设置头部注释信息
const banner =
    '/*!\n' +
    ` * Hon v${version}\n` +
    ` * (c) 2018-${new Date().getFullYear()} li hui\n` +
    ' * Released under the MIT License.\n' +
    ' */'

// 设置尾部注释信息
const footer =
    `/** ${new Date()} **/`

config.output.banner = banner
config.output.footer = footer

function getSize(code) {
    return (code.length / 1024).toFixed(2) + 'kb'
}

async function build(config) {
    const bundle = await rollup.rollup(config)
    // 通过generate拿到code代码 ,计算代码大小
    const {output: [{code}]} = await bundle.generate(config.output)
    console.log(config.output.file + ':' + getSize(code))
    bundle.write(config.output)
}

build(config).then(() => {
    // 打压缩包
    config.plugins.push(uglify())
    config.output.file = 'dist/Hon.min.js'
    build(config).then(() => {
        console.log('succeed')
    })
})

\color{grey}{src/index.js}
默认源码文件

/**@index 入口文件*/

function reduce() {
    console.log('reduce')
}

const utils = {
    add(a, b) {
        return a + b
    }
}

function Hon(config) {
    this.config = config
}

Hon.prototype.say = function () {
    console.log(this.config)
}

Hon.prototype.add = function (a, b) {
    return utils.add.call(this, a, b)
}


module.exports = Hon

设置

.babelrc 可按业务需求扩展

{
  "presets": [
    [
      "env",
      {
        "modules": false
      }
    ]
  ]
}

pageage.json 设置启动命令
使用的是babel-node,如果找不到该命令,请全局安装下npm i -g babel-cli

"scripts": {
    "dev": "babel-node scripts/dev.js",
    "build": "babel-node scripts/build.js"
  }

\color{grey}{小伙伴们,安装 - 脚本文件 -配置都已经好了,现在可以运行命令了}

运行

npm run dev

如下


lwydeMacBook-Air:rollup-demo lwy$ npm run dev

> rollupdemo@1.0.0 dev /Users/lwy/Documents/rollup-demo
> babel-node scripts/dev.js

START
BUNDLE_START
BUNDLE_END
END

dist/Hon.js

(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
    factory();
}(function () { 'use strict';

    /**@index 入口文件*/

    var utils = {
        add: function add(a, b) {
            return a + b;
        }
    };

    function Hon(config) {
        this.config = config;
    }

    Hon.prototype.say = function () {
        console.log(this.config);
    };

    Hon.prototype.add = function (a, b) {
        return utils.add.call(this, a, b);
    };

    module.exports = Hon;

}));

现在我们对src/index.js添加个utils.reduce方法

  var utils = {
        add: function add(a, b) {
            return a + b;
        },
        reduce:function () {
            
        }
    };

发现控制台watcher又自动执行了

lwydeMacBook-Air:rollup-demo lwy$ npm run dev

> rollupdemo@1.0.0 dev /Users/lwy/Documents/rollup-demo
> babel-node scripts/dev.js

START
BUNDLE_START
BUNDLE_END
END


START
BUNDLE_START
BUNDLE_END
END

我们再去看看dist/Hon.js,也进行了实时更新

(function (factory) {
    typeof define === 'function' && define.amd ? define(factory) :
    factory();
}(function () { 'use strict';

    /**@index 入口文件*/

    var utils = {
        add: function add(a, b) {
            return a + b;
        },
        reduce:function () {
            
        }
    };

    function Hon(config) {
        this.config = config;
    }

    Hon.prototype.say = function () {
        console.log(this.config);
    };

    Hon.prototype.add = function (a, b) {
        return utils.add.call(this, a, b);
    };

    module.exports = Hon;

}));

好的,那我们develop的基础功能就弄好了。

build

现在来看看build的表现吧

npm run build

lwydeMacBook-Air:rollup-demo lwy$ npm run build

> rollupdemo@1.0.0 build /Users/lwy/Documents/rollup-demo
> babel-node scripts/build.js

dist/Hon.js:0.64kb
dist/Hon.min.js:0.28kb
succeed

生成了一个压缩和未压缩的文件


image.png

构建完成了。

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