使用webpack和rollup打包组件库的方法


Posted in Javascript onFebruary 25, 2021

前言

之前做了一个loading的样式组件,为了实现代码的可重用性,将这个小项目打包并且发布在了npm上。在一次次的打包发包过程中经历了一个有一个报错,@buzuosheng/loading这个组件已经到了2.7.0版本,虽然还有一些要调整的地方,但总算是可以用了。

使用webpack和rollup打包组件库的方法

webpack和rollup对比

webpack算是使用程序员使用最多的打包工具,面试中往往会问到webpack的相关问题,而rollup被问到的要少很多。导致这种现象的一个原因是,应用开发使用webpack,库开发使用rollup的说法。

但是两个打包工具都有很强大的插件开发功能,功能差异越来越模糊,但是rollup使用起来更加简洁,而且能打出能小体积的文件。但当我们做前端应用时,性能分析往往要求更小的库,所以rollup更符合开发库的要求。

这次算是一个打包的实验,我们使用两个工具都对这个项目打一次包。

使用webpack打包

在打包之前,需要给package.json文件中添加或更改一些字段。

{
 // 程序主入口模块,用户引用的就是该模块的导出
 "main": "dist/bundle.js",
 // 项目包含的文件
 "files": [
  "src",
  "dist"
 ],
 // 将react和react-dom移动到该配置中,兼容依赖
 "peerDependencies": {
  "react": "^17.0.1",
  "react-dom": "^17.0.1"
 },
}

webpack打包需要用到很多库来处理不同的文件,这个项目比较小,就只用了两个库。

// webpack.config.js
const path = require('path');
const MiniCssExtractPlugin = require("mini-css-extract-plugin");

module.exports = {
 mode: 'production',
 entry: './src/Loading.jsx',
 output: {
  filename: "index.js",
  path: path.join(__dirname, "./dist/"),
  libraryTarget: 'umd',
 },
 optimization: {
  minimize: false,
 },
 resolve: {
  extensions: ['.jsx']
 },
 module: {
  rules: [
   {
    test: /\.css$/,
    loader: [MiniCssExtractPlugin.loader, 'css-loader?modules'],
   },
   {
    test: /\.(js|jsx)$/,
    loader: "babel-loader",
    exclude: /node_modules/,
   },
  ]
 },
 plugins: [
  new MiniCssExtractPlugin({
   filename: "main.min.css" // 提取后的css的文件名
  })
 ],
}

本来应该写开发和生产两个环境下的配置,但在这里只写了production环境下的配置。

使用rollup打包

在rollup中使用的库比较多一点。

// rollup.config.js
// 解决rollup无法识别commonjs的问题
import commonjs from 'rollup-plugin-commonjs'
// babel处理es6代码的转换
import babel from 'rollup-plugin-babel'
// resolve将我们编写的源码与依赖的第三方库进行合并
import resolve from 'rollup-plugin-node-resolve'
// postcss处理css文件
import postcss from 'rollup-plugin-postcss'

export default {
 input: "src/Loading.jsx",
 // 打包一份cjs和一份es的文件
 output: [
  {
   file: "dist/loading.es.js",
   format: "es",
   globals: {
    react: 'React',
   },
  }, {
   file: 'dist/loading.cjs',
   format: "cjs",
   globals: {
    react: 'React',
   },
  },
 ],
 external: ['react'],
 plugins: [
  postcss(
   { extensions: ['.css'] }
  ),
  babel({
   exclude: "node_modules/**",
   runtimeHelpers: true,
  }),
  commonjs(),
  resolve(),
 ],
}

发包到npm

发包到npm只需要几个命令。

npm pack

对项目打包后,命令行输出压缩包的详细信息。

使用webpack和rollup打包组件库的方法

更新版本

npm version [<newversion> | major | minor | patch | premajor | preminor | prepatch | prerelease [--preid=<prerelease-id>] | from-git]

根据本次改动的大小选择不同的命令。

最后使用发布命令。

npm publish

然后就会收到邮件,你的包已经发布成功。

到此这篇关于使用webpack和rollup打包组件库的方法的文章就介绍到这了,更多相关webpack和rollup打包组件库内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
事件模型在各浏览器中存在差异
Oct 20 Javascript
js实现快速分享功能(你的文章分享工具)
Jun 25 Javascript
jquery获取一组checkbox的值(实例代码)
Nov 04 Javascript
用Move.js配合创建CSS3动画的入门指引
Jul 22 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
Sep 01 Javascript
跟我学习javascript的浮点数精度
Nov 16 Javascript
jQuery unbind 删除绑定事件详解
May 24 Javascript
关于RequireJS的简单介绍即使用方法
Oct 20 Javascript
基于Javascript实现的不重复ID的生成器
Dec 25 Javascript
jQuery实现轮播图及其原理详解
Apr 12 jQuery
微信小程序--特定区域滚动到顶部时固定的方法
Apr 28 Javascript
JavaScript正则表达式验证登录实例
Mar 18 Javascript
vue常用高阶函数及综合实例
Feb 25 #Vue.js
原生JS实现音乐播放器的示例代码
Feb 25 #Javascript
详解vite2.0配置学习(typescript版本)
Feb 25 #Javascript
详解vite+ts快速搭建vue3项目以及介绍相关特性
Feb 25 #Vue.js
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
Feb 24 #Javascript
Nest.js散列与加密实例详解
Feb 24 #Javascript
JS canvas实现画板和签字板功能
Feb 23 #Javascript
You might like
不用GD库生成当前时间的PNG格式图象的程序
2006/10/09 PHP
?生?D片??C字串
2006/12/06 PHP
php获取ip的三个属性区别介绍(HTTP_X_FORWARDED_FOR,HTTP_VIA,REMOTE_ADDR)
2012/09/23 PHP
浅谈PHP正则中的捕获组与非捕获组
2016/07/18 PHP
PHP自带方法验证邮箱、URL、IP是否合法的函数
2016/12/08 PHP
PHP正则替换函数preg_replace()报错:Notice Use of undefined constant的解决方法分析
2017/02/04 PHP
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
JavaScript代码里的判断小结
2016/08/22 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
深入学习nodejs中的async模块的使用方法
2017/07/12 NodeJs
关于meta viewport中target-densitydpi属性详解(推荐)
2017/08/18 Javascript
vue webpack实用技巧总结
2018/04/24 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
深入理解使用Vue实现Context-Menu的思考与总结
2019/03/09 Javascript
JavaScript中EventBus实现对象之间通信
2020/10/18 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
在Python的Django框架中创建和使用模版
2015/07/15 Python
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
python实现在pandas.DataFrame添加一行
2018/04/04 Python
python和shell获取文本内容的方法
2018/06/05 Python
详解Python文件修改的两种方式
2019/08/22 Python
浅谈python已知元素,获取元素索引(numpy,pandas)
2019/11/26 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
CSS3 box-shadow属性实例详解
2020/06/19 HTML / CSS
分享一个H5原生form表单的checkbox特效代码
2018/02/26 HTML / CSS
美国电子元器件分销商:Newark element14
2018/01/13 全球购物
大都会艺术博物馆商店:The Met Store
2018/06/22 全球购物
J2ee常用的设计模式?说明工厂模式
2015/05/21 面试题
好的自荐信的要求
2013/10/30 职场文书
门店业绩提升方案
2014/06/08 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
2015年度工程师评职称工作总结
2015/10/14 职场文书
Python中Selenium对Cookie的操作方法
2021/07/09 Python