react发布一个组件库 系列篇(二)
前言
在上篇说到,不是特殊情况,我们尽量还是把源码打包编译成es5之后再发布到npm,这样用户使用的时候就很方便。
接下来我们就还拿上章的代码,使用rollup+babel编译、打包后再发版,来举个例子吧~
安装编译和打包工具
进入到组件库hello-cmp的根目录,安装打包工具rollup和编译工具babel、babel for react的预设
yarn add --dev rollup
yarn add --dev @babel/core @rollup/plugin-babel
yarn add --dev @babel/preset-react
新增编译和打包配置文件rollup.config.js
// rollup.config.js
import path from 'path'
import babel from '@rollup/plugin-babel';
const resolveFile = source => path.resolve(__dirname, source)
export default {
input: "index.jsx",
output: [
{
file: resolveFile('index.js'),
format: 'es'
},
],
plugins: [babel({
"presets": ["@babel/preset-react"]
})]
};
这里要注意下,在被处理的源码处要导入React,编译需要,即index.jsx改为如下
// index.jsx
import React from 'react'; // 即添加这行
export default (props)=>{
return <div>你好啊,{props.msg}</div>
}
编译和打包
准备完以上工作后,我们来打包,执行打包命令
npx rollup --c rollup.config.js
命令完成之后,就可以看到在目录下生成了打包后的文件 index.js
// index.js
import React from 'react';
var index = (props => {
return /*#__PURE__*/React.createElement("div", null, "你好啊", props.msg);
});
export { index as default };
通过观察编译打包后的输出文件内容,我们也能看到rollup打包esm的时候,对于import的是node_modules中内容的时候,基本直接输出模块化语法 并不会像webpack一样自己实现一遍模块处理(大量处理函数包裹包裹代码)
rollup这种做法非常的棒,因为库最终还是给项目用,项目本身的代码和用到的库本身都会再经历过webpack处理一遍。
所以大家经常说 webpack和rollup两者定位不通,rollup适合库打包,而webpack适合最终项目部署打包
发版
修改入口文件,即将packge.json的main改为index.js,最后一键发版npm publish
// packge.json
{
"name": "hello-cmp",
"version": "0.0.1-beta.6",
"description": "",
"main": "index.js",
"files": [
"index.js",
"package.json"
],
"keywords": [],
"author": "",
"license": "ISC"
}
使用
接下来我们在react项目中安装并使用下这个包。
不需要做任何配置(比如上一章节还需要额外配置include)
// src/app.js
import HelloCmp from 'hello-cmp'
function App() {
return (
<div className="App">
<HelloCmp msg="张三"/>
</div>
);
}
export default App;
效果如下
你好啊,张三
其它
有注意到我及使用rollup打包,但是我的插件项目依赖里依然没有这些。
这个其实有没有都可以。
1、运行时的依赖:在确定主项目 即 myApp项目有这些运行时和组件库有哪些共同依赖的情况下,插件本身是可以公用的 反正都在npm里(会自动向上找包)。
2、编译时的依赖: 都已经编译完成了提供给主项目了 主项目本身也不会用到。
3、放不放都没事:放上去也没事,无脑放上去,一个是不用npm和github的packge.json要维护两份。另一个是万一主项目没有,你的组件包用到了找不到 就不会报错。缺点就是在旧版npm情况下,放上依赖只会增加主项目的体积(这在新版npm或yarn上有所改善)
为什么要选择rollup打包呢?
因为一般开发插件或者组件库都不会使用webpack,比如我组件里因为了三方库。
webpack在打包我组件库的时候就会将其打进去,这不是必要的,因为使用者默认都会(是一般使用webpack)处理的导入三方包的语句。我在这里提前处理意义不大,而且还徒增我自己插件或者组件库的体积。还让代码变得巨大不利于阅读。
那为什么不用esbuild或者其他打包工具呢?因为插件较少。
那万一使用者的项目不是webpack,而是直接将包通过标签引入页面 用于浏览器怎么办?
这个时候我们就可以使用webpack给组件打包了,它会将三方包打进去了。
当然也可以继续用rollup打包成iife即可,配置external+output.globals标记外部库,通过cdn引入即可
react发布一个组件库 系列篇(二)的更多相关文章
- 教你一步步发布一个开源库到 JCenter
今天想来分享下,如何一步步自己发布一个开源库到 JCenter 这方面的博客网上已经特别多了,所以本篇并不打算仅仅只是记录流程步骤而已,而是尽可能讲清楚,为什么需要有这个步骤,让大伙知其然的同时还知其 ...
- 如何基于 React 封装一个组件
如何基于 React 封装一个组件 前言 很多小伙伴在第一次尝试封装组件时会和我一样碰到许多问题,比如人家的组件会有 color 属性,我们在使用组件时传入组件文档中说明的属性值如 primary , ...
- Vue3 企业级优雅实战 - 组件库框架 - 12 发布开源组件库
前面使用了 11 篇文章分享基于 vue3 .Monorepo 的组件库工程完整四件套(组件库.文档.example.cli)的开发.构建及组件库的发布.本文属于这 11 篇文章的扩展 -- 如何发布 ...
- 基于react hooks,zarm组件库配置开发h5表单页面
最近使用React Hooks结合zarm组件库,基于js对象配置方式开发了大量的h5表单页面.大家都知道h5表单功能无非就是表单数据的收集,验证,提交,回显编辑,通常排列方式也是自上向下一行一列的方 ...
- 微信小程序 MinUI 组件库系列之 price 价格组件
MinUI 是基于微信小程序自定义组件特性开发而成的一套简洁.易用.高效的组件库,适用场景广,覆盖小程序原生框架.小程序组件化框架等,并且提供了高效的命令行工具.MinUI 组件库包含了很多基础的组件 ...
- xmlplus 组件设计系列之二 - 按钮
除了图标以外,按钮也许是最简单的组件了,现在来看看如何定义按钮组件. 使用原生按钮组件 在 xmlplus 中,HTML 元素也以组件的方式存在.所以,你可以直接通过使用 button 标签或者 in ...
- SpringMVC4+thymeleaf3的一个简单实例(篇二:springMVC与thymeleaf的整合)
延续前篇内容. 开始之前,我们首先要准备以下12个jar文件:spring-aop-4.3.3.RELEASE.jarspring-beans-4.3.3.RELEASE.jarspring-cont ...
- Nginx系列篇二:linux搭建Nginx负载均衡
建议先搭建好Nginx环境 可阅读--->Linux中搭建Nginx 1.准备好三台服务器[标配] 一.nginx负载均衡服务器:192.168.102.110,配置好Nginx 二.tomca ...
- React Native 一个组件styles BUG
'use strict'; var React = require('react-native'); var { StyleSheet, PanResponder, View, Text } = Re ...
- react使用ant-design组件库
新建项目并引入组件 1,全局安装脚手架 npm install -g create-react-app 2,新建项目 create-react-app reactantd 3,安装组件 npm ins ...
随机推荐
- 张高兴的大模型开发实战:(四)使用 LangGraph 实现多智能体应用
目录 环境搭建与配置 定义智能体 加载模型 提取关键词 生成回答 连接智能体 定义图的状态 定义节点方法 根据指令路由 生成回答 文件处理 提取关键词 网络搜索 定义图的结构 运行图 运行指南 在控制 ...
- Asp.net mvc基础(二)Controller给View传递数据的方式
1.ViewData传值 步骤一:通过在控制器中以键值对的形式进行赋值 ViewData["键"] = 值 赋值: 调用: 2.ViewBag传值 ViewBag是dynamic类 ...
- robotframework之数据驱动
用robotframework做接口自动化时,如果执行用例条数比较多时,需要把用例存到表格当中,通过数据驱动读取表格内容. 一.引入第三方库 数据驱动的第三方库:DataDriver 直接在setti ...
- 通过引用实现php无限极分类
/** * 递归加引用实现无限极分类 * @param $items * @return array */ public function getTree2($items) { $array = ...
- ubuntu nginx + php7.2 + mysql5.7环境搭建
一.换源 备份原来的源 sudo cp /etc/apt/sources.list /etc/apt/sources_init.list 更换源 sudo gedit /etc/apt/sources ...
- Python3_python2打包exe文件
最近要把绿盟报告导出脚本打包成一个exe,原本是一个py2的文件Vulreport.py,我做了如下步骤. 1.py2topy3 Python3 2to3.py -w Vulreport.py 2.p ...
- 关于navicat导出和导入sql文件的方法
导出SQL文件 导入SQL文件 导出技巧 导出SQL文件 到处数据库的方法很简单,只需要在要到处的数据库上面右键,选择转储SQL文件,可以选结构和数据...或者结构... 导入SQL文件 导如SQL文 ...
- HMM (隐马尔可夫) 推导 (下) - 参数估计 (EM)
HMM (隐马尔可夫) 推导 (下) - 参数估计 (EM) 回顾 HMM 上篇介绍了HMM这样的一种时序类模型, 即描述了一些观测现象的产生, 是由我们很难观测到的 "隐变量因子" ...
- 提高Flutter应用性能的最佳实践
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- Java Solon v3.3.0 发布(国产优秀应用开发基座)
Solon 框架! Solon 是新一代,Java 企业级应用开发框架.从零开始构建(No Java-EE),有灵活的接口规范与开放生态.采用商用友好的 Apache 2.0 开源协议,是" ...