深入了解rollup(二)常用配置

简介: Rollup是一个JavaScript模块打包器,它可以将多个模块打包成一个单独的文件,以便在浏览器中使用。与其他打包工具相比,Rollup的主要优势在于它可以生成更小、更快的代码。在本文中,我们将深入了解Rollup的常用配置的使用方法。

引言

Rollup是一个JavaScript模块打包器,它可以将多个模块打包成一个单独的文件,以便在浏览器中使用。与其他打包工具相比,Rollup的主要优势在于它可以生成更小、更快的代码。在本文中,我们将深入了解Rollup的常用配置的使用方法。



常用的基本配置

下面是一些常用的Rollup配置及示例说明:

1. input:指定要打包的入口文件路径。可以是单个文件路径或一个包含多个入口文件的对象。

exportdefault {
input: 'src/main.js',
// 或者input: {
main: 'src/main.js',
app: 'src/app.js'  },
// ...}

2. output:指定打包后的输出文件路径及格式。可以是单个输出配置对象或一个包含多个输出配置对象的数组。

exportdefault {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'umd',
name: 'MyLibrary'  },
// 或者output: [
    {
file: 'dist/bundle1.js',
format: 'umd',
name: 'MyLibrary1'    },
    {
file: 'dist/bundle2.js',
format: 'esm'    }
  ],
// ...}

3. plugins:使用插件可以扩展Rollup的功能。可以是单个插件实例或一个包含多个插件实例的数组。

import { terser } from'rollup-plugin-terser';
importresolvefrom'@rollup/plugin-node-resolve';
exportdefault {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'umd'  },
plugins: [
terser(), // 压缩代码resolve() // 解析第三方模块  ],
}

4. external:指定不需要打包的外部依赖库。可以是一个字符串、一个正则表达式、一个函数或一个包含多个匹配规则的数组。

exportdefault {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'umd'  },
external: ['lodash'], // 不打包lodash库// 或者external: id=>/^lodash/.test(id), // 不打包以lodash开头的模块// ...}

5. treeshake:指定是否开启摇树优化,即只打包使用到的代码。默认为true。

exportdefault {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'umd'  },
treeshake: true, // 开启摇树优化// ...}

6. watch:指定是否开启监听模式,即文件变动时自动重新打包。默认为false。

exportdefault {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'umd'  },
watch: true, // 开启监听模式// ...}

7. 模块解析(resolve):指定模块的解析方式,例如别名、扩展名等。

exportdefault {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'umd',
  },
resolve: {
alias: {
'@': './src', // 别名配置    },
extensions: ['.js', '.jsx'], // 扩展名配置  },
// ...}

多产物配置

可以通过配置多个输出对象来实现。每个输出对象都可以指定不同的输出文件路径、格式和其他属性。

我们可以将 output 改造成一个数组,对外暴露出不同格式的产物供他人使用,不仅包括 ESM,也需要包括诸如CommonJSUMD等格式。

import { defineConfig } from'rollup'exportdefaultdefineConfig({
input: 'src/index.js',
output: [
    {
file: 'dist/bundle-iife.js',
format: 'iife'    },
    {
file: 'dist/bundle-esm.js',
format: 'esm'    },
    {
file: 'dist/bundle-cjs.js',
format: 'cjs'    },
    {
file: 'dist/bundle-umd.js',
format: 'umd',
name: 'bundle'    }
  ],
})

通过这种方式,可以根据需要生成不同格式的产物,以满足不同环境或使用场景的需求。

需要注意的是,每个输出对象可以有自己独立的属性配置,例如namesourcemap等。可以根据具体需求在每个输出对象中进行相应配置。

多入口配置

以下是rollup的多入口示例,包括多入口一个产物,多入口多个产物,每个入口对应一种构建方式的情况示例:

  1. 多入口一个产物:
// rollup.config.jsexportdefault {
input: {
main: 'src/main.js',
admin: 'src/admin.js'  },
output: {
file: 'dist/bundle.js',
format: 'iife'  }
}

上述配置中,input指定了两个入口文件main.jsadmin.jsoutput指定了生成的产物文件为bundle.js

  1. 多入口多个产物:
// rollup.config.jsexportdefault [
  {
input: 'src/main.js',
output: {
file: 'dist/main-bundle.js',
format: 'iife'    }
  },
  {
input: 'src/admin.js',
output: {
file: 'dist/admin-bundle.js',
format: 'iife'    }
  }
]

