rollup3.x+vue2打包组件的实现
作者:知了清语 发布时间:2024-05-22 10:43:40
vue2 和vue3 在 rollup 里面打包会存在几种问题, 包版本的问题,babel 转换jsx等问题
将vue2写的组件 打成一个包,需要解决如下几个问题
支持jsx
支持less, sass
导出多种格式的包 ES Module umd 等
先梳理完成功能所需要的最小的包清单,以及包之间的依赖关系
包的依赖关系
转换css 需要使用rollup-plugin-postcss 插件 --> 需要安装 postcss
vue 和 vue-template-compiler 的版本需要一致, 这里是vue 2.7;
vue2: 使用rollup-plugin-vue @5.x版本
rollup3.x + vue3版本需要使用 rollup-plugin-vue @6.x版本 + @vue/compiler-sfc
jsx的支持就需要下面2个包; 这2个包需要传递给 babel, 因此需要安装 @rollup/plugin-babel (这里版本说明在下面)
@vue/babel-helper-vue-jsx-merge-props ^1.4.0
@vue/babel-preset-jsx ^1.4.0
@rollup/plugin-babel 版本说明
5.2.1 配置babel的写法
rollup.config.js
import { defineConfig } from 'rollup'
import vue from 'rollup-plugin-vue'
import { cleandir } from 'rollup-plugin-cleandir'
import { babel } from '@rollup/plugin-babel';
import postcss from 'rollup-plugin-postcss'
export default defineConfig({
input: './src/index.js',
output: [
{
file: 'lib/index.esm.js',
format: 'esm',
exports: 'named'
},
{
file: 'lib/index.umd.js',
format: 'umd',
name: 'w'
}
],
plugins: [
cleandir('lib'),
vue({}),
babel({
exclude: 'node_modules/**',
presets: ['@vue/babel-preset-jsx'],
// bundled-需要显示指明babelHelpers 配置, 没配置,控制台有一些warning
babelHelpers: 'bundled',
// 5.2.1 是可以不用配置 extensions
// 5.2.2 以后 需要将 vue配置进去
// extensions:['.js', '.jsx', '.es6', '.es', '.mjs','.vue'],
}),
// 需要处理vue中的css
postcss()
],
external: [
"Vue"
]
})
6.0.3 配置jsx的写法
@rollup/plugin-babel 6.x 版本也可以用上面的语法,主要就是 extensions 中有 .vue
rollup.config.js
import { defineConfig } from 'rollup'
import vue from 'rollup-plugin-vue'
import { cleandir } from 'rollup-plugin-cleandir'
import { babel } from '@rollup/plugin-babel';
import postcss from 'rollup-plugin-postcss'
export default defineConfig({
input: './src/index.js',
output: [
{
file: 'lib/index.esm.js',
format: 'esm',
exports: 'named'
},
{
file: 'lib/index.umd.js',
format: 'umd',
name: 'w'
}
],
plugins: [
cleandir('lib'),
vue({
}),
babel({
// @rollup/plugin-babel 6.0.3 如果使用 filter 就注释掉 exclude - 互斥的
// exclude: 'node_modules/**',
presets: ['@vue/babel-preset-jsx'],
// 需要显示指明babelHelpers 配置, 没配置,控制台有一些warning
babelHelpers: 'bundled',
// 5.2.1 是不需要配置 extensions 的
// 5.2.2 以后 需要将 vue配置进去
extensions:['.js', '.jsx', '.es6', '.es', '.mjs','.vue'],
// filter @rollup/plugin-babel 在 5.3.0 版本才有
// filter配置和 exclude 配置是互斥的,需要自己去实现去掉 node_modules的过滤
filter: id=>{
return /(\.js|\.jsx|\.es6|\.es|\.mjs)$/.test(id) && !/node_modules/.test(id)
}
}),
// 处理 vue中的 css
postcss()
],
external: [
"Vue"
]
})
6.0.3 package.json清单
{
"name": "chapter-08",
"version": "1.0.0",
"description": "",
"main": "lib/index.js",
"module": "lib/index.esm.js",
"type": "module",
"scripts": {
"build": "rollup -c"
},
"devDependencies": {
"@babel/core": "^7.21.3",
"@rollup/plugin-babel": "^6.0.3",
"@vue/babel-helper-vue-jsx-merge-props": "^1.4.0",
"@vue/babel-preset-jsx": "^1.4.0",
"postcss": "^8.4.21",
"rollup": "^3.20.0",
"rollup-plugin-cleandir": "^2.0.0",
"rollup-plugin-postcss": "^4.0.2",
"rollup-plugin-vue": "^5.1.9",
"vue": "2.7.10",
"vue-template-compiler": "2.7.10"
}
}
这里列举了所有的包的版本, package.json已经剔除了 其他非必要的字段
注意:package.json中的 type 是 module ; 也就是说, 语法需要遵循 ES Module
问题:
1、jsx语法无法识别, 按照上面的配置去调整即可
2、vue中 样式无法被转换,直接使用postcss转换即可
如果已经开始实践使用vite打包 vue组件库,建议直接上 vite + vue 3.x , vite的生态已经足够帮你解决一些棘手的问题,避免自己逐一从 rollup 起手。
最后
网上很多文章,告诉你如何配置 rollup , 一次性下载很多包,虽然模仿着做了,但是,可能依旧会报错;
本次从包的关联关系,包的版本说明,以及出现问题如何解决,记录一次 rollup 配置 vue 打包实践。
来源:https://juejin.cn/post/7212929901602308133


