leafo / sticky-kit

A jQuery plugin for creating smart sticky elements
http://leafo.net/sticky-kit
2.91k stars 520 forks source link

$ is not defined (with webpack) #272

Open maejml opened 4 years ago

maejml commented 4 years ago

Got this error when I import sticky-kit with webpack :

Uncaught TypeError: $ is not a function at Object.<anonymous> (sticky-kit.js:9) at Object../node_modules/sticky-kit/dist/sticky-kit.js (sticky-kit.js:326) at __webpack_require__ (bootstrap:19) ...

My import line import 'sticky-kit/dist/sticky-kit'; is working. jQuery is working too (debugged with a console log), I have the right lines in environment.js and config etc.

In the config, I added this rule as seen in another question but it didn't work : { test: /\.js$/, include: [ path.join(__dirname, 'node_modules', 'sticky-kit') ], use: [{ loader: 'imports-loader?jQuery=jquery,$=jquery,window=>global&window.jQuery=jquery,this=>window,define=>false' }] }

What am I not doing right ?

dimasi commented 4 years ago

+1

dimasi commented 4 years ago

Got this error when I import sticky-kit with webpack :

Uncaught TypeError: $ is not a function at Object.<anonymous> (sticky-kit.js:9) at Object../node_modules/sticky-kit/dist/sticky-kit.js (sticky-kit.js:326) at __webpack_require__ (bootstrap:19) ...

My import line import 'sticky-kit/dist/sticky-kit'; is working. jQuery is working too (debugged with a console log), I have the right lines in environment.js and config etc.

In the config, I added this rule as seen in another question but it didn't work : { test: /\.js$/, include: [ path.join(__dirname, 'node_modules', 'sticky-kit') ], use: [{ loader: 'imports-loader?jQuery=jquery,$=jquery,window=>global&window.jQuery=jquery,this=>window,define=>false' }] }

What am I not doing right ?

Just add

window.jQuery = $; window.$ = $;

in your common component.

adriaandotcom commented 4 years ago

I solved this by adding window.jQuery in ProvidePlugin:

  ...
  resolve: {
    alias: {
      jquery: require.resolve('jquery')
    }
  },
  plugins: [
    new webpack.ProvidePlugin({
      $: "jquery",
      jQuery: "jquery",
      "window.jQuery": "jquery"
    }),
  ],
  ...

And in the file where I used $("#sidebar").stick_in_parent({}) I added:

import $ from 'jquery'
import 'sticky-kit/dist/sticky-kit'

Make sure you don't link to jquery/src/jquery because require.resolve('jquery') links to dist.