![]() |
VOOZH | about |
Rollup, 和 Webpack, Precel 都是模塊打包工具(module bundler tool), 但是側重點不同, 我們要聊的 Rollup 更加適合用於構建 Library, 而 Webpack, Precel 更加適合開發 Application.什麼是 Rollup
希望通過本篇文章, 對大家構建 Library 有一定的工程上的啟發.
簡單而言, Rollup 是一個模塊打包工具, 可以將我們按照 ESM (ES2015 Module) 規範編寫的源碼構建輸出如下格式:
<script> 標籤加載RequireJS 可加載Webpack 加載Webpack, Rollup 加載大多數的 Library 也是選擇使用 Rollup 構建, 比如: React, Vue, Angular, D3, Moment, Redux…
藉助於 Rollup 的插件體系, 我們也可以處理 css, images, font 等資源, 但是 Rollup 不支持代碼拆分(Code Splitting)和運行時態加載(Dynamic Import) 特性, 所以較少的應用於 Application 開發.
為什麼選擇 Rollup.js, .min.js安裝教程就不列舉了, 為大家提供一個 starter 模板: rollup-starter-kit. 主要說下開發一個 Library 我們需要哪些基礎插件以及他們的配置.
process.env.NODE_ENV 用於構建區分 Development 與 Production 環境.importaliasfrom'rollup-plugin-alias';importeslintfrom'rollup-plugin-eslint';importresolvefrom'rollup-plugin-node-resolve';importcommonjsfrom'rollup-plugin-commonjs';importbabelfrom'rollup-plugin-babel';importreplacefrom'rollup-plugin-replace';exportdefault{input:'src/main.js',plugins:[alias({resolve:['.js']}),replace({'process.env.NODE_ENV':JSON.stringify(process.env.NODE_ENV||'development')}),resolve,commonjs({//
non-CommonJS modules will be ignored, but you can also// specifically include/exclude
filesinclude:'node_modules/**'}),eslint({include:['src/**/*.js']}),babel({runtimeHelpers:true,exclude:'node_modules/**'// only transpile our source code})]}rollup-plugin-serve
plugins:[...baseConfig.plugins,serve({port:8080,contentBase:['']})]構建生產版本時候, 我們一般期待結果有如下特性:
對應於我們的配置文件如下:
importfilesizefrom'rollup-plugin-filesize';importuglifyfrom'rollup-plugin-uglify';import{minify}from'uglify-es';importbaseConfigfrom'./rollup.config.base';import{name,version,author}from'../package.json';//
bannerconstbanner=`${'/*!\n'+' * '}${name}.js v${version}\n`+` * (c) 2018-${newDate.getFullYear}${author}\n`+` * Released under the MIT License.\n`+` */`;// 支持輸出 exportdefault[// .js, .cjs.js,
.esm.js{...baseConfig,output:[// umd development version with sourcemap{file:`dist/${name}.js`,format:'umd',name,banner,sourcemap:true},// cjs and esm
version{file:`dist/${name}.cjs.js`,format:'cjs',banner},{file:`dist/${name}.esm.js`,format:'es',banner}],plugins:[...baseConfig.plugins,filesize]},// .min.js{...baseConfig,output:[// umd with
compress version{file:`dist/${name}.min.js`,format:'umd',name,banner}],plugins:[...baseConfig.plugins,uglify({compress:{drop_console:true}},minify),filesize]}];@xx/xxxx.d.ts, 可通過 package.json 中 typings 指定modules 指定 ESM 模塊, webpack, rollup 會優先獲取 ESM 模塊main 指定 CJS 模塊文章主要講解一些配置和實踐規範, 具體效果可參見示例代碼: rollup-starter-kit, 歡迎大家提 Issue 交流.