Skip to content

Commit

Permalink
Merge pull request #154 from sveltejs/gh-153
Browse files Browse the repository at this point in the history
Server-rendered CSS
  • Loading branch information
Rich-Harris authored Dec 7, 2016
2 parents 6d890f1 + 85368b9 commit f978bbe
Show file tree
Hide file tree
Showing 28 changed files with 212 additions and 7,512 deletions.
6,982 changes: 0 additions & 6,982 deletions compiler/svelte.js

This file was deleted.

1 change: 0 additions & 1 deletion compiler/svelte.js.map

This file was deleted.

14 changes: 1 addition & 13 deletions src/generate/css/process.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,6 @@
import deindent from '../../utils/deindent.js';
import spaces from '../../utils/spaces.js';
import transform from './transform.js';

export default function process ( parsed ) {
const scoped = transform( spaces( parsed.css.content.start ) + parsed.css.content.styles, parsed.hash );

return deindent`
let addedCss = false;
function addCss () {
var style = document.createElement( 'style' );
style.textContent = ${JSON.stringify( scoped )};
document.head.appendChild( style );
addedCss = true;
}
`;
return transform( spaces( parsed.css.content.start ) + parsed.css.content.styles, parsed.hash );
}
15 changes: 12 additions & 3 deletions src/generate/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -392,8 +392,17 @@ export default function generate ( parsed, source, options, names ) {
topLevelStatements.push( `[✂${parsed.js.content.start}-${parsed.js.content.end}✂]` );
}

if ( parsed.css ) {
topLevelStatements.push( processCss( parsed ) );
if ( parsed.css && options.css !== false ) {
topLevelStatements.push( deindent`
let addedCss = false;
function addCss () {
var style = document.createElement( 'style' );
style.textContent = ${JSON.stringify( processCss( parsed ) )};
document.head.appendChild( style );
addedCss = true;
}
` );
}

topLevelStatements.push( ...renderers.reverse() );
Expand All @@ -402,7 +411,7 @@ export default function generate ( parsed, source, options, names ) {

const initStatements = [];

if ( parsed.css ) {
if ( parsed.css && options.css !== false ) {
initStatements.push( `if ( !addedCss ) addCss();` );
}

Expand Down
2 changes: 2 additions & 0 deletions src/parse/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ export default function parse ( template ) {
throw new TypeError( 'Template must be a string' );
}

template = template.replace( /\s+$/, '' );

const parser = {
index: 0,
template,
Expand Down
60 changes: 55 additions & 5 deletions src/server-side-rendering/compile.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ import deindent from '../utils/deindent.js';
import isReference from '../utils/isReference.js';
import flattenReference from '../utils/flattenReference.js';
import MagicString, { Bundle } from 'magic-string';
import processCss from '../generate/css/process.js';

const voidElementNames = /^(?:area|base|br|col|command|doctype|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/i;

export default function compile ( source, filename ) {
export default function compile ( source, { filename }) {
const parsed = parse( source, {} );
validate( parsed, source, {} );

Expand Down Expand Up @@ -113,6 +114,8 @@ export default function compile ( source, filename ) {
};
}

let elementDepth = 0;

const stringifiers = {
Component ( node ) {
const props = node.attributes.map( attribute => {
Expand Down Expand Up @@ -187,12 +190,18 @@ export default function compile ( source, filename ) {
element += str;
});

if ( parsed.css && elementDepth === 0 ) {
element += ` svelte-${parsed.hash}`;
}

if ( voidElementNames.test( node.name ) ) {
element += '>';
} else if ( node.children.length === 0 ) {
element += '/>';
} else {
elementDepth += 1;
element += '>' + node.children.map( stringify ).join( '' ) + `</${node.name}>`;
elementDepth -= 1;
}

return element;
Expand Down Expand Up @@ -278,10 +287,6 @@ export default function compile ( source, filename ) {
topLevelStatements.push( `[✂${parsed.js.content.start}-${parsed.js.content.end}✂]` );
}

if ( parsed.css ) {
throw new Error( 'TODO handle css' );
}

const renderStatements = [
templateProperties.data ? `data = Object.assign( template.data(), data || {} );` : `data = data || {};`
];
Expand Down Expand Up @@ -325,10 +330,55 @@ export default function compile ( source, filename ) {
`return rendered;`
);

const renderCssStatements = [
`var components = [];`
];

if ( parsed.css ) {
renderCssStatements.push( deindent`
components.push({
filename: exports.filename,
css: ${JSON.stringify( processCss( parsed ) )},
map: null // TODO
});
` );
}

if ( templateProperties.components ) {
renderCssStatements.push( deindent`
var seen = {};
function addComponent ( component ) {
var result = component.renderCss();
result.components.forEach( x => {
if ( seen[ x.filename ] ) return;
seen[ x.filename ] = true;
components.push( x );
});
}
` );

renderCssStatements.push( templateProperties.components.properties.map( prop => `addComponent( template.components.${prop.key.name} );` ).join( '\n' ) );
}

renderCssStatements.push( deindent`
return {
css: components.map( x => x.css ).join( '\\n' ),
map: null,
components
};
` );

topLevelStatements.push( deindent`
exports.filename = ${JSON.stringify( filename )};
exports.render = function ( data, options ) {
${renderStatements.join( '\n\n' )}
};
exports.renderCss = function () {
${renderCssStatements.join( '\n\n' )}
};
` );

const rendered = topLevelStatements.join( '\n\n' );
Expand Down
2 changes: 1 addition & 1 deletion src/server-side-rendering/register.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,6 @@ import * as fs from 'fs';
import compile from './compile.js';

require.extensions[ '.html' ] = function ( module, filename ) {
const { code } = compile( fs.readFileSync( filename, 'utf-8' ) );
const { code } = compile( fs.readFileSync( filename, 'utf-8' ), { filename });
return module._compile( code, filename );
};
Loading

0 comments on commit f978bbe

Please sign in to comment.