basic plumbing for SSR

pull/1839/head
Rich Harris 7 years ago
parent aca79ac531
commit 0e879524f4

@ -33,7 +33,7 @@ function registerExtension(extension) {
const options = Object.assign({}, compileOptions, {
filename,
name: capitalise(name),
generate: 'ssr'
format: 'cjs'
});
const { js } = compile(fs.readFileSync(filename, 'utf-8'), options);

@ -54,8 +54,7 @@ export function compile(input, opts) {
immutable: opts.immutable,
generate: opts.generate || 'dom',
customElement: opts.customElement,
store: opts.store,
shared: opts.shared
sveltePath: opts.sveltePath
};
if (isDir) {

@ -219,17 +219,13 @@ export default class Component {
return { name, alias };
});
const sharedPath = typeof options.shared === 'string'
? options.shared
: 'svelte/internal.js';
const module = wrapModule(
result,
format,
name,
options,
banner,
sharedPath,
options.sveltePath ? `${options.sveltePath}/internal.js` : `svelte/internal.js`,
importedHelpers,
this.imports,
this.module_exports,
@ -485,6 +481,10 @@ export default class Component {
this.userVars.add(specifier.local.name);
this.declarations.push(specifier.local.name); // TODO we don't really want this, but it's convenient for now
});
if (this.options.sveltePath && node.source.value === 'svelte') {
code.overwrite(node.source.start, node.source.end, this.options.sveltePath);
}
}
});
}

@ -73,9 +73,12 @@ export default function compile(source: string, options: CompileOptions = {}) {
return { ast, stats: stats.render(null), js: null, css: null };
}
if (options.generate === 'ssr') {
return renderSSR(component, options);
}
const dom = renderDOM(component, options);
const ssr = renderSSR(component, options);
return renderDOM(component, options);
return component.generate(`${dom}\n\n${ssr}`, options, {
banner: `/* ${component.file ? `${component.file} ` : ``}generated by Svelte v${"__VERSION__"} */`,
name: component.name,
format: options.format || 'esm'
});
}

@ -222,11 +222,5 @@ export default function dom(
`);
}
let result = builder.toString();
return component.generate(result, options, {
banner: `/* ${component.file ? `${component.file} ` : ``}generated by Svelte v${"__VERSION__"} */`,
name,
format,
});
return builder.toString();
}

@ -12,7 +12,11 @@ export default function ssr(
) {
const renderer = new Renderer();
const format = options.format || 'cjs';
return deindent`
function $render($$props) {
throw new Error('TODO');
}
`;
const { computations, name, templateProperties } = component;
@ -56,7 +60,7 @@ export default function ssr(
const debugName = `<${component.customElement ? component.tag : name}>`;
// TODO concatenate CSS maps
const result = (deindent`
return (deindent`
${js}
var ${name} = {};
@ -129,8 +133,6 @@ export default function ssr(
${templateProperties.preload && `${name}.preload = %preload;`}
`).trim();
return component.generate(result, options, { name, format });
}
function trim(nodes) {

@ -65,6 +65,7 @@ function esm(
${code}
export default ${name};
export { $render };
${module_exports.length > 0 && `export { ${module_exports.map(e => e.name === e.as ? e.name : `${e.name} as ${e.as}`).join(', ')} };`}`;
}
@ -105,7 +106,7 @@ function cjs(
return `const ${lhs} = require("${node.source.value}");`
});
const exports = [`exports.default = ${name};`].concat(
const exports = [`exports.default = ${name};`, `exports.$render = $render;`].concat(
module_exports.map(x => `exports.${x.as} = ${x.name};`)
);

@ -49,10 +49,10 @@ export interface CompileOptions {
outputFilename?: string;
cssOutputFilename?: string;
sveltePath?: string;
dev?: boolean;
immutable?: boolean;
shared?: boolean | string;
hydratable?: boolean;
legacy?: boolean;
customElement?: CustomElementOptions | true;

@ -22,7 +22,7 @@ function normalizeWarning(warning) {
return warning;
}
describe.only('css', () => {
describe('css', () => {
fs.readdirSync('test/css/samples').forEach(dir => {
if (dir[0] === '.') return;

@ -19,11 +19,11 @@ function tryToReadFile(file) {
}
}
describe("ssr", () => {
describe.only("ssr", () => {
before(() => {
require("../../register")({
extensions: ['.svelte', '.html'],
store: true
sveltePath: process.cwd()
});
return setupHtmlEqual();
@ -44,14 +44,14 @@ describe("ssr", () => {
(solo ? it.only : it)(dir, () => {
dir = path.resolve("test/server-side-rendering/samples", dir);
try {
let component;
let $render;
const mainHtmlFile = `${dir}/main.html`;
const mainSvelteFile = `${dir}/main.svelte`;
if (fs.existsSync(mainHtmlFile)) {
component = require(mainHtmlFile);
$render = require(mainHtmlFile).$render;
} else if (fs.existsSync(mainSvelteFile)) {
component = require(mainSvelteFile);
$render = require(mainSvelteFile).$render;
}
const expectedHtml = tryToReadFile(`${dir}/_expected.html`);
@ -59,7 +59,7 @@ describe("ssr", () => {
const data = tryToLoadJson(`${dir}/data.json`);
const rendered = component.render(data);
const rendered = $render(data);
const { html, css, head } = rendered;
// rendered.toString() === rendered.html

Loading…
Cancel
Save