<
使用nwb发布你的第一个npm组件
>
上一篇

图解absolute relative
下一篇

老人与海 黑科技发布会

在这里插入图片描述

为什么要开发组件库?

nwb 是什么?

既然组件库有这么多优势,那么如何开发一个组件库? 答案是:nwb, nwb是一个非常优秀的组件库开发工具:

官方文档: insin/nwb

nwb安装

安装之前的准备

npm install -g cnpm –registry=https://registry.npm.taobao.org

//yarn 安装:Yarn是facebook发布的一款取代npm的包管理工具

npm install -g yarn 或者 brew install yarn

## 开始安装

- 全局安装nwb, 使用npm或者cnpm

npm install -g nwb //全局安装nwb

- npm失败或者非常慢, 可以尝试使用cnpm安装,cnpm速度比较快

cnpm install -g nwb //全局安装nwb

# 使用nwb创建组件 

- nwb创建一个名字叫nwb-demo的项目,名字自己随意取, 这里取名nwb-demo只是做demo

nwb new react-component nwb-demo

- 之后问关于配置问题

? Do you want to create an ES modules build for use by compatible bundlers? (Y/n) // 回复Y ,询问是否创建 ES modules

Do you want to create a UMD build for global usage via

? Which global variable should the UMD build set? () //回复ReactLoadingButton, 一般用React社区约定模块名称TitleCase版本,ReactLoadingButton


- 之后自动创建文件 , 其中着重关注 `demo`   `src /index.js`    `tests`   `neb.config.js`
```js
nwb-demo
  .gitignore
  .travis.yml
  CONTRIBUTING.md
  nwb.config.js  //调整拓展nwb提供的默认配置
  package.json
  README.md
  demo/         //demo文件夹,协助开发组件模块,不会打包进npm包
    src/
      index.js
  node_modules/
  src/
    index.js    //构建自己的react组件模块
  tests/        //组件测试模块
    *.eslintrc*
    index-test.js

创建单个组件

class Demo extends Component { handleClick = ()=> { console.log(“已点击”); } render() { return ( <div> <Button onClick = {()=>{this.handleClick()}} disabled = {false} > 登陆 </Button> <Button disabled = {true} >禁用</Button> </div> ) } } render(, document.querySelector(‘#demo’))

**安装classnames:  类选择器,react官方推荐库,用来动态判断不同状态class(类名)**

 **官方文档:** [JedWatson/classnames](https://github.com/JedWatson/classnames)

- 安装方式:

npm install classnames –save


- 还有一个./src/index.js文件,这个是自己开发组件的文件(你可以把他认为是一个`子组件`)
```js
//./src/index.js
import React, {Component} from 'react';
import PropTypes from 'prop-types';
import CX from 'classnames';
import './index.css';

class Button extends Component {
  render() {
    const { children, onClick, disabled, ...props} = this.props;
    return (
      <span
        className = {CX({
          btn:true,
          "btn-disabled": disabled === true ,
        })}
				{...props}
      >
        <span className = 'btn-content'>
          {children}
        </span>
      </span>
    )
  }
}

Button.propTypes = {
  children: PropTypes.string,
  onClick: PropTypes.func,
  disabled: PropTypes.bool,
}
Button.defaultProps = {
  children:"Button",
  onClick: () => {return null},
  disabled : false,
}
export default Button

//./src/index.css 
.btn{
    display: flex;
    align-self: center;
    justify-content: center;
    width:56px;
    height:32px;
    border-radius:4px;
    background:rgba(46,170,220,1);
}
.btn:hover{
    background:rgba(7,156,205,1);
    cursor: pointer;
}

.btn:active{
    background:rgba(2,141,190,1);
    opacity: 0.5;
}

.btn-disabled{
    background:rgba(0,0,0,0.4);
    pointer-events: none;
}

.btn-content{
    font-size:12px;
    font-weight:600;
    color:rgba(255,255,255,1);
    line-height:32px;
}

创建组件库

class Input extends Component { render() { return (
hello
) } }

export default Input;

//../src/Input/index.css 暂时可以什么都不写, 就放一个空index.css

- 我的层级结构:

![](https://user-gold-cdn.xitu.io/2019/12/11/16ef4776e762efc9?w=672&h=436&f=png&s=43575)

//此时的 ./src/index.js 是这样的, 里面是export出的组价集合 export Button from “./Button/index.js”; export Input from ‘./Input/index.js’;

**`切记 切记 切记`** 记得引用路径一定要写对, `因为打包只打包src内部文件`,引用的路径不能超出src文件范围,也不能包含src,举例来说明下:

//错误写法,以下写法本地测试没有问题,但是打包完成之后就会将src路径一起打包进去, //会导致用户下载的npm包,使用时候会因为找不到src文件路径报错, ~~export Input from ‘../src/Input/index.js’; ~~

//正确写法,不包src路径 export Button from “./Button/index.js”;

- 这时候你的Demo父组件就可以直接用组件库里面两个组件了,
```js
    //import Button from '../../src/index';改成下面是
    import {Button ,Input} from '../../src/index.js';

NPM账号登陆

npm账号注册

npm账号登录

npm login 
Username: ma_memg       //输入用户名
Password:               //输入密码
Email: (this IS public) //输入注册邮箱

发布到npm

组件构建 npm run build

“scripts”: { -> “build”: “nwb build-react-component –copy-files”, },

`注意 注意 注意` 发布之前确认跟上次版本号不一样,且比上一次版本号要更高, 不然会因为版本号重复或者变低导致报错,版本号在package.json中修改如下图:
![](https://user-gold-cdn.xitu.io/2019/12/11/16ef47efff04a9ae?w=904&h=462&f=png&s=56864)
```js
//package.json
{
->  "name": "yunshang",   //输入自己组件名称 
->  "version": "1.0.1",   //每次推到npm前确保跟上次版本号不同
->  "description": "button",  //简单描述项目
    ...
}


删除npm包

npm unpublish yunshang --force   //yunshang换成自己组件名称 

使用npm包

安装

npm i yunshang  //yunshang换成自己组件名称 

//npm失败或者非常慢, 可以尝试使用cnpm安装
cnpm i yunshang  //yunshang换成自己组件名称 

示例

//引入多个组件 import { Button, Input } from ‘yunshang’; //yunshang换成自己组件名称

## 使用

值 | 值  | 类型
---|--- | ---
disabled | bool | 默认: false, true为按钮禁用状态
onClick | function | 点击事件
children | string | 按钮内容


# 🌰举个例子

### 在项目中使用这个Button组件

<Button onClick = {()=>{this.handleClick()}} //onClick disabled = {false} //disabled

登陆  // children

</Button> ```

Top
Foot