Skip to content

Commit 5486d67

Browse files
tanhauhauConduitry
authored andcommittedDec 23, 2019
compile css once (#4143)
1 parent 6b5a487 commit 5486d67

File tree

5 files changed

+22
-14
lines changed

5 files changed

+22
-14
lines changed
 

‎src/compiler/compile/Component.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import Stylesheet from './css/Stylesheet';
1414
import { test } from '../config';
1515
import Fragment from './nodes/Fragment';
1616
import internal_exports from './internal_exports';
17-
import { Ast, CompileOptions, Var, Warning } from '../interfaces';
17+
import { Ast, CompileOptions, Var, Warning, CssResult } from '../interfaces';
1818
import error from '../utils/error';
1919
import get_code_frame from '../utils/get_code_frame';
2020
import flatten_reference from './utils/flatten_reference';
@@ -226,7 +226,7 @@ export default class Component {
226226
return alias;
227227
}
228228

229-
generate(result?: Node[]) {
229+
generate(result?: { js: Node[]; css: CssResult }) {
230230
let js = null;
231231
let css = null;
232232

@@ -236,7 +236,7 @@ export default class Component {
236236

237237
const banner = `${this.file ? `${this.file} ` : ``}generated by Svelte v${'__VERSION__'}`;
238238

239-
const program: any = { type: 'Program', body: result };
239+
const program: any = { type: 'Program', body: result.js };
240240

241241
walk(program, {
242242
enter: (node, parent, key) => {
@@ -310,7 +310,7 @@ export default class Component {
310310

311311
css = compile_options.customElement
312312
? { code: null, map: null }
313-
: this.stylesheet.render(compile_options.cssOutputFilename, true);
313+
: result.css;
314314

315315
js = print(program, {
316316
sourceMapSource: compile_options.filename
@@ -752,7 +752,7 @@ export default class Component {
752752

753753
if (map.has(node)) {
754754
scope = scope.parent;
755-
}
755+
}
756756
},
757757
});
758758

‎src/compiler/compile/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -90,11 +90,11 @@ export default function compile(source: string, options: CompileOptions = {}) {
9090
);
9191
stats.stop('create component');
9292

93-
const js = options.generate === false
93+
const result = options.generate === false
9494
? null
9595
: options.generate === 'ssr'
9696
? render_ssr(component, options)
9797
: render_dom(component, options);
9898

99-
return component.generate(js);
99+
return component.generate(result);
100100
}

‎src/compiler/compile/render_dom/index.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { b, x, p } from 'code-red';
22
import Component from '../Component';
33
import Renderer from './Renderer';
4-
import { CompileOptions } from '../../interfaces';
4+
import { CompileOptions, CssResult } from '../../interfaces';
55
import { walk } from 'estree-walker';
66
import { extract_names, Scope } from '../utils/scope';
77
import { invalidate } from './invalidate';
@@ -11,7 +11,7 @@ import { ClassDeclaration, FunctionExpression, Node, Statement, ObjectExpression
1111
export default function dom(
1212
component: Component,
1313
options: CompileOptions
14-
) {
14+
): { js: Node[]; css: CssResult } {
1515
const { name } = component;
1616

1717
const renderer = new Renderer(component, options);
@@ -509,7 +509,7 @@ export default function dom(
509509
body.push(declaration);
510510
}
511511

512-
return flatten(body, []);
512+
return { js: flatten(body, []), css };
513513
}
514514

515515
function flatten(nodes: any[], target: any[]) {

‎src/compiler/compile/render_ssr/index.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
import { b } from 'code-red';
22
import Component from '../Component';
3-
import { CompileOptions } from '../../interfaces';
3+
import { CompileOptions, CssResult } from '../../interfaces';
44
import { string_literal } from '../utils/stringify';
55
import Renderer from './Renderer';
66
import { INode as TemplateNode } from '../nodes/interfaces'; // TODO
77
import Text from '../nodes/Text';
88
import { extract_names } from '../utils/scope';
9-
import { LabeledStatement, Statement, ExpressionStatement, AssignmentExpression } from 'estree';
9+
import { LabeledStatement, Statement, ExpressionStatement, AssignmentExpression, Node } from 'estree';
1010

1111
export default function ssr(
1212
component: Component,
1313
options: CompileOptions
14-
) {
14+
): {js: Node[]; css: CssResult} {
1515
const renderer = new Renderer({
1616
name: component.name
1717
});
@@ -145,7 +145,7 @@ export default function ssr(
145145
main
146146
].filter(Boolean);
147147

148-
return b`
148+
const js = b`
149149
${css.code ? b`
150150
const #css = {
151151
code: "${css.code}",
@@ -160,6 +160,8 @@ export default function ssr(
160160
${blocks}
161161
});
162162
`;
163+
164+
return {js, css};
163165
}
164166

165167
function trim(nodes: TemplateNode[]) {

‎src/compiler/interfaces.ts

+6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Node, Program } from "estree";
2+
import { SourceMap } from 'magic-string';
23

34
interface BaseNode {
45
start: number;
@@ -160,4 +161,9 @@ export interface Var {
160161
hoistable?: boolean;
161162
subscribable?: boolean;
162163
is_reactive_dependency?: boolean;
164+
}
165+
166+
export interface CssResult {
167+
code: string;
168+
map: SourceMap;
163169
}

0 commit comments

Comments
 (0)
Please sign in to comment.