rollup打包react组件

news2025/1/12 18:18:14

这次主要简单实现用rollup打包react组件,组件的话简单写了一个弹窗组件,效果如下:

点击打开弹框,点击关闭按钮关闭弹框

首先创建react项目,这边还是用mfex-project脚手架创建

mfex-project create react-demo

 然后编写dialog组件

代码如下:

components/dialog/index.tsx


import './index.scss';
import closeIcon from '@/assets/close-black.png'
interface IProps {
    show: boolean;
    title?:string;
    handleCloseAction: () => void
}
function Dialog(props: IProps) {
    const handleClose = () => {
        props.handleCloseAction()
    }
    return (
        props.show ? <div className='dialog'>
            <div className='dialog-content'>
                <img src={closeIcon} alt="" className='dialog-content-close' onClick={handleClose}/>
                <h1 className='dialog-content-title'>{props.title}</h1>
            </div>
        </div> : <></>
    )
}
export default Dialog;

components/dialog/index.scss

.dialog{
    position: fixed;
    left: 0;
    top: 0;
    bottom: 0;
    right: 0;
    background: rgba(0,0,0,.6);
    z-index: 990;
    &-content{
        width: 500px;
        height: 300px;
        background: #fff;
        border-radius: 25px;
        position: absolute;
        left: 50%;
        top: 50%;
        transform: translate(-50%,-50%);
        &-close{
            width: 30px;
            height: 30px;
            position: absolute;
            right: 20px;
            top: 20px;
            
        }
        &-title{
            margin-top: 20px;
            text-align: center;
        }
    }
}

引入使用组件:

import './index.scss';
import Dialog from '@/components/dialog'
import { useState } from 'react'
function Index() {
    const [dialogShow, setDialogShow] = useState<boolean>(false)
    const handleCloseAction = () => {
        setDialogShow(false)
    }
    return (
        <>
            <div className='index'></div>
            <div className='w-100px h-100px bg-blue-300' onClick={()=>setDialogShow(true)}>打开dialog</div>
            <Dialog show={dialogShow} title='rollup' handleCloseAction={handleCloseAction}/>
        </>
    )
}
export default Index;

接下来用rollup把组件封装

1、创建文件夹,命名为react-dialog,初始化项目

npm init -y

2、安装rollup

npm i rollup -D

3、安装插件

  • @rollup/plugin-node-resolve:帮助 rollup 识别外部模块

  • @rollup/plugin-babel:ES6转ES5

  • @rollup/plugin-commonjs:将commonjs模块转为es模块

  • @rollup/plugin-terser:代码压缩

  • rollup-plugin-img:处理图片

  • rollup-plugin-postcss:处理css

  • @rollup/plugin-json:处理json

  • @rollup/plugin-typescript:处理typescript

  • rollup-plugin-dts:打包ts声明文件,d.ts

npm i @rollup/plugin-node-resolve

@rollup/plugin-babel

@rollup/plugin-commonjs

@rollup/plugin-terser

rollup-plugin-img

rollup-plugin-postcss

@rollup/plugin-json

@rollup/plugin-typescript

rollup-plugin-dts -D

4、安装css和babel对应的包

npm i autoprefixer babel/core babel/plugin-transform-runtime @babel/preset-env -D

根目录下新建.babelrc,内容如下

{
    "presets": [
      [
        "@babel/preset-env",
        {
          "modules": false,
          "useBuiltIns": "usage",
          "corejs": "2.6.10",
          "targets": {
            "ie": 10
          }
        }
      ]
    ],
    "plugins": [
        // 解决多个地方使用相同代码导致打包重复的问题
        ["@babel/plugin-transform-runtime"]
    ],
    "ignore": [
        "node_modules/**"
      ]
  }

5、由于是使用typescript,所以安装typescript,并初始化tsconfig.json

npm i typescript -D

npx tsc --init

tsconfig.json内容如下:

