Fix __webpack_imported_module_ is not a function for webpack5
This fix is relevant to you if you had a library on webpack4 or webpack3 that exported a function and after update to webpack5 in apps that import this library you started to see:
TypeError: <library_name>__WEBPACK_IMPORTED_MODULE_<somenumber>___default() is not a function
This happened for one of my packages and library user created an issue about TypeError.
I spent some time investigating it and it turned out that now webpack started to wrap the exported function in the object. So my previous builds of library worked fine with the next syntax:
import Painterro from 'painterro'
And now the only way to make it work was:
import { Painterro } from 'painterro'
This way is called named import, not so bad actually, there are a lot of advantages comparing to my previous export default method.
But for a library that already has 50k downloads on npm without fallback to previous behavior would be the road to pain:
Yes, it is possible to explain the change in npm notice, add bold text in Readme, bump the minor number according to semver, but anyway, we would find users which will start asking why it is not working. Other users will just drop away the idea to use the library once face this issue.
So I created a minimal reproducible example and issue on webpack repo and the project member quickly explained what happened:
Because it was bug in v4 and now it is fixed, usinglibrary: 'P2',
meansmodule.exports.P2 = {}
, but if you don't need it, just removelibrary: 'P2',
and keeplibraryTarget: 'commonjs2'
Thing is that I indeed had a library: 'Painterro'
, in module.exports.output
in webpack.config.js
:
module.exports = {
output: {
path: path.resolve(__dirname, 'build'), // folder where library will be placed
filename: 'painterro.commonjs2.js', // filename of the library
library: 'Painterro', // ⏪ this is the issue
libraryTarget: 'commonjs2',
},
....
}
So what I did is just removed library: 'Painterro'
and previous behavior returned back!