猜你喜欢
- 有时,在用import导入项目文件夹里自己写的python文件时,常常说找不到该文件,这时可以将项目路径添加到PYTHONPATH下。暂时添
- eWebEditor编辑器按钮失效,IE8下eWebEditor编辑器无法使用问题解决方法有两个,一个是下面的方法通过修改js文件,其实我们
- 本文实例讲述了Python实现破解12306图片验证码的方法。分享给大家供大家参考,具体如下:不知从何时起,12306的登录验证码竟然变成了
- 运算符的优先级和关联性运算符的优先级和关联性: 运算符的优先级和关联性决定了运算符的优先级。运算符优先级这用于具有多个具有不同优先级的运算符
- 这也是老早前整理的了,也贴出来吧:1. showModalDialog和showModelessDialog的异同
- 有些页面并不能直接用requests获取到内容,会动态执行一些js代码生成内容。这个文章主要是对付那些特殊页面的,比如必须要进行js调用才能
- 一直用的TensorFlow(keras)来完成一些工作,因许多论文中的模型用pytorch来实现,代码看不懂实在是不太应该。正好趁此假期,
- 最流行的数据交换格式之一是 CSV 格式。是需要通过键盘和控制台以外的方式将信息输入和输出的程序,通过文本文件交换信息是在程序之间共享信息的
- 前言默认情况下SQL SERVER的安装路径与数据库的默认存放路径是在C盘的--这就很尴尬。平时又不注意,有天发现C盘的剩余空间比较吃紧了,
- 第一种情况:有RAID,还需要做数据库备份吗?回答:需要。有了RAID,万一部份磁盘损坏,可以修复数据库,有的情况下数据库甚至可以继续使用。
- 要知道我们程序猿也是需要浪漫的,小博我之前在网上搜寻了很多代码,确发现好多都不是最新的,所以自己就整理了一下代码,现在与广大博友们分享下我们
- 引言对 axios 二次封装,更加的可配置化、扩展性更加强大灵活通过 class 类实现,class 具备更强封装性(封装、继承、多态),通
- 附上代码与运行结果截图:import time# 获取当前时间now = time.localtime()# 格式化日期now_ = tim
- 本文实例讲述了PHP 对象继承原理与简单用法。分享给大家供大家参考,具体如下:对象继承继承已为大家所熟知的一个程序设计特性,PHP 的对象模
- 本文实例讲述了Python栈的实现方法。分享给大家供大家参考,具体如下:Python实现栈栈的数组实现:利用python列表方法代码如下:#
- 一、前言前几天需要划分数据集,就写了一个小demo去完成这个任务。随机划分图片数据集任务描述:我的所有图片保存在同一个文件夹里,需要随机将图
- os包想要使用os包一样要先导入:import osos包下可以直接调用的函数下面介绍一下os包中可以直接调用的函数:例子:例子:例子:注意
- 如今,随着深度学习的发展,python已经成为了深度学习研究中第一语言。绝大部分的深度学习工具包都有python的版本,很多重要算法都有py
- 前言在本文中,我们将介绍10个示例,以掌握如何使用用于Python的Seaborn库创建图表。任何数据产品的第一步都应该是理解原始数据。对于
- 传统来说,大家在CSS中使用的颜色要么是16进制格式,要么是rgb格式,就像rgb(171,205,239)。CSS3带来了一些新的处理颜色