{
  "compilerOptions": {
    "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
    // "lib": [],                                        /* Specify a set of bundled library declaration files that describe the target runtime environment. */
    "jsx": "react-jsx", /* Specify what JSX code is generated. */
    /* Modules */
    "module": "ESNext", /* Specify what module code is generated. */
    // "rootDir": "./",                                  /* Specify the root folder within your source files. */
    "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */
    // "baseUrl": "./",                                  /* Specify the base directory to resolve non-relative module names. */
    /* Emit */
    "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
    // "declarationMap": true,                           /* Create sourcemaps for d.ts files. */
    "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
    "sourceMap": true, /* Create source map files for emitted JavaScript files. */
    // "inlineSourceMap": true,                          /* Include sourcemap files inside the emitted JavaScript. */
    // "outFile": "./",                                  /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
    "outDir": "dist", /* Specify an output folder for all emitted files. */
    "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
    "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
    // "preserveSymlinks": true,                         /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
    "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */
    /* Type Checking */
    "strict": true, /* Enable all strict type-checking options. */
    "skipLibCheck": true, /* Skip type checking all .d.ts files. */
  }
}

6、接下来把react组件copy到项目中

7、由于使用了png后缀的文件,所以要定义文件类型, 不然ts会报错

在根目录下新疆index.d.ts

declare module '*.png'

 8、修改package.json

 "main": "dist/cjs/index.js",
  "module": "dist/esm/index.js",
  "type": "module",
  "types": "dist/index.d.ts",
  "files": [
    "dist",
    "package.json"
  ],
  "scripts": {
    "build": "rimraf dist && rollup -c"
  },

9、编写rollup.config.js


import resolve from '@rollup/plugin-node-resolve';
import babel from '@rollup/plugin-babel';
import commonjs from '@rollup/plugin-commonjs';
import terser from '@rollup/plugin-terser';
import image from 'rollup-plugin-img';
import postcss from 'rollup-plugin-postcss'
import json from '@rollup/plugin-json';
import typescript from '@rollup/plugin-typescript';
import dts from "rollup-plugin-dts";
import autoprefixer from 'autoprefixer'
import path from 'path'
// 讲require转换为模块
import { createRequire } from 'module';
const require = createRequire(import.meta.url);

const pkg = require(path.resolve(`package.json`))
export default[
    {
        input:'./src/index.tsx',
        output:[
            {
                file:pkg.main,
                format:"cjs",
                sourcemap:true,
                name:"react-dialog-lib"
            },
            {
                file:pkg.module,
                format:"es",
                sourcemap:true,
            }
        ],
        plugins:[
            resolve(),
            typescript(),
            terser(),
            babel({
                exclude: "**/node_modules/**",
                runtimeHelpers: true,
            }),
            commonjs(),
            postcss({
                plugins:[autoprefixer()]
            }),
            json(),
            image({
               
               
                limit: 8192,  // default 8192(8k)
                exclude: 'node_modules/**'
              })
        ]
    },
    {
        input:"dist/esm/index.d.ts",
        output:[
            {
                file:"dist/index.d.ts",
                format:"es"
            }
        ],
        external: [/\.scss$/],
        plugins:[
            dts()
        ]
    }
]

10、运行打包命令,后续可以发布到npm上,这里只是作为演示

npm run build

打包成功

 

11、在之前的项目的使用

引入包

npm i

 然后

 正常显示

遇到的问题:

  •  在编写包项目时,编辑器会无法识别react的语法 

    React' refers to a UMD global, but the current file is a module. Consider adding an import instead 在tsconfig.json中加上 "jsx": "react-jsx",

  • Cannot find module 'react/jsx-runtime' or its corresponding type declarations. JSX element implicitly has type 'any' because no interface 'JSX.IntrinsicElements' exists. 需要安装@types/react 

    npm i @types/react -D

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/560956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux·深入理解IO复用技术之epoll

