如何构建React组件库?
#javascript #react #开源 #package

在本文中,我试图讨论创建React组件库的步骤。

为什么我们需要构建React组件库?

如果您在项目之间共享了几个组件或某些JS代码,这些组件是复制的,这些事情发生了超过2或3次,则需要将共享代码转换为库。

所以让我们创建一个React组件库。

首先,我们需要生成我们的组件。我们可以创建一个React项目并创建一个组件。我们的文件夹结构就是这样:

├── src
│   ├── components
|   │   ├── Button
|   |   │   ├── Button.tsx
|   |   │   ├── Button.scss
|   |   │   └── index.ts
|   │   ├── TextField
|   |   │   ├── TextField.tsx
|   |   │   ├── TextField.scss
|   |   │   └── index.ts
|   │   └── index.ts
├── package.json
├── tsconfig.json
└── rollup.config.js

src/components/index.ts

export { default as Button } from "./Button";
export { default as TextField } from "./TextField";

创建组件后,我们需要配置汇总。我们使用汇总来捆绑我们的库(也可以使用webpack)。

让我们配置汇总以捆绑我们的库:

rolup.config.js

import externalDeps from 'rollup-plugin-peer-deps-external';
import typescript from '@rollup/plugin-typescript';
import sourcemaps from 'rollup-plugin-sourcemaps';
import resolve from '@rollup/plugin-node-resolve';
import commonJS from 'rollup-plugin-commonjs';
import replace from '@rollup/plugin-replace';
import styles from 'rollup-plugin-styles';
import babel from 'rollup-plugin-babel';
import json from '@rollup/plugin-json';
import pkg from './package.json';

const globals = {
  react: 'React',
  'react-dom': 'ReactDOM',
  'react-query': 'ReactQuery',
};

const plugins = [
  externalDeps(), //prevents packages listed in peerDependencies from being bundled with our component library
  commonJS(), //convert common js modules to es6
  resolve(), // Locate and bundle third-party dependencies in node_modules
  typescript(), // transpiles our TypeScript code into JavaScript.
postcss() // transforms our Sass into CSS
];

export default {
  input: `./src/components/index.ts`,
  output: [
    {
      name: 'index',
      file: `lib/index.cj.js`,
      format: 'cjs',
      sourcemap: true,
    },
    {
      name: 'index' ,
      file: `lib/index.es.js`,
      format: 'esm',
      sourcemap: true,
    },
    {
      name: 'index',
      file: `lib/index.umd.js`,
      format: 'umd',
      sourcemap: true,
      globals,
    },
  ],
  plugins,
}));

ESM与普通JS vs UMD
这些类型是JS模块格式。
WebPack和Node等一些工具使用常见的JS格式,以及一些工具,例如Rollup和WebPack2使用ESM模块。 UMD(通用模块定义)是努力在任何地方工作的模块类型。另外,UMD是其他格式的后备。如果您想将这些文件中的任何一个在浏览器中作为独立脚本标签,而没有像构建步骤这样的构建步骤。 webpack,您将要使用UMD。

如何测试我们的包装?
在发布之前,我们有3个选项可以测试我们的软件包:

  1. NPM链接
  2. NPM Pack
  3. 故事书

npm链接:
NPM链接在系统的NODE_MODULE中添加我们的软件包,并在全球安装软件包。每次更改文件时

npm包:
此命令将打包我们的软件包,我们可以在项目中安装软件包。我们在包装中进行的每一个更改,我们都需要运行此命令并再次安装我们的库。

故事书:
我认为,在本地测试我们的包裹的最佳方法是故事书。
此外,要测试我们的软件包,我们也可以拥有良好的文档。

最后一步:
最后,我们应该发布我们的包裹。
使用npm publish,我们可以在NPM注册表中发布包裹,但是在此之前,我们应该在NPM中创建一个帐户。
另外,我们需要对packge.json文件进行一些更改。

package.json:

{
  "name": "@react-components-library/react-sample-components-library",
  "version": "0.0.20",
  "main": "lib/index.js", // common js 
  "module": "lib/index.es.js", //esm
  "browser": "lib/index.umd.js", //umd
  "files": [
    "/lib"
  ],
  "type": "module",
  "scripts": {
    "test": "jest",
    "start": "styleguidist server",
    "build": "rm -rf ./lib && rollup -c",
    "prepublishOnly": "rm -rf lib && npm run build",
    "postbuild": "npm pack && tar -xvzf *.tgz && rm -rf package *.tgz",
    "docs:build": "styleguidist build"
  },
  "peerDependencies": {
    "react": "17.0.2",
    "react-dom": "17.0.2"
  },
...
}

这里有一些提示:

  1. 我们应该在同伴依赖性中做出反应和反应,以防止汇总将这些软件包添加到我们的捆绑包中。
  2. npm publish执行时,首先运行prepublishOnly脚本。因此,我们可以将构建步骤添加到此脚本中。
  3. files指示哪些文件或文件夹应推到NPM注册表。