There are many cases to make the error message. These are some:
1/. jQuery is not installed. Fix: npm i jquery
2/. $ refers to jQuery but the scope is not global.
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery"
})
By using this way, we define 2 global variables with the names $ and jQuery which refer to jquery. So,
Q: Where is the scope of that global?
A: Inside bundle.js file or any js file which is refered in webpack.config.js file:
entry: {
'bundle.js': ['./assets/js/site', './assets/sdk/js/app']
}
In the file site.js and app.js, $ and jQuery are 2 global variables.
Every js file else cannot use $ and jQuery because of not defined.
Q: I just want to compile the 2 files site.js and app.js to the file bundle.js. But I still want to use jquery in any .html/.php/.cshtml... file(s), how can I do that?
A: Make jquery is global using window object. Like this:
site.js:
(function (global) {
// $ and jQuery are function here...
global.$ = $;
global.jQuery = jQuery;
}(typeof window !== 'undefined' ? window : this));
Then,
<!-- bundle.js contains the code which makes $ refers to jquery, so we need to import it first -->
<script src="bundle.js"></script>
<script>
// it should work
$(document).ready(function(){
alert("here");
});
</script>
In other js files, we can use this way too. Or using 'require':
test.js:
var $ = require('jQuery');
Notice: In many cases, window may NOT an object in webpack, that why we need the line:
typeof window !== 'undefined' ? window : this
If you just write:
window.$ = $;
It may throw an error message like this:
window is not defined
Hope this helps!