Toast组件

import ReactDomCli from 'react-dom/client';
import './style.css'
import React from 'react'; const Toast = (props) => {
return <div className='Toast'>{props.msg}</div>
} const div = document.createElement('div');
let toastRoot = null;
let unmountTimer = null; export default {
show(msg, time = 2000) {
if (unmountTimer) {
clearTimeout(unmountTimer);
toastRoot.unmount();
document.body.removeChild(div);
} // 挂载
toastRoot = ReactDomCli.createRoot(div);
toastRoot.render(<Toast msg={msg} />);
document.body.appendChild(div); // 过几秒卸载
unmountTimer = setTimeout(() => {
toastRoot.unmount();
document.body.removeChild(div);
unmountTimer = null;
}, time)
}
}
.Toast{
position: fixed;
top: 40%;
left: 40%;
background-color: rgba(0, 0, 0, 0.5);
color: white;
padding: 10px 16px;
border-radius: 4px;
}

Button组件

import './style.css'
import React from 'react'; const Button = (props)=>{
return <button className='DshBtn' {...props}>{props.children}</button>
}
export default Button;
.DshBtn {
border-color: #1890ff;
background-color: #1890ff;
border-radius: 2px;
color: white;
padding: 6px;
min-width: 80px;
letter-spacing: 1px;
} .DshBtn:hover{
cursor: pointer;
}

index.js

export { default as Button }  from './Button';
export { default as Toast } from './Toast';

发包方式1

组件开发者不用本地编译,直接将组件tsx等,发到npm上。

优点是非常的方便组件开发,几乎不用任何多余处理。

缺点是需要在项目引用的时候进行手动配置此node_modules/YourCmp进行编译(默认情况下,项目都会忽略node_modules里的代码编译),具体配置如下

webpack.config.js 修改rules字段,让只编译src扩充到也编译你的包,即可。

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

发包方式2

因为方式1,使用者会很麻烦,所以一般不推荐,来说说方式2.

使用rollup打包,发布编译后的包。

1、需要集成babel

首先Rollup 是一个用于 JavaScript 的模块打包器,所以跟webpack一样它也或需要babel的协助,

其次react和jsx的解析,需要babel能力,Rollup的jsx插件是满足不了的

参考官网的集成方案

yarn add --dev @babel/core @rollup/plugin-babel @rollup/plugin-node-resolve

如果需要支持ts[x]的话,需要安装一下依赖

yarn add --dev typescript tslib @rollup/plugin-typescript

如果支持less的话,需要安装less

yarn add --dev less

如果支持图片导入的话,需要安装img插件

yarn add --dev @rollup/plugin-image

同时在rollup的配置文件rollup.config.js引用该插件

import resolve from '@rollup/plugin-node-resolve';
import babel from '@rollup/plugin-babel'; // resolve是babel用来处理import路径的 export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'cjs' // 或es
},
plugins: [
resolve(),
image(), // 如果需要图片导入的话
babel({
extensions: [".ts", ".tsx"], // 如果需要支持ts[x]的话 需要配置
}),
typescript(), // 如果需要支持ts[x]的话 需要配置
postcss(),
]
};

2、配置babel

babel默认只解析js,可是无法解析react的,所以还需要安装其预设包

注意1:网上有很多都让安装@babel/preset-env,这个预设包是用来es语法编译,但是我这里验证的是@babel/preset-react包里默认已经有了es语法编译功能,所以不用安装也可以。

注意2:@babel/preset-typescript用来编译ts的,如果项目里没用到的话,则不需要安装此包。

yarn add --dev @babel/preset-react

然后在根目录下创建babel的配置文件.babelrc.json

{
"presets": ["@babel/preset-react"]
}

至此,如果你的react组件里没有使用css,就已经可以了,如果有,那就接着向下看

3、处理css

安装步骤参考这里

yarn add --dev postcss rollup-plugin-postcss

rollup使用此插件

import resolve from '@rollup/plugin-node-resolve';
import babel from '@rollup/plugin-babel';
import postcss from 'rollup-plugin-postcss' export default {
input: 'src/index.js',
output: {
file: 'dist/bundle.js',
format: 'cjs'
},
plugins: [resolve(), babel({}), postcss()] // 这里 postcss()即为使用
};

4、开始打包

至此,所以有的配置都完成了。

我们来安装rollup工具包

yarn add --dev rollup

然后运行一下命令,即可打包

npx run rollup --config

就会发现打包成了一个文件,无法阅读,可以做一下修改

// ES Module打包输出
const esmOutput = {
preserveModules: true,
preserveModulesRoot: "src",
// exports: 'named',
assetFileNames: ({ name }) => {
const { ext, dir, base } = path.parse(name);
if (ext !== ".css") return "[name].[ext]";
return path.join(dir, "style", base);
},
}; export default {
input: "src/index.ts",
output: {
...esmOutput,
dir: "dist",
format: "es",
},
...
};

发包方式3

利用三方库,其实第二种方式,还是稍显麻烦,不方便文档、实时预览等,所以就有人开发了第三方工具。

dumi、 father、还有不好用的create-react-library等等

https://blog.csdn.net/Afterwards_/article/details/125290529

看看这个人多折腾

