Laravel Mix & Webpack Error Module build failed: TypeError: Cannot read property ‘0’ of null

Been working on a Laravel PHP app that is using plenty of vue.js and vanilla JavaScript. We decided to add Slick Slider for a part of the app. It is now causing issues. Issues we are working on now. Decided to blog about it to perhaps make things clearer for us and solve it quicker.

NPM Production Errors

Compiling assets using:

npm run production

inside my Laravel app keeps on hanging on slick.scss it seems:

ERROR Failed to compile with 1 errors 10:32:06 AM
 
 error in ./~/slick-carousel/slick/slick.scss
 
 Module build failed: TypeError: Cannot read property '0' of null
 at findNameRoot (/usr/share/nginx/app/node_modules/css-loader/node_modules/clean-css/lib/selectors/extractor.js:66:59)
 at extract (/usr/share/nginx/app/node_modules/css-loader/node_modules/clean-css/lib/selectors/extractor.js:36:9)
 at restructure (/usr/share/nginx/app/node_modules/css-loader/node_modules/clean-css/lib/selectors/restructure.js:297:22)
 at optimize (/usr/share/nginx/app/node_modules/css-loader/node_modules/clean-css/lib/selectors/advanced.js:71:5)
 at minify (/usr/share/nginx/app/node_modules/css-loader/node_modules/clean-css/lib/clean.js:228:5)
 at whenSourceMapReady (/usr/share/nginx/app/node_modules/css-loader/node_modules/clean-css/lib/clean.js:135:7)
 at Object.whenDone (/usr/share/nginx/app/node_modules/css-loader/node_modules/clean-css/lib/clean.js:155:14)
 at processNext (/usr/share/nginx/app/node_modules/css-loader/node_modules/clean-css/lib/imports/inliner.js:105:13)
 at importFrom (/usr/share/nginx/app/node_modules/css-loader/node_modules/clean-css/lib/imports/inliner.js:79:10)
 at ImportInliner.process (/usr/share/nginx/app/node_modules/css-loader/node_modules/clean-css/lib/imports/inliner.js:38:10)
 at /usr/share/nginx/app/node_modules/css-loader/node_modules/clean-css/lib/clean.js:120:41
 at runner (/usr/share/nginx/app/node_modules/css-loader/node_modules/clean-css/lib/clean.js:117:36)
 at CleanCSS.minify (/usr/share/nginx/app/node_modules/css-loader/node_modules/clean-css/lib/clean.js:119:12)
 at Object.module.exports (/usr/share/nginx/app/node_modules/css-loader/lib/loader.js:96:46)

I have no idea how this is happening or what is the cause.

Slick.scss Analysis

The slick.scss file looks OK to me:

/* Slider */
 
 .slick-slider {
 position: relative;
 display: block;
 box-sizing: border-box;
 -webkit-touch-callout: none;
 -webkit-user-select: none;
 -khtml-user-select: none;
 -moz-user-select: none;
 -ms-user-select: none;
 user-select: none;
 -ms-touch-action: pan-y;
 touch-action: pan-y;
 -webkit-tap-highlight-color: transparent;
 }
 .slick-list {
 position: relative;
 overflow: hidden;
 display: block;
 margin: 0;
 padding: 0;
 
 &:focus {
 outline: none;
 }
 
 &.dragging {
 cursor: pointer;
 cursor: hand;
 }
 }
 .slick-slider .slick-track,
 .slick-slider .slick-list {
 -webkit-transform: translate3d(0, 0, 0);
 -moz-transform: translate3d(0, 0, 0);
 -ms-transform: translate3d(0, 0, 0);
 -o-transform: translate3d(0, 0, 0);
 transform: translate3d(0, 0, 0);
 }
 
 .slick-track {
 position: relative;
 left: 0;
 top: 0;
 display: block;
 
 &:before,
 &:after {
 content: "";
 display: table;
 }
 
 &:after {
 clear: both;
 }
 
 .slick-loading & {
 visibility: hidden;
 }
 }
 .slick-slide {
 float: left;
 height: 100%;
 min-height: 1px;
 [dir="rtl"] & {
 float: right;
 }
 img {
 display: block;
 }
 &.slick-loading img {
 display: none;
 }
 
 display: none;
 
 &.dragging img {
 pointer-events: none;
 }
 
 .slick-initialized & {
 display: block;
 }
 
 .slick-loading & {
 visibility: hidden;
 }
 
 .slick-vertical & {
 display: block;
 height: auto;
 border: 1px solid transparent;
 }
 }
 .slick-arrow.slick-hidden {
 display: none;
 }

