I’ve been using Sage few years ago and now I wanted to try version 9. I immediately came across a weird behaviour: running yarn start thejQuery(document).ready()function is called before CSS is applied to page.
To confirm the issue I tried to move my CSS from my scss file to the actual HTML tag. With inline style doc ready behaves correctly.
Now, how can I load CSS before doc ready? Or at least, is there any event that I can listen to in order to run my scripts?
Sounds like a Browsersync issue, and also an old one:
Right now I’m working on my theme’s UX as it relates to initial page load, which involves hidden content and transitions that reveal content. It’s not playing nicely with the way the CSS is getting injected via JS because of how the page first starts with no CSS, and initial styling of elements is affected as a result, which interferes with my JS revealing code. I’m trying to test this as closely from the point of view of a member of the public as possible, from the initial page load, so I’m deliberately bypassing BrowserSync to run these tests (accessing directly via devurl.dev ). But even on devurl.dev the loading of CSS is noticeably delayed and causing problems with the UX; I guess webpack is what injects the CSS?
Place this style on your resources/assets/styles/common/_global.scss:
body {
opacity: 1 !important;
}
STEP 3
Change your doc ready function in resources/assets/scripts/main.js
// Load Events
jQuery(document).ready(checkStyleIsLoaded);
// Check if style is loaded
function checkStyleIsLoaded() {
// Get the current opacity of the body tag
const opacity = window
.getComputedStyle(document.body)
.getPropertyValue('opacity');
// If opacity is 1 (CSS has been loaded!) then run your scripts
if (opacity === '1') { routes.loadEvents() }
// If opacity is 0 then wait for other 100ms
else { setTimeout(checkStyleIsLoaded, 100); }
}
I have found that the missing css was causing layout issues, and scripts that relied on dimensions set by css were fine on production but hit-n-miss on development.
On webpack.config.js I disabled the CleanPlugin when watcher is on, so then I start with yarn build && yarn start.
// remove this from plugins
new CleanPlugin([config.paths.dist], {
root: config.paths.root,
verbose: false,
}),
// add this before module.exports
if (!config.enabled.watcher) {
webpackConfig.plugins.push(new CleanPlugin([config.paths.dist], {
root: config.paths.root,
verbose: false,
}));
}
Unfortunately, depending on your stage of development, after a while you will want to restart the dev server, as initial css will be out of date, but at least you avoid the missing css related errors.