tweetok
tweetok

Reputation: 70

Installing npm packages to Laravel in 5.7

I'm trying to install npm packages to my Laravel project. So I've installed npm with npm installand then did npm install masonry-layout then I ran npm run watch and it appears in my node_modules folder.

I've tried adding require('masonry-layout'); to my app.js and adding window.anything = require('masonry-layout'); or window._ = require('masonry-layout'); to my bootstrap.js - im calling it on my view like this:

var $grid = $('.grid').imagesLoaded( function() {
    $grid.masonry({
        itemSelector: '.grid-item',
        columnWidth: '.grid-sizer',
        percentPosition: true,
        isResizable: true,
        transitionDuration: '0.8s',
        isAnimated: true
    });
});

My app.js:

require('./bootstrap');
require('masonry-layout');
require('imagesloaded');

bootstrap.js:


window._ = require('lodash');
window.anything = require('masonry-layout');
window.anything = require('imagesloaded');


/**
 * We'll load jQuery and the Bootstrap jQuery plugin which provides support
 * for JavaScript based Bootstrap features such as modals and tabs. This
 * code may be modified to fit the specific needs of your application.
 */

try {
    window.Popper = require('popper.js').default;
    window.$ = window.jQuery = require('jquery');

    require('bootstrap');
} catch (e) {}

/**
 * We'll load the axios HTTP library which allows us to easily issue requests
 * to our Laravel back-end. This library automatically handles sending the
 * CSRF token as a header based on the value of the "XSRF" token cookie.
 */

window.axios = require('axios');

window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';

/**
 * Next we will register the CSRF Token as a common header with Axios so that
 * all outgoing HTTP requests automatically have it attached. This is just
 * a simple convenience so we don't have to attach every token manually.
 */

let token = document.head.querySelector('meta[name="csrf-token"]');

if (token) {
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
    console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}

/**
 * Echo exposes an expressive API for subscribing to channels and listening
 * for events that are broadcast by Laravel. Echo and event broadcasting
 * allows your team to easily build robust real-time web applications.
 */

// import Echo from 'laravel-echo'

// window.Pusher = require('pusher-js');

// window.Echo = new Echo({
//     broadcaster: 'pusher',
//     key: process.env.MIX_PUSHER_APP_KEY,
//     cluster: process.env.MIX_PUSHER_APP_CLUSTER,
//     encrypted: true
// });

and yes, I installed imagesLoaded too, but this isnt working either. If I include the cdn to my view it works like it should do.

What am I doing wrong?

Upvotes: 0

Views: 426

Answers (1)

Chin Leung
Chin Leung

Reputation: 14921

You are loading masonry-layout and imagesLoaded before loading your jQuery. You should have it load after jQuery like this:

try {
    window.Popper = require('popper.js').default;
    window.$ = window.jQuery = require('jquery');

    window.Masonry = require('masonry-layout');
    window.ImagesLoaded = require('imagesloaded');

    require('bootstrap');
} catch (e) {}

Then you can use it like this:

new Masonry('.grid', {
    // options
});

Also, you can remove them from your app.js.

Note

If you really want to be able to use it like $('.grid').masonry(...), then you need to install jquery-bridget:

npm install jquery-bridget

Then do this in your bootstrap file:

var $ = require('jquery');
var jQueryBridget = require('jquery-bridget');
var Masonry = require('masonry-layout');

// make Masonry a jQuery plugin
jQueryBridget( 'masonry', Masonry, $ );

// now you can use $().masonry()
$('.grid').masonry({
  columnWidth: 80
});

For more information: https://masonry.desandro.com/extras.html#webpack

Upvotes: 3

Related Questions