上述配置中,通过数组形式指定了两个配置对象,每个配置对象分别对应一个入口文件和一个输出文件。

  1. 每个入口对应一种构建方式:
// rollup.config.jsexportdefault [
  {
input: 'src/main.js',
output: {
file: 'dist/main-bundle.cjs.js',
format: 'cjs'    }
  },
  {
input: 'src/admin.js',
output: {
file: 'dist/admin-bundle.esm.js',
format: 'esm'    }
  }
]

上述配置中,通过指定不同的format属性,可以分别生成CommonJS和ES模块的产物文件。

以上是rollup的多入口示例,可以根据实际需求进行配置。

动态导入与默认代码分割

以下是rollup的动态导入与默认代码分割的示例:

  1. 动态导入示例:
// main.jsimport('./module.js').then(module=> {
module.default();
});

上述代码中,使用动态导入的方式引入了module.js模块,并在then回调中调用了模块的默认导出函数。

  1. 默认代码分割示例:
// rollup.config.jsexportdefault {
input: 'src/main.js',
output: {
dir: 'dist',
format: 'esm',
chunkFileNames: '[name]-[hash].js'  },
plugins: [
// 插件配置  ]
}

上述配置中,通过设置output.dir属性指定输出目录,设置output.chunkFileNames属性为 [name]-[hash].js,这样每个代码分割出来的模块都会生成一个独立的文件。

  1. 动态导入与默认代码分割结合示例:
// main.jsimport('./module.js').then(module=> {
module.default();
});
// module.jsexportdefaultfunction() {
console.log('Hello from module');
}
// rollup.config.jsexportdefault {
input: 'src/main.js',
output: {
dir: 'dist',
format: 'esm',
chunkFileNames: '[name]-[hash].js'  },
plugins: [
// 插件配置  ]
}

上述示例中,通过动态导入方式引入了module.js模块,并在then回调中调用了模块的默认导出函数。同时,配置了默认的代码分割,将module.js模块分割为一个独立的文件。

打包后的文件结构

插件使用

比如我们现在引入lodash-es库

npm install lodash-es -D

在index.js中使用

import { chunk } from"lodash-es";
constresult=chunk([1, 2, 3, 4], 2);
console.log({ result })

现在直接打包

exportdefault {
input: 'src/index.js',
output: {
dir: 'dist/esm/',
format: 'esm',
  }
}

会出现下面的警告:

点击链接看了下,大致意思就是不能解析lodash-es这个依赖,报出了警告,问是不是需要加上external,也就是把lodash-es这个库给排除出去。

默认情况下,Rollup 只解析相对模块。这意味着像这样的 import 语句

import { chunk } from'lodash-es'

不会导致 lodash-es 被打包到你的包中——相反,它将是运行时需要的外部依赖项。如果这就是你想要的,你可以用 external 选项消除这个警告。

