Rollup 是一个 JavaScript 模块打包器,说到模块打包器,天然就会想到 webpack。webpack 是一个现代 JavaScript 应用程序的静态模块打包器,那么在 webpack 已经成为前端构建主流的今天,为何还要用 Rollup 呢?前端
Rollup 中文文档 中介绍到,它能够将小块代码编译成大块复杂的代码,例如 library 或应用程序。能够看到它的应用场景之一,就是打包 JS 库。本身写个 JS 库,在咱们开发工做中和开源项目中仍是比较常见的。可谓是生命不息,造轮子不止。若是还没写过,那就赶忙来提高下本身的技(逼)术(格)吧。vue
用过 webpack 的都知道,它能够将全部的静态资源,导入到应用程序中,也是由于它强大的功能,因此打包 bundle 文件时,会产生不少冗余的代码,在大型的应用中,这点冗余代码就会显得微不足道,可是在一个小小的库中,就会显得比较明显了。好比这么一个类:node
class People{ constructor(){ this.name = 'linxin' } getName(){ return this.name; } } export default People;
通过 webpack 打包以后,变成下面这样(案例移除了具体内容),多出了不少方法,这显然不是咱们想要的。react
/******/ (function(modules) { // webpackBootstrap /******/ var installedModules = {}; /******/ function __webpack_require__(moduleId) { **** } /******/ __webpack_require__.m = modules; /******/ __webpack_require__.c = installedModules; /******/ __webpack_require__.d = function(exports, name, getter) { *** }; /******/ __webpack_require__.r = function(exports) { *** }; /******/ __webpack_require__.t = function(value, mode) { *** }; /******/ __webpack_require__.n = function(module) { *** }; /******/ __webpack_require__.o = function(object, property) { *** }; /******/ __webpack_require__.p = ""; /******/ return __webpack_require__(__webpack_require__.s = 0); /******/ }) /******/ ([ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); class People{ constructor(){ this.name = 'linxin' } getName(){ return this.name; } } /* harmony default export */ __webpack_exports__["default"] = (People); }) ]);
而 Rollup 打包以后的代码跟源码基本一致,做为一个 JS 库,咱们仍是但愿简洁一点,代码量少点。毕竟实现相同的功能,谁都不想去引入一个更繁重的库吧。webpack
Rollup 使用 ES6 的模块标准,而不像 CommonJS 和 AMD,虽然也叫模块化,其实只是一种临时的解决方案。Rollup 的模块可使咱们开发时能够独立的开发每一个小模块,代码小而简单,更加方便测试每一个小模块,在构建时才打包成一个完成的 JS 库。git
tree shaking 指的是移除 JavaScript 上下文中的未引用代码,它依赖于 ES2015 模块系统中的静态结构特性,例如 import 和 export。静态结构的 import 就好像是变量引用同样,不须要执行代码,在编译时就能够肯定它是否有引用到,若是没引用,就不把该段代码打包进来。好比用到了一个第三方库的一个功能,但我确定不要把它完整的库都打包进来,我只须要打包用到的代码便可,这时候 tree shaking 就能够发挥出它的做用了。github
开发一个 JS 库,我须要 Rollup 能为我提供些经常使用的功能:web
Rollup 使用一个 rollup.config.js 文件进行配置。typescript
// rollup.config.js export default { input: 'src/index.js', output: { file: 'dist/bundle.js', format: 'umd' } };
配置跟其余工具基本一致,从入口文件 index.js 打包后输出文件 bundle.js。format 是生成包的格式,可选有 amd,cjs,es,iife,umd
,umd 是通用模块定义,打包后能够经过 <script>
标签引入,也能够经过 import 等方式引入,做为一个 JS 库要适用各个场景,应选择 umd 。npm
Rollup 经过插件在打包的关键过程当中更改行为,babel的插件就是 rollup-plugin-babel,须要先安装相关依赖
npm i rollup-plugin-babel@latest @babel/core @babel/preset-env -D
新建 .babelrc 文件,配置 babel
{ "presets": ["@babel/preset-env"] }
npm i rollup-plugin-uglify -D
由于 rollup-plugin-uglify 没法压缩 ES6 的语法,因此必须先用 babel 转。若是想直接压缩 ES6 的语法,可换成 rollup-plugin-terser
开发一个 JS 库,不能乱七八糟,为所欲为的写代码,必须规范起来,当别人为你的开源库作贡献时,也必须遵循你的开发规范。安装 ESLint 插件
npm i rollup-plugin-eslint -D
而后初始化生成一个 ESLint 配置文件 ./node_modules/.bin/eslint --init
那么最终的 rollup.config.js 配置文件以下:
import babel from 'rollup-plugin-babel'; import { uglify } from 'rollup-plugin-uglify'; import { eslint } from "rollup-plugin-eslint"; export default { input: './index.js', output: { file: 'dist/bundle.js', name: 'People', format: 'umd' }, plugins: [ eslint({ fix: true, exclude: 'node_modules/**' }), babel({ exclude: 'node_modules/**' }), uglify() ] };
若是使用 TypeScript 进行开发,则须要安装 rollup-plugin-typescript2 插件和相关依赖
npm i rollup-plugin-typescript2 typescript -D
而后初始化生成一个 tsconfig.js 配置文件 tsc --init
,那么使用 TypeScript 的打包文件以下:
import typescript from 'rollup-plugin-typescript2'; export default { input: './index.ts', output: { file: 'dist/bundle.js', name: 'People', format: 'umd' }, plugins: [ typescript() ] }
除了以上用的这些插件以外,还有一些可能根据项目需求也有须要
以上只是介绍了 Rollup 的一些基本用法,更多的请参考官方文档。Rollup 已被许多主流的 JavaScript 库使用,包括 vue 和 react。它也可用于构建绝大多数应用程序,可是代码拆分和运行时态的动态导入这类高级功能,它还不能支持,若是需用这些功能,那就可使用 webpack。案例可查看:sChart.js