前言

在上篇说到,不是特殊情况,我们尽量还是把源码打包编译成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发布一个组件库 系列篇(二)的更多相关文章

  1. 教你一步步发布一个开源库到 JCenter

    今天想来分享下,如何一步步自己发布一个开源库到 JCenter 这方面的博客网上已经特别多了,所以本篇并不打算仅仅只是记录流程步骤而已,而是尽可能讲清楚,为什么需要有这个步骤,让大伙知其然的同时还知其 ...

  2. 如何基于 React 封装一个组件

    如何基于 React 封装一个组件 前言 很多小伙伴在第一次尝试封装组件时会和我一样碰到许多问题,比如人家的组件会有 color 属性,我们在使用组件时传入组件文档中说明的属性值如 primary , ...

  3. Vue3 企业级优雅实战 - 组件库框架 - 12 发布开源组件库

    前面使用了 11 篇文章分享基于 vue3 .Monorepo 的组件库工程完整四件套(组件库.文档.example.cli)的开发.构建及组件库的发布.本文属于这 11 篇文章的扩展 -- 如何发布 ...

  4. 基于react hooks,zarm组件库配置开发h5表单页面

    最近使用React Hooks结合zarm组件库,基于js对象配置方式开发了大量的h5表单页面.大家都知道h5表单功能无非就是表单数据的收集,验证,提交,回显编辑,通常排列方式也是自上向下一行一列的方 ...

  5. 微信小程序 MinUI 组件库系列之 price 价格组件

    MinUI 是基于微信小程序自定义组件特性开发而成的一套简洁.易用.高效的组件库,适用场景广,覆盖小程序原生框架.小程序组件化框架等,并且提供了高效的命令行工具.MinUI 组件库包含了很多基础的组件 ...

  6. xmlplus 组件设计系列之二 - 按钮

    除了图标以外,按钮也许是最简单的组件了,现在来看看如何定义按钮组件. 使用原生按钮组件 在 xmlplus 中,HTML 元素也以组件的方式存在.所以,你可以直接通过使用 button 标签或者 in ...

  7. SpringMVC4+thymeleaf3的一个简单实例(篇二:springMVC与thymeleaf的整合)

    延续前篇内容. 开始之前,我们首先要准备以下12个jar文件:spring-aop-4.3.3.RELEASE.jarspring-beans-4.3.3.RELEASE.jarspring-cont ...

  8. Nginx系列篇二:linux搭建Nginx负载均衡

    建议先搭建好Nginx环境 可阅读--->Linux中搭建Nginx 1.准备好三台服务器[标配] 一.nginx负载均衡服务器:192.168.102.110,配置好Nginx 二.tomca ...

  9. React Native 一个组件styles BUG

    'use strict'; var React = require('react-native'); var { StyleSheet, PanResponder, View, Text } = Re ...

  10. react使用ant-design组件库

    新建项目并引入组件 1,全局安装脚手架 npm install -g create-react-app 2,新建项目 create-react-app reactantd 3,安装组件 npm ins ...

随机推荐

  1. 张高兴的大模型开发实战:(四)使用 LangGraph 实现多智能体应用

    目录 环境搭建与配置 定义智能体 加载模型 提取关键词 生成回答 连接智能体 定义图的状态 定义节点方法 根据指令路由 生成回答 文件处理 提取关键词 网络搜索 定义图的结构 运行图 运行指南 在控制 ...

  2. Asp.net mvc基础(二)Controller给View传递数据的方式

    1.ViewData传值 步骤一:通过在控制器中以键值对的形式进行赋值 ViewData["键"] = 值 赋值: 调用: 2.ViewBag传值 ViewBag是dynamic类 ...

  3. robotframework之数据驱动

    用robotframework做接口自动化时,如果执行用例条数比较多时,需要把用例存到表格当中,通过数据驱动读取表格内容. 一.引入第三方库 数据驱动的第三方库:DataDriver 直接在setti ...

  4. 通过引用实现php无限极分类

    /** * 递归加引用实现无限极分类 * @param $items * @return array */ public function getTree2($items) {   $array = ...

  5. ubuntu nginx + php7.2 + mysql5.7环境搭建

    一.换源 备份原来的源 sudo cp /etc/apt/sources.list /etc/apt/sources_init.list 更换源 sudo gedit /etc/apt/sources ...

  6. Python3_python2打包exe文件

    最近要把绿盟报告导出脚本打包成一个exe,原本是一个py2的文件Vulreport.py,我做了如下步骤. 1.py2topy3 Python3 2to3.py -w Vulreport.py 2.p ...

  7. 关于navicat导出和导入sql文件的方法

    导出SQL文件 导入SQL文件 导出技巧 导出SQL文件 到处数据库的方法很简单,只需要在要到处的数据库上面右键,选择转储SQL文件,可以选结构和数据...或者结构... 导入SQL文件 导如SQL文 ...

  8. HMM (隐马尔可夫) 推导 (下) - 参数估计 (EM)

    HMM (隐马尔可夫) 推导 (下) - 参数估计 (EM) 回顾 HMM 上篇介绍了HMM这样的一种时序类模型, 即描述了一些观测现象的产生, 是由我们很难观测到的 "隐变量因子" ...

  9. 提高Flutter应用性能的最佳实践

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  10. Java Solon v3.3.0 发布(国产优秀应用开发基座)

    Solon 框架! Solon 是新一代,Java 企业级应用开发框架.从零开始构建(No Java-EE),有灵活的接口规范与开放生态.采用商用友好的 Apache 2.0 开源协议,是" ...