目录 1.写在前面 2.初识复用技术和IO复用 3. Linux的IO复用工具概览 4. 初识epoll 5. epoll的底层细节 6.LT模式和ET模式 7.epoll的惊群问题 1.写在前面 今天一起来学习一下高并发实现的的重要基础&#xff1a;I/O复用技术 & epoll原理。 通过本文你将了解到以下内容…

【JavaScript】ES6,Proxy,Reflect,Promise,生成器,async/await

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 ES6模板字符串&#xff0c;标签模板字符串函数的默认参数函数的剩余参数剩余参数和arguments有什…

为什么要学习C++软件调试技术?掌握调试技术都有哪些好处?

目录 1、为什么要学习C软件调试技术&#xff1f; 1.1、IDE调试手段虽必不可少&#xff0c;但还不够 1.2、通过查看日志和代码去排查异常崩溃问题&#xff0c;费时费力&#xff0c;很难定位问 1.3、有的问题很难复现&#xff0c;可能只在客户的环境才能复现 1.4、开发联调工…

使用git远程上传github

如果你不是很熟悉git&#xff0c;在使用git前请先对你的项目进行备份 进入本地文件目录&#xff0c;打开git的cmd界面&#xff08;Git Bash Here&#xff09;如果当面目录使用过git&#xff0c;有.git隐藏文件&#xff0c;则跳过第二步&#xff0c;没有则输入以下命令 git ini…

零基础如何自学网络安全?

第一阶段&#xff1a;学习一种或几种编程语言。 网络安全也属于计算机范畴&#xff0c;涉及到IT行业的&#xff0c;编程语言是不可难免的。 《Head First Python(第2版)》 作为一种高级编程语言&#xff0c;Python越来越受到网络专家的欢迎。它之所以吸引人&#xff0c;主要…

【Java 28岁了】一个有趣的例子,再推荐一些经典好书(文末惊喜福利)

文章目录 1 写在前面2 C语言与Java语言的互相调用2.1 C语言调用Java语言2.2 Java语言调用C语言 3 友情推荐4 更多分享 1 写在前面 众所周知&#xff0c;C语言和Java语言是两种不同的编程语言&#xff0c;它们的关系可以描述为Java语言是在C语言的基础上发展而来的一种高级编程…

内网如何映射到公网访问互联网

我们通常会根据本地应用场景来选择合适的中间件来搭建服务器。tomcat、 apache是比较常用的搭建服务器的中间件&#xff0c;它们之间还是有一些区别差异的。在内网本地部署搭建服务器后&#xff0c;还可以通过快解析端口映射方法&#xff0c;将内网应用地址发布到互联网&#x…

Springboot +spring security,使用过滤器方式实现验证码功能

一.简介 在前面文章章节通过自定义认证器实现了验证码功能&#xff0c;这篇文章使用过滤器来实现验证码功能。 二.思路分析 实现逻辑和通过过滤器实现json格式登录一样&#xff0c;需要继承UsernamePasswordAuthenticationFilter&#xff0c;所以文档这块主要记录下代码实现…

每日一题——两数之和(返回下标和返回数值两种情况)

每日一题 两数之和 题目链接 思路 注&#xff1a;本题只采用暴力解法&#xff0c;时间复杂度为O(n2)&#xff0c;如果采用哈希表&#xff0c;可以将时间复杂度降到O(n)&#xff0c;但由于笔者还未对哈希表展开学习&#xff0c;故不做讨论 我们直接用两层for循环来解决问题 第…

安装部署 Mastodon 长毛象去中心化微博系统

注意&#xff1a;本文采用的为 Docker Compose 方式安装部署。 首先选择你安装的版本&#xff0c;有以下两种推荐&#xff1a; 官方版本&#xff1a; https://github.com/mastodon/mastodonGlitch 版本&#xff1a; https://github.com/glitch-soc/mastodon 项目包含一个 Doc…

不同的去耦电容 阻抗VS频率

