Upgrade Laravel Mix 0.8.1 to 2.1.14

Wanted to upgrade Laravel Mix 0.8.1 to 2.1.14 today. Thought it would not be that hard to do as 2.1.14 has not had major changes compared to laravel-mix 3 or 4 with Babel and Webpack upgrades. Thought, how hard could it be. Well a lot harder than I expected it to be that is for sure.

First Trial

Well, it was a lot more painful than I wanted it to be. Spent the morning upgrading and downgrading due to jQuery not being loaded properly anymore. That and issues with the Vue Template compiler. jQuery UI and Bootstrap Sass complained jQuery was not being included

app.js?id=76b84b57bbd969a37ebf:7577 Uncaught Error: Bootstrap's JavaScript requires jQuery

and elsewhere I had NPM balking about issues like

WARNING in ./node_modules/vue-loader/lib/template-compiler?{"id":"data-v-0dc07b84","hasScoped":false,"buble":{"transforms":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./resources/assets/js/components/editor/bar/Aside.vue
(Emitted value instead of an instance of Error) : component lists rendered with v-for should have explicit keys. See https://vuejs.org/guide/list.html#key for more info.
@ ./resources/assets/js/components/editor/bar/Aside.vue 10:23-275

Trial II

So I decided to give it another go the afternoon. First thing I did was

npm remove laravel-mix
npm install laravel-mix@^2.1.0 --save-dev

I also moved jQuery require for the js file in question above Bootstrap Sass. Then I tried the change:

npm run dev

Saw several warnings

 22% building modules 101/158 modules 57 active ...nents/publish/modals/SomeModal.vue{ parser: "babylon" } is deprecated; we now treat it as { parser: "babel" }.

As well as these

WARNING in ./node_modules/vue-loader/lib/template-compiler?{"id":"data-v-1dcf7f1a","hasScoped":false,"buble":{"transforms":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./resources/assets/js/components/preview/Preview.vue
(Emitted value instead of an instance of Error) : component lists rendered with v-for should have explicit keys. See https://vuejs.org/guide/list.html#key for more info.
 @ ./resources/assets/js/components/preview/App.vue 10:23-269
 @ ./resources/assets/js/app.js
 @ multi ./resources/assets/js/app.js
----
WARNING in ./node_modules/vue-loader/lib/template-compiler?{"id":"data-v-1c708612","hasScoped":false,"buble":{"transforms":{}}}!./node_modules/vue-loader/lib/selector.js?type=template&index=0!./resources/assets/js/components/editor/modals/ImageUploaderAndSelectorModal.vue
(Emitted value instead of an instance of Error) the "scope" attribute for scoped slots have been deprecated and replaced by "slot-scope" since 2.5. The new "slot-scope" attribute can also be used on plain elements in addition to  to denote scoped slots.
 @ ./resources/assets/js/components/editor/modals/ImageUploaderAndSelectorModal.vue 10:23-297
 @ ./resources/assets/js/editor.js
 @ multi ./resources/assets/js/editor.js ./resources/assets/sass/editor.scss ./resources/assets/sass/login.scss ./resources/assets/sass/preview.scss ./resources/assets/sass/published.scss ./resources/assets/sass/dashboard.scss 

When I ran the application again initially I only saw old warning from Chrome and Vue Dev Tools. Not the jQuery errors. But so I did have these new warning on using scope in Vue as well as component lists rendering with explicit keys.

Clean Sweep

Then I did a clean sweep just to make sure I would not get these jQuery included or other errors again ruining the application’s functioning:

rm -rf node_modules
rm package-lock.json yarn.lock
npm cache clear --force
npm install

And then I compiled to see how things were going:

and I saw

npm WARN deprecated jquery-jcrop@0.9.13: No further updates to this package after v0.9.15. Please use original creator's npm package https://www.npmjs.com/package/jcrop for current/future versions 3.0+.
npm WARN deprecated vue-xeditable@1.1.2: not good enough
npm WARN deprecated browserslist@2.11.3: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.
npm WARN deprecated browserslist@1.7.7: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools.

> fsevents@1.2.9 install /Users/jasper/code/site.com/docker/laravel/node_modules/fsevents
> node install

node-pre-gyp WARN Using request for node-pre-gyp https download 
[fsevents] Success: "/Users/jasper/code/site.com/docker/laravel/node_modules/fsevents/lib/binding/Release/node-v57-darwin-x64/fse.node" is installed via remote

> node-sass@4.12.0 install /Users/jasper/code/site.com/docker/laravel/node_modules/node-sass
> node scripts/install.js

Cached binary found at /Users/jasper/.npm/node-sass/4.12.0/darwin-x64-57_binding.node

> uglifyjs-webpack-plugin@0.4.6 postinstall /Users/jasper/code/site.com/docker/laravel/node_modules/webpack/node_modules/uglifyjs-webpack-plugin
> node lib/post_install.js


> node-sass@4.12.0 postinstall /Users/jasper/code/site.com/docker/laravel/node_modules/node-sass
> node scripts/build.js

Binary found at /Users/jasper/code/site.com/docker/laravel/node_modules/node-sass/vendor/darwin-x64-57/binding.node
Testing binary
Binary is fine
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN img-loader@3.0.1 requires a peer of imagemin@^5.0.0 || ^6.0.0 but none is installed. You must install peer dependencies yourself.
npm WARN ajv-keywords@3.4.0 requires a peer of ajv@^6.9.1 but none is installed. You must install peer dependencies yourself.
npm WARN The package bootstrap-sass is included as both a dev and production dependency.
npm WARN The package vue is included as both a dev and production dependency.
npm WARN The package vue-template-compiler is included as both a dev and production dependency.

Then I compiled and did see the same warnings.

Vue Color Error

Now on backend of the app I saw these familiar errors again:

TypeError: Cannot read property 'map' of null
    at VueComponent.paletteUpperCase (editor.js?id=85ed7a9c0a7f4f7f5fbb:109185)
    at Proxy.r (editor.js?id=85ed7a9c0a7f4f7f5fbb:109185)
    at VueComponent.Vue._render (editor.js?id=85ed7a9c0a7f4f7f5fbb:127647)
    at VueComponent.updateComponent (editor.js?id=85ed7a9c0a7f4f7f5fbb:128163)
    at Watcher.get (editor.js?id=85ed7a9c0a7f4f7f5fbb:128574)
    at new Watcher (editor.js?id=85ed7a9c0a7f4f7f5fbb:128563)
    at mountComponent (editor.js?id=85ed7a9c0a7f4f7f5fbb:128170)
    at VueComponent../node_modules/vue/dist/vue.common.dev.js.Vue.$mount (editor.js?id=85ed7a9c0a7f4f7f5fbb:133140)
    at VueComponent../node_modules/vue/dist/vue.common.dev.js.Vue.$mount (editor.js?id=85ed7a9c0a7f4f7f5fbb:136025)
    at init (editor.js?id=85ed7a9c0a7f4f7f5fbb:127227) 

As I did not want to upgrade code to work with Vue Color 2.4.7 I pinned the Vue color in package.json . Actually bumped into this issue before and posted at Github here.

"vue-color": "2.4.6",

and did a new

npm install

and ran dev again. Afterwards I had no more Color Palette issue.

jQuery Errors?

The jQuery Errors I had before were still not occurring. So perhaps my app.js fix with moving jQuery before Bootstrap had helped. However, publication of app data did no longer work We got these errors

POST https://site.test/back/publish/55 500
dispatchXhrRequest @ back.js?id=cf8337ab1466593ac001:3310
xhrAdapter @ back.js?id=cf8337ab1466593ac001:3147
dispatchRequest @ back.js?id=cf8337ab1466593ac001:3715
Promise.then (async)
request @ back.js?id=cf8337ab1466593ac001:3542
wrap @ back.js?id=cf8337ab1466593ac001:3949
./resources/assets/js/bootstrap.js.window.axios.postJSON @ back.js?id=cf8337ab1466593ac001:136234
publish @ back.js?id=cf8337ab1466593ac001:6062
invokeWithErrorHandling @ back.js?id=cf8337ab1466593ac001:125965
invoker @ back.js?id=cf8337ab1466593ac001:126290
original._wrapper @ back.js?id=cf8337ab1466593ac001:131643
back.js?id=cf8337ab1466593ac001:6072 Uncaught (in promise) TypeError: Cannot read property 'status' of undefined
    at VueComponent.handleResponse (back.js?id=cf8337ab1466593ac001:6072) 

This seemed to be an issue with hitting a Xhr 200 instead of 201.

Stuck for now so moved it to a new branch:

576 git checkout -b mix2114
577 git status
578 git add -A && git commit -a -m "first laravel-mix 2.1.14 trial"
579 git push
580 git push --set-upstream origin mix2114
581 git checkout master
582 rm -rf node_modules/
583 npm install
584 npm run dev

Wrong Storage Path

In the end we figured out we needed to adjust the storage path which was off and causing an error 500. We had to remove the mix helper from the path and just use the public path alone. As soon as this was done all was fine. Simply an error we overlooked and could see in the console and Bugsnag later on with a Laravel Valet setup of things.

Jasper Frumau

Jasper has been working with web frameworks and applications such as Laravel, Magento and his favorite CMS WordPress including Roots Trellis and Sage for more than a decade. He helps customers with web design and online marketing. Services provided are web design, ecommerce, SEO, content marketing. When Jasper is not coding, marketing a website, reading about the web or dreaming the internet of things he plays with his son, travels or run a few blocks.