rollup打包react组件

这次主要简单实现用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 core-js @babel/core @babel/plugin-transform-runtime @babel/preset-env -D

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

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "modules": false, // 对ES6的模块文件不做转化,以便使用tree shaking、sideEffects等
        "useBuiltIns": "entry", // browserslist环境不支持的所有垫片都导入
        // https://babeljs.io/docs/en/babel-preset-env#usebuiltins
        // https://github.com/zloirock/core-js/blob/master/docs/2019-03-19-core-js-3-babel-and-a-look-into-the-future.md
        "corejs": {
          "version": 3, // 使用core-js@3
          "proposals": true
        }
      }
    ]
  ],
  "plugins": [
    [
      "@babel/plugin-transform-runtime",
        {
          "corejs": false // 解决 helper 函数重复引入
        }
    ]
  ],
  "ignore": [
    "node_modules/**"
  ]
}

需要指定 browserslist 来确定我们程序运行的目标环境,避免去兼容程序不考虑的浏览器环境

在package.json添加:

"browserslist": [
    "> 1%", 
    "last 2 versions",
    "not ie <= 8"
  ]

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

财务共享领先实践,看看他们是怎么做的

随着信息技术的快速发展&#xff0c;由于创新商业模式的出现&#xff0c;金融结构、操作策略和流程正在发生变化。大数据、云计算、人工智能、机器人流程自动化&#xff08;RPA&#xff09;等新兴技术正在应用于金融及财务领域&#xff0c;以优化财务管理流程并提高运营效率。财…

信号完整性分析基础知识之传输线和反射(七):带负载传输线、感性不连续引起的反射

带负载传输线 如果在传输线上有一个小的容性负载&#xff0c;信号会出现失真&#xff0c;上升时间也会降低。每个分立电容都会降低信号在其附近看到的阻抗。如果传输线上分布有多个容性负载&#xff08;例如一个总线上每隔1.2inch有一个2pF的连接器残桩&#xff0c;或者一个内…

学习【菜鸟教程】【C++ 类 对象】【C++ 类的静态成员】

链接 1. 教程 可以使用 static 关键字来把类成员定义为静态的。当我们声明类的成员为静态时&#xff0c;这意味着无论创建多少个类的对象&#xff0c;静态成员都只有一个副本。 静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句&#xff0c;在创建第一个对象时…

windows环境下安装RabbitMQ(超详细),

windows环境下安装RabbitMQ&#xff08;超详细&#xff09; 注&#xff1a;安装路径&#xff0c;用户名均为英文 一、RabbitMq简介 1.1消息队列中间件简介 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量削锋等问题…

Python中模块的使用3

在运行Python程序时&#xff0c;总会用到Python的标准库模块。一些标准库模块被内嵌到Python解释器中&#xff0c;通过调用这些模块提供的函数&#xff0c;可以实现特殊的功能。sys模块就是Python的一个标准库模块&#xff0c;该模块被被内嵌到Python解释器中。 1 sys模块的导…

SpringCloud 性能优化

文章目录 Springcloud的性能问题应用服务组件调优Servlet 容器 优化Feign 配置优化 Gateway组件调优Zuul配置 优化hystrix配置 优化ribbon 优化 Springcloud的性能问题 Springcloud 原始的配置&#xff0c;性能是很低的&#xff0c;大家可以使用Jmeter测试一下&#xff0c;QPS…

深度学习编译器

1.为什么需要深度学习编译器 深度学习编译器主要为解决不同框架下训练的模型部署到指定的某些设备上时所遇到的一系列复杂的问题&#xff0c;即将各种深度学习训练框架的模型部署到各种硬件所面临的问题&#xff1b; 首先深度学习领域&#xff0c;从训练框架看&#xff0c;当前…

考研C语言第四章

4.1 关系表达式与逻辑表达式 ps&#xff1a; 算术运算符&#xff1a;加减乘除等 关系运算符&#xff1a;比大小的 逻辑与逻辑或 非&#xff01;的运算级别&#xff08;应该&#xff09;最高 4.2 if-else #include <stdio.h> //上课这个写while的原因是方便一次一次…