When I compiled it and checked at W3C CSS Validator I did get some errors though:

11 .slick-slider Property user-select doesn't exist : none
13 .slick-slider Property touch-action doesn't exist : pan-y
31 .slick-list.dragging Value Error : cursor hand is not a cursor value : hand
83 .slick-slide.dragging img Property pointer-events doesn't exist : none

Here is the CSS:

/* Slider */
.slick-slider {
 position: relative;
 display: block;
 box-sizing: border-box;
 -webkit-touch-callout: none;
 -webkit-user-select: none;
 -khtml-user-select: none;
 -moz-user-select: none;
 -ms-user-select: none;
 user-select: none;
 -ms-touch-action: pan-y;
 touch-action: pan-y;
 -webkit-tap-highlight-color: transparent;
}

.slick-list {
 position: relative;
 overflow: hidden;
 display: block;
 margin: 0;
 padding: 0;
}

.slick-list:focus {
 outline: none;
}

.slick-list.dragging {
 cursor: pointer;
 cursor: hand;
}

.slick-slider .slick-track,
.slick-slider .slick-list {
 -webkit-transform: translate3d(0, 0, 0);
 -moz-transform: translate3d(0, 0, 0);
 -ms-transform: translate3d(0, 0, 0);
 -o-transform: translate3d(0, 0, 0);
 transform: translate3d(0, 0, 0);
}

.slick-track {
 position: relative;
 left: 0;
 top: 0;
 display: block;
}
.slick-track:before, .slick-track:after {
 content: "";
 display: table;
}
.slick-track:after {
 clear: both;
}
.slick-loading .slick-track {
 visibility: hidden;
}

.slick-slide {
 float: left;
 height: 100%;
 min-height: 1px;
 display: none;
}

[dir="rtl"] .slick-slide {
 float: right;
}

.slick-slide img {
 display: block;
}

.slick-slide.slick-loading img {
 display: none;
}

.slick-slide.dragging img {
 pointer-events: none;
}

.slick-initialized .slick-slide {
 display: block;
}

.slick-loading .slick-slide {
 visibility: hidden;
}

.slick-vertical .slick-slide {
 display: block;
 height: auto;
 border: 1px solid transparent;
}

.slick-arrow.slick-hidden {
 display: none;
}

Not sure if these errors are the culprit though. Pointer-event is and can be used by most browsers for example.

JavaScript Error

The actual error is a JavaScript error saying 0 does not exist. So somehow it cannot compile or run as an element is missing. At line 66 of extractor.js there is

return name.replace(/^\-\w+\-/, '').match(/([a-zA-Z]+)/)[0].toLowerCase();

I checked the css for error still, but no obvious issues with uppercase selectors and such as discussed at https://github.com/jakubpawlowicz/clean-css/issues/480 .

Rebuilding Node Packages

I decided to also do a:

rm -rf node_modules

followed by a:

npm install && npm run production

But no change. And my node and npm versions are quite recent:

npm --version
4.5.0
node --version
v7.10.0

Update Node Packages

So I decide to do update all node packages doing an:

npm update

as well and webpack, vue.js and many node module packages were updated:

vue-loader@10.3.0 /usr/share/nginx/smart/node_modules/vue-loader

├── babel-core@6.24.1
├── babel-loader@6.4.1
├── babel-preset-es2015@6.24.1
├── chai@3.5.0
├── coffee-loader@0.7.3
├── coffee-script@1.12.6
├── consolidate@0.14.5
├── css-loader@0.26.4
├── eslint@3.19.0
├── eslint-config-vue@2.0.2
├── eslint-plugin-vue@2.0.1
├── expose-loader@0.7.3
├── extract-text-webpack-plugin@2.1.0
├── file-loader@0.10.1
├── hash-sum@1.0.2
├── inject-loader@2.0.1
├── js-beautify@1.6.14
├── jsdom@9.12.0
├── loader-utils@0.2.17
├── lru-cache@4.0.2
├── marked@0.3.6
├── memory-fs@0.4.1
├── mkdirp@0.5.1
├── mocha@3.4.1
├── node-libs-browser@2.0.0
├── normalize-newline@3.0.0
├── null-loader@0.1.1
├── postcss@5.2.17
├── postcss-selector-parser@2.2.3
├── pug@2.0.0-rc.1
├── raw-loader@0.5.1
├── skeleton-loader@0.0.5
├── source-map@0.5.6
├── stylus@0.54.5
├── stylus-loader@2.5.1
├── sugarss@0.2.0
├── url-loader@0.5.8
├── vue@2.3.3
├── vue-hot-reload-api@2.1.0
├── vue-server-renderer@2.3.3
├── vue-style-loader@2.0.5
├── vue-template-compiler@2.3.3
├── vue-template-es2015-compiler@1.5.2
└── webpack@2.6.0

