如何制作像 lodash & date/fns 这样的 cherry picking react 组件库

How to make cherry picking react component library like lodash & date/fns

我制作了一个包含 20-25 个不同组件的小型库,并制作了一个 npm 包。

我的反应项目,我想在其中使用这些组件,有很多页面[路由]使用延迟加载所以每个页面都有自己的包。

但是当我在主页上写声明时[App.js]。

    import { MyModal } from 'my-react-lib';

每个组件都加载到主页包中。所以我的初始加载性能最差。 [2Mb 初始包大小]

我已经阅读了 tree shaking 和 event 的概念,试图在 webpack 中实现,甚至使用 rollup,但它们只实现 bundle.js 但不符合我的要求。

我愿意像进出口一样实现挑剔。与 date-fns 和 lodash 相同。

      import format from 'date-fns/format';
      import debounce from 'lodash/debounce';

如何实现?

   import MyModal from 'my-react-lib/MyModal';
   import OtherComponent from 'my-react-lib/OtherComponent';

您可能需要单独打包。

例如Material-UI,它有很多部分。当我们正常使用的时候

npm install @material-ui/core

如果你查看他们的 source,你会发现有多个包,每个包都有自己的 package.json 文件

例如@material-ui/corepacakge.json

{
  "name": "@material-ui/core",
  "version": "4.9.7",
  "private": false,
  "author": "Material-UI Team",
  ...
  "dependencies": {
    "@babel/runtime": "^7.4.4",
    "@material-ui/styles": "^4.9.6",
    "@material-ui/system": "^4.9.6",
    "@material-ui/types": "^5.0.0",
    "@material-ui/utils": "^4.9.6",

这意味着它们实际上是独立的并且相互依赖。

嗯,这就是范围。

Rollup 允许您将您的库拆分为几个独立的块。您必须提供一个对象,将名称映射到入口点,到汇总配置的 input 属性。它看起来像这样:

input: {
    index: 'src/index.js',
    theme: 'src/Theme',
    badge: 'src/components/Badge',
    contentCard: 'src/components/ContentCard',
    card: 'src/elements/Card',
    icon: 'src/elements/Icon',
    ...

src/index.js 看起来像这样:

export { default as Theme } from './Theme'
export { default as Badge } from './components/Badge'
...

查看 rollup 的文档:https://rollupjs.org/guide/en/#input

输出设置到一个目录:

output: [
  {
    dir: 'dist/es',
    format: 'es',
  },
],

然后你在你的package.json中声明入口点如下:

"module": "dist/es/index.js",

然后可以导入您的库的模块:

import { Theme, Badge } from 'your-component-library'