exportdefault {
input: 'src/index.js',
output: {
dir: 'dist/esm/',
format: 'esm',
  },
external: ['lodash-es'], // 消除警告}

再次打包就没问题了。

如果你确实想在打包后的代码中包含这个模块,需要告诉 Rollup 如何找到它。大多数情况下,你可以使用 @rollup/plugin-node-resolve

安装:

npm install @rollup/plugin-node-resolve -D

使用:

import { nodeResolve } from'@rollup/plugin-node-resolve';
exportdefault {
input: 'src/index.js',
output: {
dir: 'dist/esm/',
format: 'esm',
  },
plugins: [nodeResolve()]
// external: ['lodash-es'], // 消除警告}

现在,再次进行打包,无论是打包时间,还是打包内容和之前都很不一样了,把lodash-es中,关于chunk()函数的内容,都打包进了index.js文件中

对于动态加载模块,rollup帮我们自动做了代码分割,其实我们也可以手动的操作,直接在rollup配置中声明

import { nodeResolve } from'@rollup/plugin-node-resolve';
exportdefault {
input: 'src/index.js',
output: {
dir: 'dist/esm/',
format: 'esm',
entryFileNames: '[name].[hash].js',
chunkFileNames: 'chunk-[name].[hash].js',
manualChunks: {
'lodash-es': ['lodash-es']
    }
  },
plugins: [nodeResolve()]
// external: ['lodash-es'], // 消除警告}

总结

总的来说,它是一个强大而灵活的工具,适用于各种规模和类型的JavaScript项目。在本文中介绍了一些常用的配置rollup的动态导入和代码分割以及插件使用。这些只是rollup的一部分,它还有很多配置和技巧可以使用。

目录
相关文章
|
数据可视化 物联网
Threejs物联网,工厂3D可视化
Threejs物联网,工厂3D可视化
1336 15
Threejs物联网,工厂3D可视化
|
数据可视化 JavaScript 前端开发
Turf.js介绍
Turf.js介绍
1626 0
|
数据采集 API C语言
如何在C程序中使用libcurl库下载网页内容
爬虫是一种自动获取网页内容的程序,它可以用于数据采集、信息分析、网站监测等多种场景。在C语言中,有一个非常强大和灵活的库可以用于实现爬虫功能,那就是libcurl。libcurl是一个支持多种协议和平台的网络传输库,它提供了一系列的API函数,可以让开发者方便地发送和接收HTTP请求。
558 0
如何在C程序中使用libcurl库下载网页内容
|
安全 算法 区块链
花无涯带你走进黑客世界之Tor洋葱网络
Tor本来是为用户提供匿名上网保护用户隐私的工具,但是对于一些用户来说,他们可以利用Tor的隐蔽性进行黑客攻击或非法交易活动。总结Tor的恶意应用主要表现在以下几方面。
836 0
|
缓存 JavaScript UED
Vue 中实现组件的懒加载
【10月更文挑战第23天】组件的懒加载是 Vue 应用中提高性能的重要手段之一。通过合理运用动态导入、路由配置等方式,可以实现组件的按需加载,减少资源浪费,提高应用的响应速度和用户体验。在实际应用中,需要根据具体情况选择合适的懒加载方式,并结合性能优化的其他措施,以打造更高效、更优质的 Vue 应用。
|
JavaScript
rollup的input配置和output配置详解
【8月更文挑战第5天】rollup的input配置和output配置详解
585 4
rollup的input配置和output配置详解
|
自然语言处理 语音技术 开发者
ChatTTS超真实自然的语音合成模型
ChatTTS超真实自然的语音合成模型
568 3
|
存储 应用服务中间件 数据库
服务器,你真的了解吗?
服务器是在网络中为其他计算机提供服务的高性能计算机,具备高速CPU运算能力、长时间稳定运行及强大的I/O能力。其主要组件包括CPU、内存、硬盘等,并通过自带管理系统进行数据控制。按外形分为塔式、机架、刀片和高密服务器;按指令集分为CISC(如x86)和RISC(如Unix、ARM);按处理器数量分为单路、双路和多路服务器;按负载类型则有数据库、应用、接入、Web和文件服务器等多种分类。每种服务器针对不同应用场景设计,满足多样化的计算需求。
2525 2
DEAP 自定义交叉操作
本文介绍了如何在遗传算法框架DEAP中实现自定义的交叉操作,通过定义一个`customCrossover`函数,可以在指定的多个基因区间内以一定的概率交换两个个体的基因,提供了具体的代码示例和参数说明。
|
小程序
【干货】微信小程序如何设置背景图片
【干货】微信小程序如何设置背景图片