Webpack Imported Module Is Not A Constructor
Solution 1:
If you are not the library author and are having a problem consuming another library, you may be seeing an error like this:
TypeError: [LIBRARY_NAME]__WEBPACK_IMPORTED_MODULE_3__ is not a constructor
If that's the case, you may be importing the library incorrectly in your code (it may be a problem with default exports). Double check the library docs for usage.
It may be as simple as changing this:
importFoofrom'some-library/Foo';
to this:
import { Foo } from'some-library';
Solution 2:
It is not working because it is missing libraryTarget and library
properties. By doing that webpack know which format of module you would like to create, i.e: commonjs (module.exports
) or es (export
).
I would do something like:
...
output: {
path: path.join(__dirname, 'dist'),
filename: path.join('[name]', 'index.js'),
library: "my-library",
libraryTarget: "umd" // exposes and know when to use module.exports or exports.
},
...
Solution 3:
Besides setting the libraryTarget
, it may also be necessary to move the export
in the JavaScript file to the default.
functionMyClassName() {
...
}
exportdefaultMyClassName;
And then in the webpack configuration the library type umd
...
(Note that I have used the newer library.type
instead the older libraryTarget
(see https://webpack.js.org/configuration/output/#outputlibrarytarget).
const path = require('path');
module.exports = {
mode: "production",
entry: '../wherever/MyClassName.js',
output: {
library: {
name: "MyClassName",
type: "umd", // see https://webpack.js.org/configuration/output/#outputlibrarytype
export: "default", // see https://github.com/webpack/webpack/issues/8480
},
filename: 'MyClassName.min.js',
path: path.resolve(__dirname, '../wherever/target/')
},
optimization: {
minimize: true
}
};
The export default
makes the class available in JavaScript like the file was embedded directly, i.e.,
<scripttype="text/javascript"src="MyClassName.min.js"></script><scripttype="text/javascript"><!--
var myInstance = new MyClassName();
// --></script>
Disclaimer: I added this answer even though the original question is three years old by now. After encountering the "is not a constructor" issue, it took me hours of searching to find the default
solution. And that was the second time, I searched and found it :D
Solution 4:
Cf. David Calhoun's answer, if you run into this with a third-party library, you may be trying to import a CommonJS module as an ECMAScript module. The workaround there seems to be to use require
instead of import
, e.g., instead of
import { Foo } from'bar'
you need to write
constFoo = require('bar')
(There may be a more elegant way to handle this, but this is what worked for me.)
Post a Comment for "Webpack Imported Module Is Not A Constructor"