rollup从0到1将react组件库打包发布npm

简介: rollup从0到1将react组件库打包发布npm记录全过程

您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~

前段时间一直在更新react组件库的每一个组件,今天来测试一下在实际业务中使用组件库~

我使用了rollup来打包组件库

1.搭建库打包脚手架:

首先我们安装一下rollup:

npm i rollup -g

我的组件库项目目录是这样的,所有组件都在index.ts中暴露出去
在这里插入图片描述
代码写好以后,最基础的rollup.config.js版本可以这样配置:

// rollup.config.js
export default {
   
   
  input: 'src/index.ts',
  output: {
   
   
    file: 'cjs.js',
    format: 'cjs'
  }
};

在终端执行:

rollup -c

即可完成打包

2.rollup插件使用

为了更灵活的打包库文件,我们可以配置rollup插件,比较实用的插件有: rollup-plugin-node-resolve ---帮助 Rollup 查找外部模块,然后导入 rollup-plugin-commonjs ---将CommonJS模块转换为 ES2015 供 Rollup 处理 rollup-plugin-babel --- 让我们可以使用es6新特性来编写代码 rollup-plugin-terser --- 压缩js代码,包括es6代码压缩 * rollup-plugin-eslint --- js代码检测

打包一个库用以上插件完全够用了,不过如果想实现对react等组件的代码,可以有更多的插件可以使用,这里就不一一介绍了。

我们可以这样使用,类似于webpack的plugin配置:

import resolve from 'rollup-plugin-node-resolve';
import commonjs from 'rollup-plugin-commonjs';
import babel from "rollup-plugin-babel";
import {
   
    terser } from 'rollup-plugin-terser';
import {
   
    eslint } from 'rollup-plugin-eslint';

export default [
    {
   
   
        input: 'src/main.js',
        output: {
   
   
            name: 'timeout',
            file: '/lib/tool.js',
            format: 'umd'
        },
        plugins: [
            resolve(),  // 这样 Rollup 能找到 `ms`
            commonjs(), // 这样 Rollup 能转换 `ms` 为一个ES模块
            eslint(),
            babel(),
            terser()
        ]
    }
];

其实看起来和webpack差不多,只是在rollup中plugin变成了一个个函数的调用,看起来更加清晰。

3.利用babel来编译es6代码

首先我们先安装babel相关模块:

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

然后设置.babelrc文件

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

@babel/preset-env可以根据配置的目标浏览器或者运行环境来自动将ES2015+的代码转换为es5。需要注意的是,我们设置"modules": false,否则 Babel 会在 Rollup 有机会做处理之前,将我们的模块转成 CommonJS,导致 Rollup 的一些处理失败。

为了解决多个地方使用相同代码导致打包重复的问题,我们需要在.babelrc的plugins里配置@babel/plugin-transform-runtime,同时我们需要修改rollup的配置文件:

babel({
   
   
  exclude: 'node_modules/**', // 防止打包node_modules下的文件
  runtimeHelpers: true,       // 使plugin-transform-runtime生效
}),

4. external属性

使用rollup打包,我们在自己的库中需要使用第三方库,例如lodash等,又不想在最终生成的打包文件中出现jquery。这个时候我们就需要使用external属性。比如我们使用了lodash,

import _ from 'lodash'

// rollup.config.js
{
   
   
    input: 'src/main.js',
    external: ['lodash'],
    globals: {
   
   
        lodash: '_'
    },
    output: [
    {
   
    file: pkg.main, format: 'cjs' },
    {
   
    file: pkg.module, format: 'es' }
    ]
}

6.导出模式

我们可以将自己的代码导出成commonjs模块,es模块,以及浏览器能识别的模块,通过如下方式设置:

{
   
   
  input: 'src/main.js',
  external: ['ms'],
  output: [
    {
   
    file: pkg.main, format: 'cjs' },
    {
   
    file: pkg.module, format: 'es' },
    {
   
    file: pkg.module, format: 'umd' }
  ]
}

7.发布到npm

你可以通过如下方式配置package.json:

{
   
   
  "name": "react-view-ui",
  "version": "1.0.1",
  "description": "ui package",
  "main": "dist/tool.cjs.js",
  "module": "dist/tool.esm.js",
  "browser": "dist/tool.umd.js",
  "author": "xin_feng",
  "dependencies": {
   
   
    // ...
  },
  "devDependencies": {
   
   
    // ...
  },
  "scripts": {
   
   
    "build": "NODE_ENV=production rollup -c",
    "dev": "rollup -c -w",
    "test": "node test/test.js",
    "pretest": "npm run build"
  },
  "files": [
    "dist"
  ]
}

dist为上传到npm库的指定目录,我们将打包后的dist目录传上去即可。

8.业务中使用

我们可以在实际项目中通过:

yarn add react-view-ui | npm i react-view-ui

来安装UI库,安装完成后,在项目中通过:

//jsx中:
import {
   
    Button, Radio, RadioGroup, Divider, Layout, Slider, Menu, Header, Content, Footer, Pagination } from 'react-view-ui/dist/my-lib-esm';
//App.jsx根目录中引入css样式
import 'react-view-ui/dist/index.css'

我是把之前写的8个组件都试了一下,项目运行界面是这样的:
在这里插入图片描述

实际使用方式在文档中有写,可参考:react-view-ui官方文档

import './App.css';
import {
   
    Button, Radio, RadioGroup, Divider, Layout, Slider, Menu, Header, Content, Footer, Pagination } from 'react-view-ui/dist/my-lib-esm'
import {
   
    useEffect } from 'react';
import {
   
    AppstoreOutlined, MailOutlined, SettingOutlined } from '@ant-design/icons';
import Hello from './component/hello'



