使用 Webpack 4 构建 React 组件库

IT技术 javascript reactjs webpack
2021-04-27 15:04:09

我目前正在构建一个 React 组件库并将其与 Webpack 4 捆绑在一起。

从构建库的包到在 npm 注册表上发布它,一切都很好。

但是,我无法在其他 React 应用程序中导入它的任何组件并在运行时收到此错误消息:

元素类型无效:应为字符串(对于内置组件)或类/函数(对于复合组件)但得到:未定义。您可能忘记从定义组件的文件中导出组件,或者您可能混淆了默认导入和命名导入。

这是相关的代码:

我的组件库中的一个哑组件: button/index.js

import React from "react";

const Button = () => <button>Foobar</button>;

export { Button };

我的图书馆的主要入口点index.js

import { Button } from "./src/components/Button";

export { Button };

我的 Webpack 配置webpack.config.js

const path = require("path");
const { CleanWebpackPlugin } = require("clean-webpack-plugin");

module.exports = {
  entry: "./index.js",
  plugins: [new CleanWebpackPlugin()],
  module: {
    rules: [
      {
        test: /\.m?js$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader"
        }
      }
    ]
  },
  output: {
    filename: "index.js",
    path: path.resolve(__dirname, "dist"),
    libraryTarget: "commonjs",
    library: ""
  }
};

最后,在另一个应用程序中导入这个组件:

import { Button } from "my-design-system";

我想我的 Webpack 配置中遗漏了一些东西,或者其中一个属性可能有问题,但是在阅读了多篇文章和教程之后,我不知道是哪一个。

2个回答

您正在将库导出为commonjs并尝试通过import/export语法导入它您应该将输出更改为

output: {
  filename: "index.js",
  path: path.resolve(__dirname, "dist"),
  libraryTarget: "umd",
  library: "my-design-system"
}

在这里找到了很多信息:https : //webpack.js.org/guides/author-libraries/

我要做的是将您的组件导出为默认值,然后重新导出命名为index.js

/// Button.js
import React from "react";

const Button = () => <button>Foobar</button>;

export default Button ;
// index.js
export { default as Button } from "./src/components/Button";

然后你可以做

import { Button } from "my-design-system";

另外,还要确保你已经main设置了,指着你index.js,在你的设计系统package.json

此外,如果您仍然希望在某些组件中使用命名导出,您可以从该组件文件中导出所有内容:

//index.js
export * from "./src/components/ComponentWithNamedExports";

无论哪种方式,您都将确保所有组件始终有一个导出点。

编辑:如 Maaz Syed Adeeb 所述,您libraryTarget的配置有误我想删除这两个libraryTargetlibrary从那里。