Skip to content

Commit 2fded95

Browse files
committed
feat: add CSS order fixer script for development mode
1 parent 59bdeaa commit 2fded95

File tree

5 files changed

+73
-2
lines changed

5 files changed

+73
-2
lines changed

Diff for: app.js

+1
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ async function initializeApp () {
242242
}
243243
app.locals.viteAssets = viteHelpers.getViteAssets
244244
app.locals.generateTags = viteHelpers.generateTags
245+
app.locals.generateCssOrderFixer = viteHelpers.generateCssOrderFixer
245246
app.locals.enableDropBoxSave = config.isDropboxEnable
246247
app.locals.enableGitHubGist = config.isGitHubEnable
247248
app.locals.enableGitlabSnippets = config.isGitlabSnippetsEnable

Diff for: lib/vite-helpers.js

+60-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,66 @@ function generateTags (assets) {
9696
return { cssTags, jsTags }
9797
}
9898

99+
/**
100+
* Generate a script tag to fix CSS ordering issues in development mode
101+
* @param {Array<string>} selectors - CSS selectors for elements that should come after Vite's CSS
102+
* @param {string} nonce - CSP nonce to allow script execution
103+
* @returns {string} - Script tag for reordering CSS
104+
*/
105+
function generateCssOrderFixer (selectors, nonce = '') {
106+
if (process.env.NODE_ENV === 'production') {
107+
return '' // No need for this in production
108+
}
109+
110+
const selectorsJson = JSON.stringify(selectors)
111+
const nonceAttr = nonce ? ` nonce="${nonce}"` : ''
112+
113+
return `<script${nonceAttr}>
114+
// Function to run the fix
115+
function attemptFixCssOrder() {
116+
const head = document.head;
117+
const cssSelectors = ${selectorsJson};
118+
119+
// Find all target elements
120+
const targetElements = cssSelectors
121+
.map(selector => head.querySelector(selector))
122+
.filter(el => el !== null);
123+
124+
if (targetElements.length) {
125+
// Find all vite-injected styles
126+
const viteStyles = Array.from(head.querySelectorAll('style'))
127+
.filter(style => style.dataset.viteDevId);
128+
129+
// Find the first target element to place vite styles before
130+
const firstTarget = targetElements[0];
131+
132+
// Move all vite styles before the first target element
133+
if (viteStyles.length > 0) {
134+
viteStyles.forEach(style => {
135+
head.insertBefore(style, firstTarget);
136+
});
137+
}
138+
}
139+
}
140+
141+
// Run immediately when DOM content is loaded
142+
document.addEventListener("DOMContentLoaded", attemptFixCssOrder);
143+
144+
// Also run after a delay to catch any styles injected after DOMContentLoaded
145+
setTimeout(attemptFixCssOrder, 500);
146+
147+
// Run again after 2 seconds to catch any delayed style injections
148+
setTimeout(attemptFixCssOrder, 2000);
149+
150+
// Monitor for Vite HMR updates and reapply when they happen
151+
window.addEventListener('vite:beforeUpdate', () => {
152+
setTimeout(attemptFixCssOrder, 100);
153+
});
154+
</script>`
155+
}
156+
99157
module.exports = {
100158
getViteAssets,
101-
generateTags
159+
generateTags,
160+
generateCssOrderFixer
102161
}

Diff for: public/views/index/head.ejs

+4
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,9 @@
2222
<link rel="stylesheet" href='<%- serverURL %>/build/fork-awesome/css/fork-awesome.min.css'>
2323
<%# Old webpack includes removed %>
2424
<% } %>
25+
26+
<%# Add CSS order fixer script (only active in development mode) %>
27+
<%- generateCssOrderFixer(['link[href*="fork-awesome.min.css"]'], cspNonce) %>
28+
2529
<%# Inject Vite CSS assets for the 'cover' entry point %>
2630
<%- generateTags(viteAssets('cover')).cssTags %>

Diff for: public/views/pretty.ejs

+4
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@
3434
<link rel="stylesheet" href='<%- serverURL %>/build/fork-awesome/css/fork-awesome.min.css'>
3535
<%# Old webpack includes removed %>
3636
<% } %>
37+
38+
<%# Add CSS order fixer script (only active in development mode) %>
39+
<%- generateCssOrderFixer(['link[href*="fork-awesome.min.css"]'], cspNonce) %>
40+
3741
<%# Inject Vite CSS assets for the 'pretty' entry point %>
3842
<%- generateTags(viteAssets('pretty')).cssTags %>
3943
</head>

Diff for: public/views/slide.ejs

+4-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,10 @@
3030
<link rel="stylesheet" href='<%- serverURL %>/build/fork-awesome/css/fork-awesome.min.css'>
3131
<%# Old webpack includes removed %>
3232
<% } %>
33-
<%# Inject Vite CSS assets for the 'slide' entry point %>
33+
34+
<%# Add CSS order fixer script (only active in development mode) %>
35+
<%- generateCssOrderFixer(['link#theme', 'link[href*="zenburn.css"]', 'link[href*="slide.css"]'], cspNonce) %>
36+
3437
<%- generateTags(viteAssets('slide')).cssTags %>
3538

3639
<!-- For reveal.js theme -->

0 commit comments

Comments
 (0)