Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >rollup从0到1

rollup从0到1

作者头像
copy_left
发布于 2021-06-29 03:17:01
发布于 2021-06-29 03:17:01
2.1K00
代码可运行
举报
文章被收录于专栏:方球方球
运行总次数:0
代码可运行

目的

开发基于 typescript ES6 语法, 使用jest eslint 为校验或测试的npm包。 因为需要使用到 ts, 模块化,所以就存在模块编译打包的问题, 现有的打包工具中,webpack , Parcel 更偏向多类型资源 的web应用打包, 对于纯粹的npm工具包来说 rollup 更简单实用, 这里记录rollup的基础使用流程。

概述

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

背景

当期rollup 版本为 2.52.1

安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 全局安装
npm i -g rollup
// 本地安装
npm i -D rollup

简单例子

目录结构

  • root
    • src
    • main.js
    • utils.js
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// main.js
import { call } from './utils'
call('show me')
// utils.js
export function call(...args){
  console.log(...args)
}

命令行打包构建

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rollup -i src/main.js -o lib/main.js
// -i 入口文件地址
// -o 打包后出入目录

打包后的文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function call(...args){
  console.log(...args);
}

call('show me');
// 可以看到rollup 将两个包的内容都合并到了一个文件夹中

package 配置本地打包命令

如果我们不希望输入过长的命令行参数或者rollup 为本地安装时,我们可以通过设置package命令解决.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  'script': {
    'build': 'rollup -c rollup.config.js', // 使用配置文件构建
    'dev': 'rollup -c rollup.config.js -w', // 开启实时监控
  }
}

基础命令

  • -c 指定配置文件
  • -w 监听文件变化,实时构建
  • -i 入口文件
  • -o 输出路径
  • -n 模块名称
  • -m 开启sourcemap

使用配置文件 rollup.config.js

在根目录新建文件rollup.config.js , 使用 -c 命令设置rollup配置的文件路径。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// rollup.config.js
export default {
  input: 'src/main.js',
  output: {
    name: 'rollup-pkg',
    file: 'lib/main.js',
    format: 'cjs'
  }
}

基础配置入门

  • input 打包入口
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  input: 'src/main.js'
}
  • output 输出配置
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
 output: {
    // 包名称
    name: 'rollup-pkg',
    // 包类型
    format:'umd',
    // 输出路径
    file: 'lib/main.js',
  }
}
  • plugins 插件,提供扩展功能, 例如: babel ,typescript 转换等
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pluginResolve from '@rollup/plugin-node-resolve'
import pluginCommonjs from '@rollup/plugin-commonjs'
{
  plugins: [
    // 外部依赖查询
    pluginResolve(),
    // commonjs 转换
    pluginCommonjs()
  ]
}
  • external 外链, 忽略部分依赖
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
   external: ['vue']
}
  • globals 全局模块, 为类似 jquery 挂载在全局对象上的模块指定挂载点
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
globals: {
  jquery: '$'
}

配置进阶

多类型输出

output 可以接收配置数组, 打包输入多种形式的结果文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  output: [
    {
      // umd
      name: 'pks',
      file: 'lib/main.umd.js',
      format: 'umd'
    },
    {
      // esm
      name: 'pks',
      file: 'lib/main.esm.js',
      format: 'esm'
    }
  ]
}
// 输出后的文件目录
// lib
// - main.umd.js
// - main.esm.js

独立plugins 配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  plugins: [....],
  output: [
    {
      ...
      // 为某一输入指定独立的plugins
      plugings: [pluginStrip()]
    }
  ]
}

sourcemap、sourcemapFile

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  output: {
     ...
    sourcemap: true // 是否生成sourcemap
    sourcemapFile: '' // sourcemap 输出地址
  }
}

banner、 footer 文件首尾插入内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  output: {
     // 插入版本号
     banner: '/* my-library version: v4.1.1 */',
     footer: '/* author copy-left */'
  }
}