function App() {
   
   

  const options = [10, 20, 30, 50]
  const handleClick = () => {
   
   
    console.log(1)
  }
  const handleRouteChange = (a) => {
   
   
    console.log(a)
  }
  const getItem = (
    label,
    key,
    level,
    icon,
    children,
  ) => {
   
   
    return {
   
   
      label,
      key,
      level,
      icon,
      children,
    };
  };
  const items = [
    getItem('Navigation One', 'sub1', 1, null, [
      getItem('Option 1', '1', 2),
      getItem('Option 2', '2', 2),
      getItem('Option 3', '3', 2),
      getItem('Option 4', '4', 2),
    ]),
    getItem('Navigation Two', 'sub2', 1, null, [
      getItem('Option 5', '5', 2),
      getItem('Option 6', '6', 2, null, [
        getItem('Option 13', '13', 3),
        getItem('Option 14', '14', 3),
      ]),
      getItem('Submenu', 'sub3', 2, null, [
        getItem('Option 15', '15', 3),
        getItem('Option 16', '16', 3),
      ]),
    ]),
    getItem('Navigation Three', 'sub4', 1, null, [
      getItem('Option 9', '9', 2),
      getItem('Option 10', '10', 2),
      getItem('Option 11', '11', 2),
      getItem('Option 12', '12', 2),
    ]),
  ];


  return (
    <div className="App" style={
   
   {
   
    marginLeft: "20px" }}>
      <Button handleClick={
   
   handleClick}>123</Button>
      <RadioGroup value={
   
   0} canAddOption boxStyle>
        <Radio>Apple</Radio>
        <Radio>Orange</Radio>
        <Radio>Watch</Radio>
      </RadioGroup>
      <Layout>
        <Header>header</Header>
        <Layout>
          <Slider row={
   
   3} extraStyle={
   
   {
   
    height: '100%', padding: '0 0 50px 0' }}>
            <Menu items={
   
   items} handleRouteChange={
   
   handleRouteChange} defaultOpen />
          </Slider>
          <Content row={
   
   7}>content</Content>
        </Layout>
        <Footer>
          footer
        </Footer>
      </Layout>
      <Pagination
        total={
   
   200}
        showSizeChanger
        pageSizeOptions={
   
   options}
        showJumpInput
      />
      <div style={
   
   {
   
    marginTop: "30px" }}>
        <Divider>文档分割</Divider>
      </div>
    </div>
  )
}
export default App;

这样以后就可以在项目中使用自己喜欢风格的react组件啦~

目录
相关文章
|
前端开发 JavaScript UED
react实现分片打包
react实现分片打包
233 0
项目打包报错“caniuse-lite is outdated. Please run next command `npm update`”的解决方案
项目打包报错“caniuse-lite is outdated. Please run next command `npm update`”的解决方案
1298 1
|
前端开发 JavaScript Java
SpringBoot项目部署打包好的React、Vue项目刷新报错404
本文讨论了在SpringBoot项目中部署React或Vue打包好的前端项目时,刷新页面导致404错误的问题,并提供了两种解决方案:一是在SpringBoot启动类中配置错误页面重定向到index.html,二是将前端路由改为hash模式以避免刷新问题。
1704 1
|
前端开发 Java 编译器
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
639 36
当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
|
移动开发 JavaScript 前端开发
vue中npm打包遇到× eslint —fix found some errors. Please fix them and try committing again.husky > pre-commit hook failed (add —no-verify to bypass)报错解决方案-卓伊凡
vue中npm打包遇到× eslint —fix found some errors. Please fix them and try committing again.husky > pre-commit hook failed (add —no-verify to bypass)报错解决方案-卓伊凡
570 7
vue中npm打包遇到× eslint —fix found some errors. Please fix them and try committing again.husky > pre-commit hook failed (add —no-verify to bypass)报错解决方案-卓伊凡
node环境之当我们遇到需要付费的依赖库@fortawesome/fontawesome-pro导致npm install无法进行怎么办-fontawesome-pro依赖库
node环境之当我们遇到需要付费的依赖库@fortawesome/fontawesome-pro导致npm install无法进行怎么办-fontawesome-pro依赖库
562 3
node环境之当我们遇到需要付费的依赖库@fortawesome/fontawesome-pro导致npm install无法进行怎么办-fontawesome-pro依赖库
|
JavaScript 前端开发 应用服务中间件
本地运行打包好的React、Vue项目
本文讨论了如何本地运行打包好的React和Vue项目,并解决了使用React-Router时Tomcat部署刷新页面导致404的问题,提出了将请求转回index.html的解决方案。
528 1
本地运行打包好的React、Vue项目
|
资源调度 JavaScript API
Vue3+TS+Vite开发组件库并发布到npm
这篇文章介绍了如何使用Vue 3、TypeScript和Vite开发一个包含35个常用UI组件和8个API功能函数的组件库`vue-amazing-ui`,并将其发布到npm,同时提供了组件库的安装使用说明和在线预览。
608 2
Vue3+TS+Vite开发组件库并发布到npm
|
缓存 资源调度 JavaScript
Vue3+TS+Vite开发组件库并发布到npm
**vue-amazing-ui 组件库** 是一个基于 Vue 3 的高质量 UI 组件库,提供了丰富的组件和工具函数。该库已发布至 npm,可通过 `pnpm i vue-amazing-ui`、`yarn add vue-amazing-ui` 或 `npm install vue-amazing-ui` 安装使用。组件包括按钮、面包屑、卡片、日期选择器等,同时提供了日期格式化、节流、防抖等实用工具函数。项目结构清晰,支持按需加载,并提供了详细的文档与在线预览。
485 1
Vue3+TS+Vite开发组件库并发布到npm
|
移动开发 小程序 数据可视化
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
5019 3

推荐镜像

更多
  • NPM