手把手教你Rollup构建

介绍

Rollup 是一个 JavaScript 模块打包工具,它专注于 ES6 模块化的支持,并且被设计成更适用于构建库或组件而不是完整的应用程序。与其他打包工具如 Webpack 相比,Rollup 具有更高的效率和更小的输出体积,因为它采用了一些优化策略,例如 Tree Shaking

以下是 Rollup 的一些主要特点和优势:

  1. ES6 模块支持:Rollup 最初设计的目的就是支持 ES6 模块的打包。它可以处理 ES6 模块的导入和导出语法,以及相关的模块化特性。

  2. Tree Shaking:Rollup 使用静态分析的技术来识别和删除未使用的代码(即无法到达的代码),这被称为 Tree Shaking。这可以帮助减少打包后的文件体积,提高加载性能。

  3. 插件系统:Rollup 提供了一个灵活的插件系统,允许开发者通过插件来扩展 Rollup 的功能。这意味着你可以通过插件来处理各种任务,例如编译 TypeScript、转译代码、压缩文件等。

  4. 纯 JavaScript:与 Webpack 不同,Rollup 是用纯 JavaScript 编写的,这意味着你可以更容易地理解和扩展它的源代码。

  5. 快速构建速度:由于 Rollup 专注于 ES6 模块,并且采用了一些优化策略,因此通常具有更快的构建速度和更小的输出体积。

  6. 适用于库的打包:由于 Rollup 的设计目标是为了支持库和组件的打包,因此它更适用于打包独立的功能模块而不是整个应用程序。

尽管 Rollup 在某些方面具有独特的优势,但它也有一些局限性,例如对动态导入(Dynamic Imports)的支持较弱,以及对一些非标准模块格式的支持较差。因此,在选择打包工具时,你需要根据项目的需求和特点来权衡各种因素。

安装

sh 复制代码
npm install --global rollup
# 或者
# npm install --save-dev rollup

在项目根目录新建文件rollup.config.mjs(或rollup.config.js),pacakge.jsonscript中添加rollup -c

json 复制代码
// pacakge.json
{
  "scripts": {
    "build": "rollup -c"
  }
}

终端运行npm run build,也可以直接在终端运行npx rollup -c

超级简单的配置

js 复制代码
// rollup.config.mjs
export default {
	input: 'src/main.js',
	output: {
		file: 'bundle.js',
		format: 'cjs'
	}
};

也可以同时构建多种format

js 复制代码
// rollup.config.mjs
export default [
  {
    input: 'src/main.js',
    output: {
      file: 'bundle.js',
      format: 'cjs'
    }
  },{
    input: 'src/main.js',
    output: {
      file: 'bundle.es.js',
      format: 'es'
    }
  }
];

ts项目

  1. 安装相关依赖
sh 复制代码
npm install rollup-plugin-typescript2 typescript tslib --save-dev
  1. 更新rollup.config.mjs
js 复制代码
// rollup.config.mjs
import typescript from 'rollup-plugin-typescript2';
export default {
	input: './main.ts',
	plugins: [
		typescript(/*{ plugin options }*/)
	]
}

第三方依赖

真实项目,往往会用到第三方依赖,可以通过插件来解决依赖引入的问题

  1. 安装相关依赖
sh 复制代码
npm install --save-dev @rollup/plugin-node-resolve @rollup/plugin-commonjs
  1. 更新配置文件
js 复制代码
// rollup.config.mjs
import typescript from 'rollup-plugin-typescript2';
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
export default {
	input: './main.ts',
	plugins: [
    resolve({
      // browser: true, // 指定使用browser模块
    }),
    commonjs(), // 将CommonJS模块转换成ES6
		typescript({ 
      // tsconfig: path.resolve(__dirname, 'tsconfig.lib.json'), // 指定tsconfig文件
      compilerOptions: {
        lib: ["es5", "es6", "dom"], 
        target: "es5"
      }
    })
	]
}
  1. 可能遇到的问题
  • Missing shims for Node.js built-ins
  • Missing global variable names

如果确定是浏览器环境,@rollup/plugin-node-resolve插件指定参数{ browser: true }

  • 第三方依赖没有编译

默认情况下,对于第三方依赖,rollup-plugin-typescript2不会对其进行编译,导致最终的产物的语法不一致,可以引入@rollup/plugin-babel来针对性的进行编译

sh 复制代码
npm install --save-dev @rollup/plugin-babel
js 复制代码
// rollup.config.mjs
import { babel } from '@rollup/plugin-babel';
import typescript from 'rollup-plugin-typescript2';
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
export default {
	input: './main.ts',
	plugins: [
    resolve({
      // browser: true, // 指定使用browser模块
    }),
    commonjs(), // 将CommonJS模块转换成ES6
		typescript({ 
      // tsconfig: path.resolve(__dirname, 'tsconfig.lib.json'), // 指定tsconfig文件
      compilerOptions: {
        lib: ["es5", "es6", "dom"], 
        target: "es5"
      }
    }),
    babel({ 
      babelHelpers: 'bundled'
    }),
	]
}

拓展Rollup构建:vue项目

  1. 安装相关依赖
sh 复制代码
npm install --save-dev @vitejs/plugin-vue @vitejs/plugin-vue-jsx unplugin-vue-macros rollup-plugin-import-css
  1. 更新配置文件
js 复制代码
// rollup.config.mjs
import { babel } from '@rollup/plugin-babel';
import typescript from 'rollup-plugin-typescript2';
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import vue from '@vitejs/plugin-vue';
import vueJsx from '@vitejs/plugin-vue-jsx';
import VueMacros from 'unplugin-vue-macros/rollup'; 
import css from "rollup-plugin-import-css"; // 处理css文件
export default {
	input: './src/main.ts',
	plugins: [
    VueMacros({
      setupComponent: false,
      setupSFC: false,
      plugins: {
        vue: vue({
          isProduction: true,
        }),
        vueJsx: vueJsx(),
      },
    }),
    resolve({
      extensions: ['.mjs', '.js', '.json', '.ts'],
      browser: true, // 指定使用browser模块
    }),
    commonjs(), // 将CommonJS模块转换成ES6
    css({
      output: 'style.css'
    }),
		typescript(),
    babel({ 
      babelHelpers: 'bundled'
    }),
	],
  output: {
		file: 'dist/bundle.js',
		format: 'cjs'
	}
}
相关推荐
花花鱼6 分钟前
vue3 基于element-plus进行的一个可拖动改变导航与内容区域大小的简单方法
前端·javascript·elementui
k093310 分钟前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
EricWang135831 分钟前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
September_ning31 分钟前
React.lazy() 懒加载
前端·react.js·前端框架
web行路人41 分钟前
React中类组件和函数组件的理解和区别
前端·javascript·react.js·前端框架
超雄代码狂1 小时前
ajax关于axios库的运用小案例
前端·javascript·ajax
长弓三石1 小时前
鸿蒙网络编程系列44-仓颉版HttpRequest上传文件示例
前端·网络·华为·harmonyos·鸿蒙
小马哥编程1 小时前
【前端基础】CSS基础
前端·css
嚣张农民2 小时前
推荐3个实用的760°全景框架
前端·vue.js·程序员
周亚鑫2 小时前
vue3 pdf base64转成文件流打开
前端·javascript·pdf