配置
多入口打包
此场景适用于文件打包为多个类型供第三方引用,或者多入口多文件打包。
export default [ { input: 'src/main.js', output: { file: 'dist/index.umd.js', format: 'umd', name: 'index' }, }, { input: 'src/main.js', output: { file: 'dist/index.es.js', format: 'es', },2 collapsed lines
}]生成后的dist文件目录结构为如下:
dist├── index.es.js├── index.umd.js启动本地服务功能
npm install rollup-plugin-serve --save-devimport serve from 'rollup-plugin-serve'
export default { input: 'src/main.js', output: { file: 'dist/bundle.js', format: 'iife', name: 'bundleName', }, plugins: [ serve({ open: true, port: 3000, contentBase: './dist' }),2 collapsed lines
]};{ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "rollup --config rollup.config.js", "dev": "rollup --config rollup.config.js" }}常用插件
babel打包
- @babel/core babel核心包
- @babel/preset-env 预设
- @babel/plugin-babel rollup插件
npm install @babel/core @babel/preset-env @babel/pulgin-babel --save-devimport { babel } from '@rollup/plugin-babel';
export default { input: 'src/main.js', output: { file: 'dist/bundle.js',//输出文件的路径和名称 format: 'es', }, plugins: [babel()],}'use strict';
var sum = function sum(a, b) { return a + b;};var result = sum(1, 2);console.log(result);打包第三方库
在rollup中,从node_modules中引入的包是不会打包的,也就是说,我们在main.js中引入react或者lodash使用,打包之后的文件无法直接使用。
import _ from 'lodash'
export function sumA(a, b) { return _.add(a, b)}打包生成结果如下:
import _ from 'lodash';
function sumA(a, b) { return _.add(a, b)}
export {sumA};如果想要打包第三方库需要安装插件@rollup/plugin-node-resolve和@rollup/plugin-commonjs。
import resolve from '@rollup/plugin-node-resolve';import commonjs from '@rollup/plugin-commonjs';
export default { input: 'src/main.js', output: { file: 'dist/bundle.js',//输出文件的路径和名称 format: 'es', }, plugins: [resolve(), commonjs()],}这样打包出来的结果就是符合我们可以预期使用的文件了。
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
function getDefaultExportFromCjs(x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;}
// ... 省略10000多行如果有的第三方库,我们需要打包,有的第三方库,又不需要打包,可以添加参数external来配置。
import resolve from '@rollup/plugin-node-resolve';import commonjs from '@rollup/plugin-commonjs';
export default { input: 'src/main.js', output: { file: 'dist/bundle.js',//输出文件的路径和名称 format: 'es', }, plugins: [resolve(), commonjs()], external: ['lodash']}这样打包之后的文件,还是和之前一样:
import _ from 'lodash';
function sumA(a, b) { return _.add(a, b)}
export {sumA};添加打包css功能
npm install postcss rollup-plugin-postcss --save-devimport "./style.css"let sum = (a, b) => a + b;let result = sum(1, 2);console.log(result);body{ background: red;}import postcss from 'rollup-plugin-postcss'
export default { input: 'src/main.js', output: { file: 'dist/bundle.js', format: 'iife', name: 'bundleName', }, plugins: [ postcss() ]};terser代码压缩
npm install @rollup/plugin-terser --save-devimport {terser} from 'rollup-plugin-terser'
export default { input: 'src/main.js', output: { file: 'dist/bundle.js',//输出文件的路径和名称 format: 'es', plugins: [terser()], }, plugins: [resolve(), commonjs()], external: ['lodash']}打包之后生成的bundle.js文件如下:
import o from "lodash";
function r(r, t) { return o.add(r, t)}
export {r as sumA};重命名alias
pnpm install @rollup/plugins-aliasimport alias from "@rollup/plugin-alias";import path from "path";
export default { input: 'src/main.js', output: { file: 'dist/bundle.js',//输出文件的路径和名称 format: 'es', }, plugins: [alias({ entries: [ {find: 'utils', replacement: path.resolve(__dirname, 'src/utils')}, ] })],}全局替换插件
pnpm install @rollup/plugin-replaceconsole.log(__TEST__)
document.getElementById('app').innerHTML = __TEST__;import replace from '@rollup/plugin-replace'
export default { input: 'src/main.js', output: { file: 'dist/bundle.js',//输出文件的路径和名称 format: 'es', }, plugins: [ replace( { preventAssignment: true, __TEST__: "123456", } )2 collapsed lines
],}打包之后的文件输出结果:
console.log(123456);
document.getElementById('app').innerHTML = 123456;eslint插件
pnpm install @rollup/plugin-eslint eslint添加.eslintrc.js配置:
// .eslintrc.js 示例,非正规项目使用module.exports = { "env": { "browser": true, "es2021": true }, "extends": "eslint:recommended", "parserOptions": { "ecmaVersion": "latest", "sourceType": "module" },}import eslint from "@rollup/plugin-eslint";
export default { input: 'src/main.js', output: { file: 'dist/bundle.js',//输出文件的路径和名称 format: 'es', }, plugins: [ eslint({ throwOnError: true, // 设置eslint检查有错误的情况下会编译失败 }), ],}image插件
@rollup/plugin-image 插件可以将图片导入为 Base64 编码的字符串。
如果不想将图片处理为base64,而是作为文件额外的文件引入,可以使用@rollup/plugin-url,或者将图片复制到输出目录,可以使用rollup-plugin-copy。
pnpm i @rollup/plugin-imageimport img from "./images/avatar.png"
console.log(img)import image from "@rollup/plugin-image";
export default { input: 'src/main.js', output: { file: 'dist/bundle.js',//输出文件的路径和名称 format: 'es', }, plugins: [ image() ],}strip插件
移除多余的console
pnpm i @rollup/plugin-stripimport image from "@rollup/plugin-image";
export default { input: 'src/main.js', output: { file: 'dist/bundle.js',//输出文件的路径和名称 format: 'es', }, plugins: [ image() ],}添加typescript
npm install tslib typescript @rollup/plugin-typescript --save-devconst myName: string = "cirry";const age: number = 18;console.log(age)import typescript from '@rollup/plugin-typescript';
export default { input: 'src/index.ts', output: { dir: 'output', format: 'cjs' }, plugins: [typescript()]};(function () { 'use strict';
var age = 18; console.log(age);
})();生成ts配置文件:tsc --init
{ "compilerOptions": { "target": "es5", "module": "ESNext", "strict": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true }}打包cdn引入的包
import _ from 'lodash';import $ from 'jquery';console.log(_.concat([1,2,3],4,5));console.log($);export default 'main';<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>rollup</title></head><body> <script src="https://cdn.jsdelivr.net/npm/lodash/lodash.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/jquery/jquery.min.js"></script> <script src="bundle.js"></script></body></html>import babel from 'rollup-plugin-babel';import resolve from '@rollup/plugin-node-resolve';import commonjs from '@rollup/plugin-commonjs';export default { input:'src/main.js', output:{ file:'dist/bundle.cjs.js',//输出文件的路径和名称 format:'iife',//五种输出格式:amd/es6/iife/umd/cjs name:'bundleName',//当format为iife和umd时必须提供,将作为全局变量挂在window下 globals:{ lodash:'_', //告诉rollup全局变量_即是lodash jquery:'$' //告诉rollup全局变量$即是jquery } }, plugins:[8 collapsed lines
commonjs(), babel({ exclude:"node_modules/**" }), resolve(), ], external:['lodash','jquery'],}