配置列表

导出配置可以为列表, 同时构建多个包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export default [
  // 第一组配置, 输出到 lib/ 目录
  {
    input: 'src/main.ts',
    plugins: [
      pluginResolve({
        extensions: ['.js', '.jsx', '.ts', '.tsx'],
      }),
      pluginCommonjs(),
      pluginEslint({
        throwOnError: true,
        throwOnWarning: false,
        include: ['src/**'],
        exclude: ['node_modules/**']
      }),
      pluginTypescript2({
        clean: true,
        tsconfig: './tsconfig.json'
      })
    ],
    output: [
      {
        name: 'roll',
        file: 'lib/main.umd.js',
        format: 'umd'
      },
    ],
  },
  // 第二组配置, 输出到 dist/ 目录
  {
    input: 'src/index.ts',
    plugins: [
      pluginResolve({
        extensions: ['.js', '.jsx', '.ts', '.tsx'],
      }),
      pluginCommonjs(),
      pluginEslint({
        throwOnError: true,
        throwOnWarning: false,
        include: ['src/**'],
        exclude: ['node_modules/**']
      }),
      pluginTypescript2({
        clean: true,
        tsconfig: './tsconfig.json'
      })
    ],
    output: [
      {
        name: 'roll',
        file: 'dist/main.esm.js',
        format: 'esm'
      },
    ],
  }

watch 配置项

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  // 包含目录
  include: 'src/**',
  // 忽略目录
  exclude: 'node_modules' 
}

常用插件 - Plugins

@rollup/plugin-node-resolve

模块查询,告诉rollup 如何查询node_modules内的依赖模块。

  • 使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pluginResolve from '@rollupplugin-node-resolve'
{
  plugins: [ pluginResolve({...options}) ]
}
  • options
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  // 入口匹配
  exportConditions: ['default', 'module', 'import'],
  // 是否为浏览器环境, false 时将忽略所有浏览器属性
  browser: false,
  // 模块查询目录
  moduleDirectories: ['./src'],
  // 强制定位到根节点的 `node_modules` 包, 防止同类包的多次绑定
  dedupe: [],
  // 可操作的文件类型
  extensions: ['.js', '.jsx', '.ts', '.tsx'],
  // 限制包的查询路径范围
  jail: ['/'],
  // 用于扫描的属性?
  mainFields: ['browser', 'jsnext:main', 'module', 'main'],
  // 是否只处理断言为 ES2015 的模块
  modulesOnly: false,
  // 只查询匹配模式的路径, 未匹配的模块将作为外部模块
  resolveOnly: ['batman', /^@batcave\/.*$/],
  // 模块根目录, 配合 dedupe 属性使用
  rootDir: process.cwd(),
  // 忽略package 中的 sideEffects 设置
  ignoreSideEffectsForRoot: false,
}
  • 实战使用比对
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// main.js
import dayjs from 'dayjs'
import { call } from './utils'
call(dayjs().format('YYYY-MM-DD'))
// 未使用,ES模式打包结果
import dayjs from 'dayjs';


function call(...args){
  console.log(...args);
}


call(dayjs().format('YYYY-MM-DD'));


// 使用后,ES模式打包结果
var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};


function createCommonjsModule(fn, module) {
    return module = { exports: {} }, fn(module, module.exports), module.exports;
}
 // 引入dayjs包
var dayjs_min = createCommonjsModule(.....);


function call(...args){
  console.log(...args);
}


call(dayjs_min().format('YYYY-MM-DD'));

@rollup/plugin-commonjs

