I'm currently building a library of React components and bundling it with Webpack 4.
Everything works just fine from building the library's bundle to publishing it on an npm registry.
But then, I'm not able to import any of its components in an other React application and get this error message at runtime:
Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
And here is the related code:
A dumb component from my components library:
button/index.js
import React from "react";
const Button = () => <button>Foobar</button>;
export { Button };
The main entry point of my library index.js
:
import { Button } from "./src/components/Button";
export { Button };
My Webpack config 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: ""
}
};
And finally, the import of this component in an other application:
import { Button } from "my-design-system";
I guess I'm missing something in my Webpack config or one of the property may be wrong, but after reading multiple posts and tutorials, I can't figure which one.
You're exporting your library as
commonjs
and trying to import it viaimport/export
syntax. You should change your output toFound a lot of info here: https://webpack.js.org/guides/author-libraries/
I have created a library on react base component and generating a build file for each components. In a component, I am using a 3rd party library and the problem is, generated build component consist all the functions which is new library however I am using only one.
Thanks
What I would do is to export your components as default and then re-export as named from
index.js
:Then you can do
Also make sure you have
main
set up, pointing to yourindex.js
, in your design system'spackage.json
Additionally, if you still want to have named exports in some of your components, you can export everything from that component file:
Either way you will make sure there's always one point of export for all your components.
EDIT: As noted in by Maaz Syed Adeeb, you have wrong
libraryTarget
in your config. I'd remove bothlibraryTarget
andlibrary
from there.