如何创建一个前端 React 组件并发布到 NPM
首先npm文档摆在这里:
参考组件
https://github.com/rakuten-rex/rex-dropdown
https://www.npmjs.com/package/react-slot
“造轮子”是非常有效的学习方法。在熟练掌握API的搬运方法之后,我们可以通过自己“造轮子”来进一步掌握和理解更底层的知识。自己完成一个组件的开发之后,我们可以打包上传到 NPM 来分享自己的成果。在后面的步骤中,将会实现以下几个小目标:
- 配置开发环境
- 开发组件
- 打包组件,并在测试项目中引入打包组件模块,验证组件功能
- 发布到 NPM
初始化
开始一个最基本的 React 工程,我们至少需要以下几项配置:
- React: 用于开发组件
- React dom: 渲染组件
- Babel: 用于转义 JSX
- webpack: 打包组件
我在这个例子里面做了一个叫做 react-tiny-autosuggest 的组件。首先创建 project 并且初始化。
mkdir react-tiny-autosuggest
cd react-tiny-autosuggest
npm init -y
这里我们需要改动三个地方:
- main: 这里是我们组件的入口文件。开发者在 import 我们的组件的时候会引入这里 export 的内容
- files: 申明将要发布到 npm 的文件。如果省略掉这一项,所有文件包括源代码会被一起上传到 npm
- scripts: 申明命令行可用的各种指令。
// package.json
...
"main": "dist/bundle.js",
"files": ["dist"],
"scripts": {
"start": "webpack-dev-server --config webpack.dev.config.js",
"dev": "webpack-dev-server --config webpack.dev.config.js",
"build": "webpack --config webpack.prod.config.js"
},
...
接下来安装依赖
npm i react react-dom
npm i -D babel-loader @babel/core @babel/preset-env @babel/preset-react webpack webpack-dev-server webpack-cli html-webpack-plugin webpack-node-externals css-loader style-loader
依赖版本的升级很快,所以如果读者发现依赖有问题,请参考官方文档正确安装。这篇文章最开始写于2018年初,到年之后更新的时候,好几个依赖都经过大更新了。
接下来配置 webpack。这里分成两份配置,一份用于开发环境(development),一份用于单独打包组件用于生产环境(production)。
在开发环境下,我们需要搭建一个完整的项目,让我们可以开发组件,并可以将其引入其他组件,渲染到浏览器中看到效果。同时我们也需要一些开发工具的支持,比如 HMR(hot module reloa) 组件热更新和详细的报错信息。
在生产环境下,只需要打包组件本身,不包括工程里面的其他组件。同时我们需要压缩文件体积,尽量减小组件打包之后的体积。
Webpack 配置
下面是我们的 webpack 开发配置
const path = require('path');
const htmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
mode: 'development',
entry: './src/app.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, '../dist'),
},
module: {
rules: [
{
test: /\.js$/,
use: 'babel-loader',
exclude: /node_modules/
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /\.cm\.styl$/,
loader: 'style-loader!css-loader?modules&camelCase&localIdentName=[local]-[hash:base64:5]!stylus-loader'
}
]
},
devServer: {
contentBase: './dist'
},
plugins: [
new htmlWebpackPlugin({
template: 'public/index.html'
})
],
};
production 打包配置,区别是改变了 entry,因为我们只需要单独的组件,并且改变了 libraryTarget,这个配置项的默认参数是 'var',我们需要改成 commonjs2,这样可以通过模块系统引入这个组件。另一点区别是使用了 nodeExternals 使得打包的组件中不包括任何 node_modules 里面的第三方组件,起到减小体积的作用。
const path = require('path');
const nodeExternals = require('webpack-node-externals');
module.exports = {
mode: 'production',
entry: './src/autosuggest.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, '../dist'),
libraryTarget: 'commonjs2'
},
module: {
rules: [
{
test: /\.js$/,
use: 'babel-loader',
exclude: /node_modules/
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader']
},
{
test: /\.cm\.styl$/,
loader: 'style-loader!css-loader?modules&camelCase&localIdentName=[local]-[hash:base64:5]!stylus-loader'
}
]
},
externals: [nodeExternals()]
};
在 package.json 中,我们可以通过 --config 指定 webpack 使用哪一套配置。在这个 demo 里使用了 stylus 来写样式文档,所以添加了相应的 css pre-processor,把 stylus 语法 转化为 css 语法。并且在引入 css 的时候使用了模块化 css 以避免全局命名冲突。
.babelrc
{
"presets": ["@babel/preset-env", "@babel/preset-react"]
}
开发组件
完成以上配置以后,我们可以在 src 文件夹里面开发自己组件。运行 npm run dev,让 webpack-dev-server 渲染到浏览器中,实时看到效果。
打包并验证
打包组件,只需要运行 npm run build 就可以了。
接下来可以通过 npm link
把打包之后的组件引入到 global node_modules 中,然后在验证 demo 中再通过 npm link react-tiny-autosuggest
引入这个组件,并验证是否符合预期。
// At development directory
npm run build
npm link
cd [test project folder]
npm link react-tiny-autosuggest
接下下 demo 里面就可以直接 import AutoSuggest from 'react-tiny-autosuggest'
了。
发布到 NPM
发布组件到 npm: npm publish
取消发布: npm unpublish
更行版本: 更改 package.json 里面的版本号并重新发布
如何创建一个前端 React 组件并发布到 NPM的更多相关文章
- 跟我一起写一个hello-world react组件并发布到npm
第一步:初始化我们的配置 $ mkdir react-hello-world $ cd react-hello-world/ $ npm init -y 修改我们的package.json文件 //p ...
- Ionic 2 中的创建一个闪视卡片组件
闪视卡片是记忆信息的重要工具,它的使用可以追溯到19世纪.我们将要创建一个很酷的短暂动画来实现它.看起来像是这个样子的: 闪视卡片示例 Ionic 2 实例开发 新增章节将为你介绍如何在Ionic 2 ...
- 开发自己的react-native组件并发布到npm[转]
原文链接:https://www.jianshu.com/p/091a68ea1ca7 写在前面 在做react-native开发的时候,我们经常会找到一些第三方组件,并且通过npm install的 ...
- webpack 打包一个简单react组件
安装Webpack,并加载一个简单的React组件 全局的npm模块安装: npm install -g webpack 安装jsx-loader npm install --save-dev jsx ...
- vue cli4构建基于typescript的vue组件并发布到npm
基于vue cli创建一个vue项目 首先安装最新的vue cli脚手架, npm install --global @vue/cli npm WARN optional SKIPPING OPTIO ...
- 将自己的组件打包发布到npm
在项目中有些组件在各个项目中都会调用,那么将组件发布到npm ,用到的项目去下载,这样会省去一些不必要的麻烦. 将组件发布到npm 中的步骤 做个记录 1.项目的创建,我这里使用 vue init w ...
- 将 Vue 组件库发布到 npm
制作了一套自己的组件库,并发布到npm上,项目代码见 GitHub . 前期准备 有一个npm账号 安装了vue-cli 搭建项目 vue init webpack hg-vcomponents cd ...
- VsCode+Node的前端环境搭建及其理解并创建一个前端目录
既然选择了远方,便只顾风雨兼程 __ HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 VsCode VsCode的安装 VSCode中文设置 VsCode 扩展 VsCod ...
- 魔改了一下bootstrap-treeview组件,发布个NPM包体验一下
前言 之前在这篇文章 基于.NetCore开发博客项目 StarBlog - (8) 分类层级结构展示 中说到,我为了让文章分类列表支持层级结构,用了一个树形组件,不过这个组件太老了,使用的Boots ...
随机推荐
- Google Directions API 中路线编码解析
public List<Location> GetGeoPoints(string encoded) { List<Location> poly = new List<L ...
- php开启短标签与<?xml version="1.0" encoding="UTF-8"?>冲突
前两天写了个生成mapsite的源码,想提交到百度和谷歌,在本地测试一点问题都没有,但是在服务器上就显示500错误 最后废了九牛二虎之力,终于可以设置iis直接显示出错信息. 也搞懂了问题所在,默认服 ...
- SqlDbx连接oracle(可用)
解压SqlDbx.zip,将SqlDbx放到C:盘根目录 1.Path里面增加:C:\SqlDbx Path是为了找tnsnames.ora 2.增加系统变量:ORACLE_HOME,路径:C:\S ...
- iOS——plist的创建,数据写入与读取
iOS中plist的创建,数据写入与读取 Documents:应用将数据存储在Documents中,但基于NSuserDefaults的首选项设置除外Library:基于NSUserDefaults的 ...
- DB2的web可视化客户端工具
DB2 是IBM公司的产品,目前在银行等金融行业还在大量使用, DB2的客户端工具太,并且难用,这是一直为人所垢病的, 现在TreeSoft数据库管理系统已支持DB2了,直接在浏览器中就可以操作查看 ...
- 利用matlab自带函数快速提取二值图像的图像边缘 bwperim函数
clear all;close all;clc; I = imread('rice.png'); I = im2bw(I); J = bwperim(I); % 提取二值图像图像边缘 figure ...
- C++之cmath常用库函数一览
cmath是c++语言中的库函数,其中的c表示函数是来自c标准库的函数,math为数学常用库函数. cmath中常用库函数: 函数 作用 int abs(int i); 返回整型参数i的绝对值 dou ...
- 在图中寻找最短路径-----深度优先算法C++实现
求从图中的任意一点(起点)到另一点(终点)的最短路径,最短距离: 图中有数字的点表示为图中的不同海拔的高地,不能通过:没有数字的点表示海拔为0,为平地可以通过: 这个是典型的求图中两点的最短路径:本例 ...
- Linux 如何找到100M以上的大文件
find / -type f -size +100000k |xargs ls -lh|awk '{print $9 ":" $5}'
- 【转帖】sysbench的安装和做性能测试
iMySQL | 老叶茶馆 sysbench的安装和做性能测试 http://imysql.cn/node/312 我仿照这个学的 但是 需要用更新的版本才可以. By yejr on 14 六月 ...