将commonjs模块转换为 ES6 模块, 当我们导入commonjs 包时, commonjs 模块无法直接被rollup解析,需要先转换为ES6 模块。该包配合 @rollup/plugin-node-reslove 来正确处理外部依赖的引入问题

  • 使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pluginCommonjs from '@rollup/plugin-commonjs'
{
  plugins: [pluginCommonjs()]
}
  • options
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  // 动态引入处理,为需要动态引入的模块,创建模拟commojs环境
  dynamicRequireTargets: [
     // 需要处理的文件
     'node_modules/logform/*.js',
     // ! 标记不需要处理的文件
     '!node_modules/logform/index.js',
  ],
  // 忽略某些文件
  exclude: [],
  // 包含某些文件
  include: [],
  // 导入其他非js扩展文件
  extensions: ['.js']// 忽略全局对象
  ignoreGlobal: false,
  // 是否生成 sourceMap
  sourceMap: true,
  // 对于同时使用 es6 和 commonjs require 的情况,是否使用混合模式
  transformMixedEsModules: false,
   // 需要忽略的 require
  ignore: [(id) => id !== ''],
  ignoreTryCatch: false,
  ignoreDynamicRequires: false,
  // 定义转换后的包引入写法, 例如: const foo = require('foo'); 转换为 import foo from 'foo';
  esmExternals: false,
  // default 默认导入的处理方式
  defaultIsModuleExports: 'auto',
  // 处理 require 引入返回值
  requireReturnsDefault: false
}

@rollup/plugin-eslint

引入eslint 规则校验, 如果根目录包含.eslintrc.* 配置文件, 将被自动加载到配置中, 这里需要注意插件的引入位置, 应在其他编译,转换插件之前。 例如: pluginEslint(...) pluginTypescript2(...)。 保证eslint 处理的是源码,而非编译后的转换代码。

  • 使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pluginEslint from '@rollup/plugin-eslint'
{
  plugins: [
    pluginEslint({
      fix: true,
      throwOnError: true,
      throwOnWarning: true,
    })
  ]
}
  • options
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  // 是否自动格式化
  fix: false,
  // 显示错误提示
  throwOnError: false,
  // 显示警告提示
  throwOnWarning: false,
  // 包含文件
  include: [],
  // 忽略文件
  exclued: [],
  // 格式化处理函数
  formatter: ''
}

rollup-plugin-typescript2

typescript 转换

  • 使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pluginTypescript from 'rollup-plugin-typescript2'
{
  plugins: [
    pluginTypescript({
      tsconfig: './src/tsconfig.json' // 引入本地tsconfig.json
    })
  ]
}
  • options
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  // 工作目录
  cwd: process.cwd(),
  // 默认tsconfig 配置
  tsconfigDefaults: {...},
  // tsconfig配置路径
  tsconfig: './src/tsconfig.json',
  // 覆盖 tsconfig,  优先级 tsconfigOverride > tsconfig > tsconfigDefaults
  tsconfigOverride:{...},
  // 是否做校验
  check: true,
  // 错误级别;  0: Error 1: Warning 2: Info 3: Debugs
  verbosity: 1,
  // 是否删除旧的构建文件
  clean: false,
  // 缓存地址
  cacheRoot: '',
  // 包含项规则
  include: [ "*.ts+(|x)", "**/*.ts+(|x)" ],
  // 排除项规则
  exclude: [ "*.d.ts", "**/*.d.ts" ],
  // 错误忽略
  abortOnError: true,
  rollupCommonJSResolveHack:false,
  objectHashIgnoreUnknownHack: false,
  // 是否使用tsconfig内的类型文件导出路径
  useTsconfigDeclarationDir:false,
  // 导入无法被映入的ts模块
  typescript: '',
  transformers: ''
}

@rollup/plugin-babel

插件将默认加载根目录下的 babel.config.js 配置文件

  • 使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import * as pluginBabel from '@rollup/plugin-babel'
{
   plugins: [
     pluginBabel.babel({
        babelHelpers: 'bundled',
        include: ['src/**'],
        exclude: ['node_modules/**']
     })
  ]
}

rollup-plugin-terser

