It has been three days now that I am trying to understand webpack to perform a simple task (that of course, in the course of three days I could have done by hand) but for the sake of learning webpack and be able to scale up...
I come with you with a desperate question, that is related probably to what this person was trying to achieve How do I concatenate and minify files using webpack but his solution did not work for me.
The problem is quite simple I have three classes:
./src/class1.js
export default class One {
constructor() {
this.isHorrible = true
}
whatIsHorrible() {
return (this)
}
}
./src/class2.js
class Two {
iMSoFat() {
this.fatness = 88
return (this.fatness)
}
}
export { Two }
./src/class3.js
class Three {
constructor() {
this.isHorrible = true
}
whatIsHorrible() {
return (this)
}
}
export { Three }
What i would like to do is in an index.html page :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Test ton cul</title>
<script src="./lib/ebjs.js" charset="utf-8"></script>
</head>
<body>
<script type="text/javascript">
console.log(One, Two, Three);
</script>
</body>
</html>
I would also be satisfied with
new window.One()
//.. or EVEN
new window.ebjs.One()
So I tried several config, I will spare you the excrutiating details and frustrations I went through... Lack of sleep and food.
I tried for a long long time to make the array entry point work... but then I read somewhere in the doc "If you pass an array: All modules are loaded upon startup. The last one is exported." And that explained a lot... I always got only one of the class somehow.... whatever that means... why would it behave like that ? It make absolutely no sense to me... anyways... But even then, the class I got was not of the form library.class() or window.class() or class().
So after a while I though, lets load everything in an index.js and export it !
I first tried ES6 import for the style, because why not. But import {One} from './src/class1'
does not work somehow, just produce a bunch on undefined export.. Like window.library.One = undefined.
So I fiddled round for a while again before settling for this index.js:
index.js
const class1 = require('./src/class1')
const class2 = require('./src/class2')
const class3 = require('./src/class3')
export { class1, class2, class3 }
My webpack config has changed quite a bit but here is what I am using now :
webpackrc.config.babel.js
const libraryName = 'ebjs'
const outputFile = `${libraryName}.js`
export default {
entry: './index.js',
target: 'web',
// entry: './index.js',
devtool: 'source-map',
output: {
path: `${__dirname}/lib`,
filename: outputFile,
library: libraryName,
libraryTarget: 'umd',
umdNamedDefine: true,
},
module: {
loaders: [
{
test: /(\.jsx|\.js)$/,
loader: 'babel-loader',
exclude: /(node_modules|bower_components)/,
},
],
},
}
A lot of details and trial/errors have been painfully undertaken.. and I did write a log of my experimentations.. maybe I will share it with the world before pulling the trigger in a couple of hours.
Anyways, it kindof works, but not as expected and definitly not at production quality. To access the class I have to use "new libraryName.One.One()". If I wanted to bundle this for npm this would make no sense for the users. It still does not work as expect.
Here is a screenshot of the object on the page:
I hope someone will come to my aid. My life truly might depend on it :)
Thanks !
EDIT AND END
So cbll answer did work... I could use the es6 import statement and the classes were correctly exported into the bundle. In the html I could use
libraryName.class()
I created a small repo if someone is ever in the same predicament as I was:
https://github.com/albertbuchard/example-webpack-es6-class-bundle
Thank you again cbll and Michael Jungo !