首页 > 其他分享 >react发布一个组件库 系列篇(一)

react发布一个组件库 系列篇(一)

时间:2022-08-19 15:34:07浏览次数:62  
标签:node 系列 js react 组件 jsx hello cmp

前言

经常使用别人写好的组件库,然后安装引入使用即可。比如:

npm install beautiful-table
import BeautifulTable from 'beautiful-table'

function App() {
  return (
    <div className="App">
      <BeautifulTable/>
    </div>
  );
}

export default App;

那接下来,我们从头到尾一点点将这个组件库写出来,并且发版到npm平台上!

这个组件我们起名字 哈喽组件, 即 hello-componet简写下 hello-cmp。
然后我们再新建一个react简单项目 起名为myApp,在这个项目使用组件库hello-cmp。

可否将源代码直接发包

这是最简单的方式,不用任何打包工具打包,直接将源码发布到npm上。

├── index.jsx                 组件核心
├── package.json
// index.jsx
export default (props)=>{
    return <div>你好啊,{props.msg}</div>
}
// package.json
{
  "name": "hello-cmp",
  "version": "0.0.1-beta.2",
  "description": "",
  "main": "index.jsx",
  "keywords": [],
  "author": "",
  "license": "ISC"
}

接下来我们在react项目中安装并使用下这个包

// src/app.js
import HelloCmp from 'hello-cmp'

function App() {
  return (
    <div className="App">
      <HelloCmp msg="张三"/>
    </div>
  );
}

export default App;

尴尬的事情发生了,页面以及启动控制台底部都输出了相同的错误

Compiled with problems:X

ERROR in ./node_modules/hello-cmp/index.jsx 2:11

Module parse failed: Unexpected token (2:11)
File was processed with these loaders:
 * ./node_modules/source-map-loader/dist/cjs.js
You may need an additional loader to handle the result of these loaders.
| export default (props)=>{
>     return <div>你好啊,{props.msg}</div>
| }

这是因为默认情况下,项目(里的打包器如webpack、rollup、esbuild等)都会忽略node_modules里的代码处理。

知道原因,就好处理了,那我们修改当前react项目myApp的webpack,将其不要忽略包hello-cmp即可。

npm run eject之后,修改webpack配置文件如下:修改rules字段,让只编译src扩充到也编译你的包,即可。

// webpack.config.js
{
    test: /\.(js|mjs|jsx|ts|tsx)$/,  
    // 原来这有这个 include: paths.appSrc,
    // 其中paths.YourCmp即在path中定义的你组件包的路径 resolveApp('node_modules/YourCmp')
    include: [paths.appSrc,paths.YourCmp], 
    ...
}

再次启动,开心的一幕出现了

你好啊,张三

结论

如果你的包是低版本的纯js 你当然可以直接发版源码。
但是如果是jsx、ts、或用到了esnext最新版本的,别人下载引入你的包也无法开箱即用了。使用者仍然需要去安装对用的编译器并编译你的代码之后才可以使用。
而且很多编译工具默认都会忽略node_modules下的代码。

标签:node,系列,js,react,组件,jsx,hello,cmp
From: https://www.cnblogs.com/dingshaohua/p/16601849.html

相关文章

  • react滑动分页表格封装
    ScrollTable基本介绍滑动底部进行分页(用Observer实现),支持render支持参数:columns:列属性【Array】,每列支持的属性如下:{hide:false,//是否隐藏该列field:'......
  • Vue3,基于Vue3的一个自开发组件库,提供给大家参考学习使用
    简单介绍:这个组件库是个人为了学习而开发的,借鉴了elementui和bootstrap两个前端框架开发的。底层代码是基于vue3.x的。其中组件包括:1、系统内置内置样式内置动画2......
  • MQ系列3:RocketMQ 架构分析
    MQ系列1:消息中间件执行原理MQ系列2:消息中间件的技术选型1背景我们前面两篇对主流消息队列的基本构成和技术选型做了详细的分析。从本篇开始,我们会专注当下主流MQ之一的......
  • 子组件向父组件传递信息的三种方式
    通过自定义组件事件,可以实现子组件向父组件传递信息(通信),这个事件的触发一定是以原声标签事件为基础的,也就是先触发子组件里的事件,接着在回调函数中爆发自定义事件。 1.......
  • 文件夹上传组件webupload插件
    ​文件夹数据库处理逻辑public class DbFolder{    JSONObjectroot;       public DbFolder()    {        this.root= new JSONOb......
  • pytest系列——allure命令行参数详解
    一、查看allure命令的帮助文档allure-hallure命令的语法格式allure[options][command][commandoptions]options列表Options:--help命令行帮助文档......
  • react中父子组件相互传值或方法
    这个老师写的不错,写在这样方便自己以后的查看。详见原创作者的链接地址:https://blog.csdn.net/sinat_36359516/article/details/120011005......
  • 大文件上传组件webupload插件
    ​需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。 第一步:......
  • Vue基础——将原生事件绑定到组件
    Vue基础——将原生事件绑定到组件1、首先看一个小例子父组件:<template><divid="app"><my-button@click="handleClick"></my-button></div></template><......
  • 盘点Vue2和Vue3的10种组件通信方式(值得收藏)
    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异;本文将通过选项式API组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式。其中将要实现......