react开发组件并发包到npm的更多相关文章

  1. 跟我一起写一个hello-world react组件并发布到npm

    第一步:初始化我们的配置 $ mkdir react-hello-world $ cd react-hello-world/ $ npm init -y 修改我们的package.json文件 //p ...

  2. 开发自己的react-native组件并发布到npm[转]

    原文链接:https://www.jianshu.com/p/091a68ea1ca7 写在前面 在做react-native开发的时候,我们经常会找到一些第三方组件,并且通过npm install的 ...

  3. 如何创建一个前端 React 组件并发布到 NPM

    首先npm文档摆在这里: https://www.npmjs.cn/ 参考组件 https://github.com/rakuten-rex/rex-dropdownhttps://www.npmjs ...

  4. React 面向组件化编程 - 封装了webpack - npm run build 产生的包的 /static 引用路径问题

    React 面向组件化编程 面向对象 ----> 面向模块 ----> 面向组件 套路: 注意: 组件名必须大写开头: 只能有一个根标签: <input />虚拟DOM 元素必 ...

  5. 前端开发组件化设计vue,react,angular原则漫谈

    前端开发组件化设计vue,react,angular原则漫谈 https://www.toutiao.com/a6346443500179505410/?tt_from=weixin&utm_ ...

  6. react开发教程(三)组件的构建

    什么是组件 组件化就好像我们的电脑装机一样,一个电脑由显示器.主板.内存.显卡.硬盘,键盘,鼠标.... 组件化开发有如下的好处:降低整个系统的耦合度,在保持接口不变的情况下,我们可以替换不同的组件快 ...

  7. react_app 项目开发 (4)_ React UI 组件库 ant-design 的基本使用

    最流行的开源 React UI 组件库 material-ui 国外流行(安卓手机的界面效果)文档 ant-design 国内流行 (蚂蚁金服 设计,一套 PC.一套移动端的____下拉菜单.分页.. ...

  8. 移动web端的react.js组件化方案

     背景: 随着互联网世界的兴起,web前端开发的方式越来越多,出现了很多种场景开发的前端架构体系,也对前端的要求日益增高,早已经不是靠一个JQuery.js来做前端页面的时代了,而今移动端变化最大,近 ...

  9. 基于Nodejs生态圈的TypeScript+React开发入门教程

    基于Nodejs生态圈的TypeScript+React开发入门教程   概述 本教程旨在为基于Nodejs npm生态圈的前端程序开发提供入门讲解. Nodejs是什么 Nodejs是一个高性能Ja ...

  10. 用Inferno代替React开发高性能响应式WEB应用

    什么是Inferno Inferno可以看做是React的另一个精简.高性能实现.它的使用方式跟React基本相同,无论是JSX语法.组件的建立.组件的生命周期,还是与Redux或Mobx的配合.路由 ...

随机推荐

  1. Eclipse java项目转Maven项目

    1.右键项目->configure->选择maven->配置maven的pom.xml 2.在src/main下新建java文件,将原来src下的java文件夹拷贝至该目录下: 3. ...

  2. 为什么 Java 的垃圾收集器将堆分为老年代和新生代?

    为什么 Java 的垃圾收集器将堆分为老年代和新生代? Java 垃圾收集器通过将堆内存划分为 新生代 和 老年代,优化了内存管理,提高了垃圾回收的效率.这种分代思想是基于 对象生命周期的特点. 1. ...

  3. 2025西安交大集训Day1:二分,三分,哈希,高精度,位运算,模拟退火

    2025西安交大集训Day1:二分,三分,哈希,高精度,位运算,模拟退火 二分 详见2025dsfz集训Day2:二分与三分,三分在当前文章内已经重构过. 三分 三分算法详细解释 三分算法(Terna ...

  4. CF1573B题解

    题意: 对于给定的序列 aA1,aA2,-,aAna_{A1},a_{A2},-,a_{An}aA1​,aA2​,-,aAn​.bB1,bB2,-,bBnb_{B1},b_{B2},-,b_{Bn}b ...

  5. Git Reset 彻底解析:--hard 模式操作步骤、风险与完整恢复指北

    结论先行 使用 git reset --hard <commit_id> 可强制将本地代码.暂存区.工作目录彻底回退到指定提交状态,但会丢弃目标提交之后的所有提交记录(需谨慎操作,尤其涉及 ...

  6. 【记录】环境|Ubuntu18.04 中搭建 Python 开发和调试环境的完整记录

    文章目录 安装Python并切换 1 安装某个版本 方式一:pyenv安装(强烈推荐) 方式二:apt安装(不推荐) Python3 Python2 查看所有apt装上的版本 2 切换python版本 ...

  7. 【记录】PR使用技巧记录

    @ 目录 [PR最重要的两个操作] 一.关键帧 1. 如何设置关键帧? 2. 应用实例 1)1s内视频从明变暗 2)1s内视频画面由大到小 二.入点.出点 [其他] PR批量调整视频效果 PR剪视频片 ...

  8. Axure通用电商后台管理系高保真交互模板原型图附元件库4种后台模板风格

    Axure通用电商后台管理交互模板原型图附元件库4种后台模板风格,原型中使用4种不同的布局框架,你可以根据自己的需求,去选中对应的菜单排版布局.另外,原型图中使用了较多的交互元件.母版.动态面板,基本 ...

  9. IT/互联网行业突围之路:ChatGPT驱动下的未来

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

  10. 【保姆级教程】:开源 Qwen3 本地化部署实操详细教程

    一.教学环境 1.1Panel:现代化.开源Linux服务器管理面板 2.Ollama:开源大语言模型管理平台 3.MaxKB:强大易用的企业级 AI 助手 二.实操步骤 步骤1.1Panel 安装: ...