You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.1 KiB
80 lines
2.1 KiB
import listToStyles from './listToStyles' |
|
|
|
export default function addStylesServer (parentId, list, isProduction, context) { |
|
if (!context && typeof __VUE_SSR_CONTEXT__ !== 'undefined') { |
|
context = __VUE_SSR_CONTEXT__ |
|
} |
|
if (context) { |
|
if (!context.hasOwnProperty('styles')) { |
|
Object.defineProperty(context, 'styles', { |
|
enumerable: true, |
|
get: function() { |
|
return renderStyles(context._styles) |
|
} |
|
}) |
|
// expose renderStyles for vue-server-renderer (vuejs/#6353) |
|
context._renderStyles = renderStyles |
|
} |
|
|
|
var styles = context._styles || (context._styles = {}) |
|
list = listToStyles(parentId, list) |
|
if (isProduction) { |
|
addStyleProd(styles, list) |
|
} else { |
|
addStyleDev(styles, list) |
|
} |
|
} |
|
} |
|
|
|
// In production, render as few style tags as possible. |
|
// (mostly because IE9 has a limit on number of style tags) |
|
function addStyleProd (styles, list) { |
|
for (var i = 0; i < list.length; i++) { |
|
var parts = list[i].parts |
|
for (var j = 0; j < parts.length; j++) { |
|
var part = parts[j] |
|
// group style tags by media types. |
|
var id = part.media || 'default' |
|
var style = styles[id] |
|
if (style) { |
|
if (style.ids.indexOf(part.id) < 0) { |
|
style.ids.push(part.id) |
|
style.css += '\n' + part.css |
|
} |
|
} else { |
|
styles[id] = { |
|
ids: [part.id], |
|
css: part.css, |
|
media: part.media |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
// In dev we use individual style tag for each module for hot-reload |
|
// and source maps. |
|
function addStyleDev (styles, list) { |
|
for (var i = 0; i < list.length; i++) { |
|
var parts = list[i].parts |
|
for (var j = 0; j < parts.length; j++) { |
|
var part = parts[j] |
|
styles[part.id] = { |
|
ids: [part.id], |
|
css: part.css, |
|
media: part.media |
|
} |
|
} |
|
} |
|
} |
|
|
|
function renderStyles (styles) { |
|
var css = '' |
|
for (var key in styles) { |
|
var style = styles[key] |
|
css += '<style data-vue-ssr-id="' + style.ids.join(' ') + '"' + |
|
(style.media ? ( ' media="' + style.media + '"' ) : '') + '>' + |
|
style.css + '</style>' |
|
} |
|
return css |
|
}
|
|
|