不同的去耦电容 阻抗VS频率 • 并联电容可以在一个较宽的频带内降低阻抗 • 小的去耦电容尽可能靠近电源引脚 为什么每个电源引脚都需要去耦 去耦电容总结 • 旁路电容离电容引脚尽可能的近 • SMT磁珠对于降低Ripple非常有效 • 高频时需要地平面 – 最小化寄生参数 • 使用…

记两道小明文攻击题

题一 题目描述&#xff1a; flag **************************** flag "asfajgfbiagbwe" p getPrime(2048) q getPrime(2048) m1 bytes_to_long(bytes(flag.encode()))e1e2 3087 n p*q print()flag1 pow(m1,e1,n) flag2 pow(m1,e2,n) print(flag1 str(fla…

MATLAB 搜索某一点的R邻域点 (13)

MATLAB 搜索某一点的R邻域点 (13) 前言一、算法介绍1.1 :无序点云的R邻域点搜索1.2 :有序点云的R邻域点搜索二、具体实现示例2.1 算法一 (含详细注释)2.2 算法二 (含详细注释)前言 在点云处理中,最基本的算法之一就是搜索某一点的近邻点,这在重叠区域确定,点云密度…

Spring Gateway使用JWT实现统一身份认证

在开发集群式或分布式服务时&#xff0c;鉴权是最重要的一步&#xff0c;为了方便对请求统一鉴权&#xff0c;一般都是会放在网关中进行处理。目前非常流行的一种方案是使用JWT&#xff0c;详细的使用说明&#xff0c;可以找相关的资料查阅&#xff0c;这里先不进行深入的引用了…

鲸图知识图谱平台,助力金融业务深度洞察(上)

导语 大数据时代的背景下&#xff0c;数据早就成为数字经济重要的生产资料。对数据的挖掘能力成为企业数字化转型的驱动力。就金融行业来说&#xff0c;如果经营和管理方式跟不上大数据时代的发展脚步就会使得数据价值无法得到充分发挥。知识图谱作为一个结合了知识存储、知识…

SpringCloud入门概述;微服务入门概述

微服务入门概述 入门概述微服务分布式微服务架构Spring Cloud技术栈spring cloud各个组件的使用服务注册服务调用服务降级服务网关服务配置服务总线 参考 入门概述 auther JaneOnly date 2022/11/6 前置课程需要: java8mavengitNginxmqspringboot2.0 微服务 微服务架构就是一…

【阅读笔记】概率预测之DeepAR(含Pytorch代码实现)

本文作为自己阅读论文后的总结和思考&#xff0c;不涉及论文翻译和模型解读&#xff0c;适合大家阅读完论文后交流想法&#xff0c;关于论文翻译可以查看参考文献。论文地址&#xff1a;https://arxiv.org/abs/1704.04110 DeepAR 一. 全文总结二. 研究方法三. 结论四. 创新点五…

软件设计师--考前查漏补缺

软件设计师 上午题一、计算机系统二、操作系统三、数据库技术四、计算机网络五、软件工程概论六、程序设计语言与编译原理七、数据结构与算法八、算法分析与设计九、其他&#xff1a;标准化与知识产权、英语 下午题一、结构化分析设计二、数据库分析技术三、面向对象分析技术四…

代码随想录算法训练营第十四天|二叉树的遍历

这里主要掌握两种遍历方法&#xff1a;递归法和迭代法 递归法&#xff1a; 1、确定递归函数的参数和返回值&#xff0c;这里参数就是节点和用于存放节点数值的vector。 2、确认终止条件&#xff0c;这里的终止条件是节点为空。 3、确定单层递归逻辑&#xff0c;根据前序、中序…

随身WIFI折腾日记(三)---Docker+ssh远程访问+青龙面板

四、安装Docker 安装完Docker以后&#xff0c;我们便可以一键部署一些服务上去了。 sudo curl -fsSL get.docker.com -o get-docker.sh # 下载安装脚本 \&& sudo sh get-docker.sh --mirror Aliyun # 执行安装脚本 \&& sudo systemctl enable docker # 加入开…