But still no change and the same error

Outdated NPM Packages

Then I ran npm outdated to check what packages were not at the latest version:

Package           Current  Wanted  Latest  Location
axios               0.15.3    0.15.3   0.16.1
laravel-mix         0.8.9   0.8.9     0.12.0
normalize.css       6.0.0   6.0.0    7.0.0
vue-quill-editor    1.1.1   1.1.1    2.2.1

and still saw I had outdated packages. This of course due to settings in package.json. Where Laravel Mix was limited in updates with the caret:

"laravel-mix": "^0.8.1"

Vue Loader Check

These outdated packages did not seem to be related to the issue and vue-loader (webpack loader for vue.js components) still was not updated either. This being a dependency for other node packages I assumed. And this module interested me as I read at https://github.com/vuejs/vue-loader/issues/790 that a certain version did not recognize:

<style lang="scss">

which we use in Vue components to load the Slick scss. But then I realized the way our scss files were added was with:

<style type="scss">

So that is not exactly the same…

Clean CSS Parsing Issues

And that brings me back to the clean-css module and a possible CSS issue. At https://stackoverflow.com/questions/34607656/clean-css-typeerror-cannot-read-property-0-of-null someone had a very similar issue. It mentions the same error

TypeError: Cannot read property '0' of null

and the same files are involved. He also checked for uppercase selectors, commented lines and such. We do have one comment, but I think:

/* Slider */

is legit. I had only read “//” for comments did not work.

CSS Loader including node_modules

What amazed me was to see node_modules as a directory inside a node module like:

/usr/share/nginx/app/node_modules/css-loader/node_modules/clean-css/lib/selectors

But that was not incorrect. Then I realized that the directory:

/usr/share/nginx/app/node_modules/css-loader/node_modules/clean-css/lib/selectors/

was nowhere to be found. So building did not go as it was supposed to now was it.

Clean Installation Node Modules

So I did a npm clean cache, rm -rf node_modules and then a npm install. And then I ran an npm run production again. And this time

usr/share/nginx/app/node_modules/css-loader/node_modules/clean-css/lib/selector

did get built 🙂 . But I still had the same error:

ERROR  Failed to compile with 1 errors                                           3:19:28 PM
error  in ./~/slick-carousel/slick/slick.scss
Module build failed: TypeError: Cannot read property '0' of null

Adjoining Classes

I started to wonder if it had to do with the  adjoining classes that were generated – at least by the online compiler – like

.slick-slide.slick-loading

 These were also in the slick.css file, but not used by the vue components. So still wasn’t sure whether this was the real issue. And I really was not planning on changing generated module css. That and most linters would online issue warnings as adjoining classes are only an issue for IE 6 and older.

Box Sizing Property the cause?

Another property box-sizing got a warning as it does not work for IE6-7. Again not really something that should cause the parsing issue now should it?

Day after hangover

The next day when I wanted to to an:

npm run dev

to back to a state it had before and kind of functional I had permission errors

95% emittingError: EACCES: permission denied, open '/usr/share/nginx/app/public/mix-manifest.json'

When I fixed the files that all of the sudden had www-data as owner I had another error

> @ dev /usr/share/nginx/app
> node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js
undefined:1
SyntaxError: Unexpected end of JSON input
at JSON.parse (<anonymous>)

I decided to do a:

git checkout .

and then I couldn’t as there were merger issues with the auto generated css and javascript. So I had to

git reset

those files one by one and then do another git checkout . . After that npm run dev worked again.

Latest Git Pull Check

Started to wonder if another partner of mine had done git pull. I did a:

stat -c %y .git/FETCH_HEAD
2017-05-24 17:13:14.573392353 +0200

NB Tip found at SO here

And realized there had been one. Only the built had not worked out somehow. Anyways all well again.

Slick.scss Production Error

The search for the production slick.scss issue continues….

Tagged in : Tagged in : , , , ,
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.