springWEB搭建

概述 SpringWEB就是spring框架里得一个模块* SpringWeb的前身是SpringMVC springMVC介绍 在之前的后端三大架构: Controller: 控制层, 包含了servlet, 对数据的接收, 处理, 响应 Model: 数据模型, dao, model VIew: 视图, jsp, 用于将数据添加到html中进行响应 工作流程: 主要…

Java:mybatis-plus-generator-ui 基于Mybatis-Plus的代码自助生成器

引用官方文档上的简介&#xff1a; 提供交互式的Web UI用于生成兼容mybatis-plus框架的相关功能代码&#xff0c;包括Entity,Mapper,Mapper.xml,Service,Controller等 &#xff0c;可以自定义模板以及各类输出参数&#xff0c;也可通过SQL查询语句直接生成代码。 文档 githu…

安卓基础巩固(四):设计原则、安卓主流技术框架MVC/MVP/MVVM、设计模式

文章目录 架构设计为什么要进行技术框架的设计 六大设计原则一、单一职责原则二、开闭原则三、依赖倒置原则四、接口分离原则五、迪米特法则&#xff08;又称最小知道原则&#xff09;六、里氏替换原则案例诠释 安卓主流开发技术框架MVC模式MVP模式MVVMMVP模式详解 设计模式构造…

27 VueComponent 计算属性的实现

前言 这是最近的碰到的那个 和响应式相关的问题 特定的操作之后响应式对象不“响应“了 引起的一系列的文章 主要记录的是 vue 的相关实现机制 呵呵 理解本文需要 vue 的使用基础, js 的使用基础 测试用例 用例如下, 我们这里核心关注 counterPlus100 这个计算变量 问…

java 社区人口管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 java 社区人口管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0…

白银实时价格应该在最适合的地方下注

小时候我们看战争片&#xff0c;总是发现主角们带兵打仗&#xff0c;战无不胜&#xff0c;偶尔有一场大的失利&#xff0c;但是总是能耐化险为夷&#xff0c;逢凶化吉&#xff0c;甚至最后成功反扑、反败为胜。后来小编一琢磨&#xff0c;发现&#xff0c;其实这些将才们打仗&a…

在 Visual Studio 2022 中使用 GitHub Copilot chat

本文通过实际应用场景和示例代码展示了 GitHub Copilot Chat 在 Visual Studio 2022 中的优势和特点。最后&#xff0c;鼓励读者在实际工作中尝试使用 Copilot Chat&#xff0c;以提升开发效率和代码质量。希望这些信息和经验能为你在使用GitHub Copilot时提供帮助和启发。 1. …

短信验证码

阿里云短信 1.1 介绍 短信服务&#xff08;Short Message Service&#xff09;由阿里云提供短信平台&#xff0c;调用API即可发送验证码、通知类和营销类短信&#xff1b;国内验证短信秒级触达&#xff0c;到达率最高可达99%。 官方网站&#xff1a;https://www.aliyun.com/…

【JavaSE】Java基础语法(十八):接口

文章目录 1. 接口的概述2. 接口的特点3. 接口的成员特点4. 类和接口的关系5. 抽象类和接口的关系 1. 接口的概述 接口就是一种公共的规范标准&#xff0c;只要符合规范标准&#xff0c;大家都可以通用。Java中接口存在的两个意义 用来定义规范用来做功能的拓展 2. 接口的特点…

听我一句劝,别去外包,干了五年,废了....

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入杭州某软件公司&#xff0c;干了接近5年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了5年的功能测试…

c++ 11标准模板(STL) std::map(二)

定义于头文件<map> template< class Key, class T, class Compare std::less<Key>, class Allocator std::allocator<std::pair<const Key, T> > > class map;(1)namespace pmr { template <class Key, class T, clas…

想劝大家别去外包,干了5年,彻底废了......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近5年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四…