From: Evan You Date: Fri, 20 Sep 2019 04:24:16 +0000 (-0400) Subject: feat: on-the-fly template compilation X-Git-Tag: v3.0.0-alpha.0~741 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3ddd121b197d8c640262d594089d4abe7367fb14;p=thirdparty%2Fvuejs%2Fcore.git feat: on-the-fly template compilation --- diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index 5802549c48..cf79af4183 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -298,12 +298,28 @@ export function handleSetupResult( finishComponentSetup(instance, parentSuspense) } +let compile: Function | undefined +export function registerCompiler(_compile: Function) { + compile = _compile +} + function finishComponentSetup( instance: ComponentInternalInstance, parentSuspense: SuspenseBoundary | null ) { const Component = instance.type as ComponentOptions if (!instance.render) { + if (Component.template && !Component.render) { + if (compile) { + Component.render = compile(Component.template) + } else if (__DEV__) { + warn( + `Component provides template but the build of Vue you are running ` + + `does not support on-the-fly template compilation. Either use the ` + + `full build or pre-compile the template using Vue CLI.` + ) + } + } if (__DEV__ && !Component.render) { warn( `Component is missing render function. Either provide a template or ` + diff --git a/packages/runtime-core/src/index.ts b/packages/runtime-core/src/index.ts index d39d3083ee..cd81043faa 100644 --- a/packages/runtime-core/src/index.ts +++ b/packages/runtime-core/src/index.ts @@ -35,10 +35,13 @@ export { callWithAsyncErrorHandling } from './errorHandling' -// For compiler generated code +// Internal, for compiler generated code export { applyDirectives } from './directives' export { resolveComponent, resolveDirective } from './componentOptions' +// Internal, for integration with runtime compiler +export { registerCompiler } from './component' + // Types ----------------------------------------------------------------------- export { App, AppConfig, AppContext, Plugin } from './apiApp' diff --git a/packages/vue/src/index.ts b/packages/vue/src/index.ts index 5db370eb7f..7635080ad5 100644 --- a/packages/vue/src/index.ts +++ b/packages/vue/src/index.ts @@ -1,16 +1,15 @@ // This package is the "full-build" that includes both the runtime -// and the compiler. For now we are just exporting everything from the runtome -// AND the compiler. - -// TODO hook up the runtime to compile templates on the fly - +// and the compiler, and supports on-the-fly compilation of the template option. import { compile as baseCompile, CompilerOptions } from '@vue/compiler-dom' +import { registerCompiler } from '@vue/runtime-dom' export function compile(template: string, options?: CompilerOptions): Function { const { code } = baseCompile(template, options) return new Function(`with(this){return ${code}}`) } +registerCompiler(compile) + export * from '@vue/runtime-dom' if (__BROWSER__ && __DEV__) {