代码压缩

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pluginTerser from 'rollup-plugin-terser'
{
  ...
  plugins: [
    pluginEslint({
      throwOnError: true,
      throwOnWarning: true,
      include: ['./src/**'],
    }),
    pluginNodeResolve(),
    pluginCommonjs(),
    pluginTypescript2({
      tsconfig: './tsconfig.es5.json'
    }),
    pluginTerser.terser() // 放在末尾,导出编译后的压缩文件
  ]
}

官方插件库

实例DEMO地址

rollup-learning-demo

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
rollup + typescript 构建 ts 包
安装依赖 rollup 打包工具 rollup-plugin-node-resolve 依赖引入插件 rollup-plugin-commonjs commonjs 转换 rollup-plugin-eslint eslint 校验 rollup-plugin-typescript2 ts 转换 @typescript-eslint/parser eslint ts 解析器 typescript ts解析器 rollup 配置 import path from 'path' import resolve f
copy_left
2020/10/26
6.3K1
使用 Rollup + TypeScript 编写库
其中,dist 目录一般是通过 Rollup 等打包器打包后的入口文件,一般具有多种格式,以不同后缀命令,如: index.cjs.js index.esm.js。lib 和 esm 目录可以是 TypeScript 编译后生成的文件,目录下的结构基本和原项目结构相同,只是后缀变为 js,lib 一般为 CommonJS 格式,esm 为 ESModule 格式。而这些是一个库最基本的需要发布的文件。
Innei
2021/12/28
2.5K0
rollup打包入门到实践
rollup在业务中基本很少会有接触到,通常在我们的业务中大部分接触的脚手架,或者自己搭建项目中,我们都是用webpack,无论是vue-cli,还是react-create-app他们都是基于webpack二次封装的脚手架,所以我们对rollup更陌生一点,本文是一篇关于rollup的学习笔记,希望看完在项目中有所思考和帮助。
Maic
2022/12/21
1.4K0
rollup打包入门到实践
使用rollup打包React Native插件并发布
我们写组件库或工具库时不可避免会用到外部库,这些外部库可能是符合 CommonJS 规范的。而 Rollup 力图实现 ES 模块的规范, 因此,加载 CommonJS 模块和使用 Node 模块位置解析逻辑都被实现为可选插件,默认情况下不在 Rollup 内核中。我们需要安装并配置 CommonJS 和 node-resolve 插件。
用户1250838
2021/05/31
2.3K0
Rollup初探
需要注意的是参数 -f 是 --output.format 的缩写,用来指定 bundle 的类型,有以下选项:
用户1515472
2019/07/24
1K0
Rollup初探
前端组件/库打包利器rollup使用与配置实战
写rollup的文章是因为笔者最近要规范前端开发的业务流程和架构,并提供内部公有组件库和工具库供团队使用。在查阅大量资料并对比了webpack和rollup的优缺点之后,最终选择rollup来作为打包工具,我们最终要实现通过npm的方式安装我们的组件库和工具库:
徐小夕
2019/10/23
2.6K0
前端组件/库打包利器rollup使用与配置实战
函数库Rollup构建优化
本节涉及的内容源码可在vue-pro-components c7 分支[1]找到,欢迎 支持!
程序员白彬
2023/03/02
1.2K0
函数库Rollup构建优化
rollup.js 初体验
近期准备写一个工具包 @kuizuo/utils,由于要将其发布到npm上,必然就要兼容不同模块(例如 CommonJS 和 ESModule),通过打包器可以很轻松的将代码分别编译成这不同模块格式。
愧怍
2022/12/27
6670
rollup.js 初体验
基于rollup打造组件库,你可能会用到这些插件
最近在重复赵轮子,用rollup搞一个react 组件库,今天就简单整理下用到的插件。
zz_jesse
2022/05/22
1.1K0
基于rollup打造组件库,你可能会用到这些插件
rollup打包ts+react最佳实践
前段时间系统性学习了webpack,针对于打包项目,webpack的确非常强大,也非常合适,但是用来打包组件库,就显得比较的繁琐。相较而言,使用rollup打包组件库,就显得非常的简单容易,而本文也将介绍它的基础用法。
Jou
2022/11/14
3.8K0
rollup打包ts+react最佳实践
自建npm包-搭建,打包,调试,发布
简介 这里总结一个简单的npm包搭建,打包,调试,发布的基础点. 涉及内容 npm初始化 package.json 配置 eslint配置 babel配置 rollup打包 包初始化 // 新建包目录 md my-pkg // 进入包目录 cd my-pkg // npm 初始化 npm init -y package.json配置 { name: 'my-pkg', // 包名 main: 'lib/index.js', // 包加载时的入口文件 version: 0.
copy_left
2020/09/16
3.1K0
手把手教你使用Rollup打包并发布自己的工具库
随着前端生态的繁荣,工具库几乎是高效开发的必需品,lodash/dayjs/numberal等实用的工具库相信大家都用过。
huofo
2022/03/17
2.9K0
手把手教你使用Rollup打包并发布自己的工具库
Rollup 基本概念及使用
Rollup是一款基于ESModule模块规范实现的JavaScript打包工具,在前端社区中赫赫有名,同时也在Vite的架构体系中发挥着重要作用。不仅是Vite生产环境下的打包工具,其插件机制也被Vite所兼容,可以说是Vite的构建基石。
xiangzhihong
2023/05/23
1.1K0
Rollup 基本概念及使用
Rollup模块打包踩坑指南
Rollup是一个轻量级javascript模块打包器。相比于Webpack,Rollup更适合打包library。Rollup基于ES6模块,ES模块允许通过静态分析,实现tree-shaking优化,删除冗余代码。
luciozhang
2023/04/22
3K0
【入门教程】Rollup模块打包器整合
注意:name为推荐选项,未指明打包后的模块名称,虽然打包产物可以正常加载但无法触发执行。
前端小鑫同学
2022/12/26
1.3K0
【入门教程】Rollup模块打包器整合
会写 TypeScript 但你真的会 TS 编译配置吗?
随着 TypeScript 的流行,越来越多的项目通过使用 TypeScript 来实现编写代码时候的类型提示和约束,从开发过程中减少 BUG 出现的概率,以此提升程序的健壮性和团队的研发效率。
小东同学
2022/07/29
4K1
会写 TypeScript 但你真的会 TS 编译配置吗?
实用程序包utils - 基于Rollup打包输出各模块文件(二)
上一次,我们讲到了如何去搭建一个前端工具库的工程,那么今天我们来聊一聊如何去将其打包输出。
江涛学编程
2021/07/14
8390
Rollup的基本使用
rollup.js是一个模块打包工具,可以使项目从一个入口文件开始,将所有使用到的模块文件都打包到一个最终的发布文件中,Rollup极其适合构建一个工具库,Vue.js源码就是通过Rollup打包构建的。
WindRunnerMax
2021/02/25
1.3K0
Vite 特性和部分源码解析
本文首发于政采云前端团队博客:Vite 特性和部分源码解析 https://www.zoo.team/article/about-vite Vite 的特性 Vite 的主要特性就是 Bundle
政采云前端团队
2021/07/19
8390
Rollup
什么是Rollup rollup.js是Javascript的ES模块打包器,我们熟知的Vue、React等诸多知名框架或类库都通过rollup.js进行打包。与Webpack偏向于应用打包的定位不同,rollup.js更专注于Javascript类库打包(虽然rollup.js也可以提供资源打包,但显然这不是它的强项)。在我们学习Vue和React等框架源码或者自己编写Javascript类库时,rollup.js是一条必经之路。 Rollup 的好处 Tree Shaking: 自动移除未使用的代
念念不忘
2019/05/10
1.7K0
相关推荐
rollup + typescript 构建 ts 包
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验