Rollup详解

一、什么是Rollup

    Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,例如 library 或应用程序。Rollup 对代码模块使用新的标准化格式,这些标准都包含在 JavaScript 的 ES6 版本中,而不是以前的特殊解决方案,如 CommonJS 和 AMD。ES6 模块可以使你自由、无缝地使用你最喜爱的 library 中那些最有用独立函数,而你的项目不必携带其他未使用的代码。ES6 模块最终还是要由浏览器原生实现,但当前 Rollup 可以使你提前体验。

Rollup中文官网

二、为什么选择Rollup

1、Tree-Shaking

    tree shaking是rollup提出的,这也是rollup一个非常重要的feature,那什么是tree               shaking,rollup的解释是在构建代码时,在使用ES6模块化的代码中,会对你的代码进行静态分析,只打包使用到的代码。这样的好处是减少代码的体积,该功能也在webpack 4得到了实现。

2、多种输出格式的支持

    amd - AMD

    cjs -CommonJS

    es - ES6 modules

    umd - UMD

    system - SystemJS loader

3、兼容性

导入 CommonJS(Importing CommonJS)

Rollup 可以通过插件导入已存在的 CommonJS 模块。

发布 ES6 模块(Publishing ES6 Modules)

为了确保你的 ES6 模块可以直接与「运行在 CommonJS(例如 Node.js 和 webpack)中的工具(tool)」使用,你可以使用 Rollup 编译为 UMD 或 CommonJS 格式,然后在 package.json 文件的 main 属性中指向当前编译的版本。如果你的 package.json 也具有 module 字段,像 Rollup 和 webpack 2 这样的 ES6 感知工具(ES6-aware tools)将会直接导入 ES6 模块版本

浏览器兼容性

可以通过配置es3的编译工具,将目标代码编译至es3,配合polyfill,对于有向下兼容IE8的用户提供了兼容服务。

输出代码非常纯净,没有任何多余代码,不像webpack打包后生成的文件会自动注入很多代码,导致目标文件代码非常ugly。

三、脚手架选择

Rollup:

    适合写库(lib)、工具(sdk)以及小型应用,生成的目标代码更纯净。

Webpack:

    更适合写中大型应用程序,生态更佳,第三方插件更丰富。

四、使用Rollup

通常项目中使用配置文件去使用Rollup,项目中我习惯将配置文件分成三份:rollup.base.conf.js、rollup.dev.conf.js、rollup.prod.conf.js。

rollup.base.conf.js

import json from 'rollup-plugin-json';

import resolve from 'rollup-plugin-node-resolve';

import babel from 'rollup-plugin-babel';

import commonjs from 'rollup-plugin-commonjs';

import es3 from 'rollup-plugin-es3';

import {eslint} from 'rollup-plugin-eslint';

import pkg from '../package.json';

export default {

  input: pkg.src,

  output: {

    file: pkg.main,

    format: 'umd',

    name: 'EUtils',

    sourcemap: true

  },

  watch: {

    include: 'src/**'

  },

  plugins: [

    resolve(),

    commonjs(),

    json(),

    eslint({

      include: 'src/**',

      exclude: ['node_modules/**', 'dist/**'],

    }),

    babel({

      babelrc: false,

      presets: [['env', {modules: false, loose: true}]],

      include: ['src/**', 'test/**'],

      plugins: ['external-helpers'],

      runtimeHelpers: true

    }),

    es3({

      remove: ['defineProperty', 'freeze']

    }),

  ],

};

rollup.dev.conf.js

import { merge } from 'lodash';

import rollupBaseConf from './rollup.base.conf';

import serve from 'rollup-plugin-serve';

import livereload from 'rollup-plugin-livereload';

const devConfig = {

  plugins: [

    serve({

      open: true, // 是否打开浏览器

      contentBase: './', // 入口html的文件位置

      historyApiFallback: true, // Set to true to return index.html instead of 404

      host: 'localhost',

      port: 8888

    }),

    livereload(),

  ],

};

const config = merge(rollupBaseConf, devConfig);

export default config;

rollup.prod.conf.js

import baseConf from './rollup.base.conf';

import { merge } from 'lodash';

import { uglify } from 'rollup-plugin-uglify';

const prodConf = merge(baseConf, {

  plugins: [

    uglify({

      compress: {

        drop_console: true,

      }

    }),

  ]

});

export default prodConf;

本地启动项目:

package.json:

"scripts": {

    "build": "npm run clean && npm run lib && rollup --config build/rollup.prod.conf.js",

    "start": "npm run dev",

    "clean": "rimraf dist/** lib/**",

    "dev": "rollup --config build/rollup.dev.conf.js -w && livereload 'dist/'",

    "test": "jest --config ./jest.conf.js --coverage"

  },

此例是我用rollup来构建一个通用函数库所使用的配置,最终形成的.min.js文件非常纯净,同时可集成jest测试框架来测试编写的函数功能。

五、集成测试框架

jest是一个极易上手的测试框架,能测试很多应用场景,下面是我用来测试函数功能的配置文件:

const path = require('path');

module.exports = {

  rootDir: path.resolve(__dirname, './'),

  verbose: true,

  moduleFileExtensions: ['js', 'json',],

  moduleNameMapper: {'^@/(.*)$': '<rootDir>/src/$1',},

  transform: {'^.+\\.js$': '<rootDir>/node_modules/babel-jest',},

  testPathIgnorePatterns: ['<rootDir>/test/e2e',],

  coverageDirectory: '<rootDir>/test/coverage/',

  collectCoverageFrom: [

    'src/**/*.js',

    '!src/index.js',

    '!src/position.js',

    '!src/internal/**',

    '!src/scrollTop.js',

    '!**/node_modules/**',

    '!src/*Cookie*.js',

    '!src/getStylePrefix.js'

  ],

};

其中collectCoverageFrom是配置所要测试的文件,带“!”表示不覆盖该文件的测试。

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

推荐阅读更多精彩内容