前言

在上篇说到,不是特殊情况,我们尽量还是把源码打包编译成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. C++宏定义中可变参数列表__VA_ARGS__ 及 QT 提供的宏 QT_OVERLOADED_MACRO

    1. 基本用法 VA_ARGS 是 C/C++ 中的预定义宏,用于在宏定义中表示可变参数列表(Variadic Arguments),需与省略号 ... 配合使用.其核心作用是将宏调用中的可变参数原样 ...

  2. unity prefab

    1.修改prefab原始资源某组件为enabled或disabled,实例如果起初和原始资源是一样的状态那么修改原始资源会作用到实例上,如果发现不一样那么原始资源的修改不会作用到实例上,而且以后都不会 ...

  3. Selenium自动安装并引用浏览器驱动的方法

    以往的程序是先下载和把浏览器驱动放在指定目录,然后在基本中引用驱动完成整个浏览器环境配置 刚好在网上看到一个更加简便的方法,记录下来 1.先安装第三方库webdriver_manager,pip in ...

  4. python3安装xlutils模块

    下载: https://www.cnpython.com/pypi/xlutils/dl-xlutils-2.0.0-py2.py3-none-any.whl#google_vignette 安装: ...

  5. Java Objects.equals(a,b)的说明

    一:值是null的情况: a.equals(b), a 是null, 抛出NullPointException异常. a.equals(b), a不是null, b是null, 返回false Obj ...

  6. RPC实战与核心原理之安全体系

    安全体系:如何建立可靠的安全体系? 回顾 异步化".调用方利用异步化机制实现并行调用多个服务,以缩短整个调用时间:而服务提供方则可以利用异步化把业务逻辑放到自定义线程池里面去执行,以提升单机 ...

  7. B1076 Wifi密码 (15 分)

    描述 下面是微博上流传的一张照片:"各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1:B-2:C-3:D-4:请同学们自 ...

  8. Third Maximum Number——LeetCode⑬

    //原题链接https://leetcode.com/problems/third-maximum-number/ 题目描述 Given a non-empty array of integers, ...

  9. 已经在为VKProxy写UI配置站点和文档了

    VKProxy 是使用c#开发的基于 Kestrel 实现 L4/L7的代理 有兴趣的同学点个赞呗 目前已经在写文档了, 文档在 https://fs7744.github.io/VKProxy.Do ...

  10. IntelliJ IDEA 中,项目文件右键菜单没有svn选项解决办法

    问题描述 欲在IntelliJ IDEA中提交文件至SVN,但是在项目文件上点击右键时,发现右键菜单中没有Subversion的选项,正常情况下是要有的,如下图所示: 图0 解决办法 点击菜单:VCS ...