From: Evan You Date: Wed, 4 Dec 2024 07:07:40 +0000 (+0800) Subject: wip: make sfc playground work after refactor + support dev mode X-Git-Tag: v3.6.0-alpha.1~16^2~241 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b1b3baeb6e9b565fd131df645f00f400f16a748c;p=thirdparty%2Fvuejs%2Fcore.git wip: make sfc playground work after refactor + support dev mode --- diff --git a/package.json b/package.json index a19fc23134..7d6e46dcf6 100644 --- a/package.json +++ b/package.json @@ -4,21 +4,21 @@ "packageManager": "pnpm@9.12.3", "type": "module", "scripts": { - "dev": "node scripts/dev.js vue vue-vapor", + "dev": "node scripts/dev.js vue runtime-vapor", "build": "node scripts/build.js", "build-dts": "tsc -p tsconfig.build.json --noCheck && rollup -c rollup.dts.config.js", "clean": "rimraf --glob packages/*/dist temp .eslintcache", "size": "run-s \"size-*\" && node scripts/usage-size.js", - "size-global": "node scripts/build.js vue vue-vapor runtime-dom runtime-vapor compiler-dom -f global -p --size", + "size-global": "node scripts/build.js vue runtime-vapor runtime-dom runtime-vapor compiler-dom -f global -p --size", "size-esm-runtime": "node scripts/build.js vue -f esm-bundler-runtime", - "size-esm": "node scripts/build.js runtime-shared runtime-dom runtime-vapor runtime-core reactivity shared vue-vapor -f esm-bundler", + "size-esm": "node scripts/build.js runtime-shared runtime-dom runtime-vapor runtime-core reactivity shared runtime-vapor -f esm-bundler", "check": "tsc --incremental --noEmit", "lint": "eslint --cache .", "format": "prettier --write --cache .", "format-check": "prettier --check --cache .", "test": "vitest", "test-unit": "vitest --project unit", - "test-e2e": "node scripts/build.js vue vue-vapor -f global -d && vitest --project e2e", + "test-e2e": "node scripts/build.js vue runtime-vapor -f global -d && vitest --project e2e", "test-dts": "run-s build-dts test-dts-only", "test-dts-only": "tsc -p packages-private/dts-built-test/tsconfig.json && tsc -p ./packages-private/dts-test/tsconfig.test.json", "test-coverage": "vitest run --project unit --coverage", @@ -41,7 +41,7 @@ "build-all-cjs": "node scripts/build.js vue runtime compiler reactivity shared -af cjs", "build-runtime-esm": "node scripts/build.js runtime reactivity shared -af esm-bundler && node scripts/build.js vue -f esm-bundler-runtime && node scripts/build.js vue -f esm-browser-runtime", "build-browser-esm": "node scripts/build.js runtime reactivity shared -af esm-bundler && node scripts/build.js vue -f esm-bundler && node scripts/build.js vue -f esm-browser", - "build-ssr-esm": "node scripts/build.js compiler-sfc server-renderer vue-vapor -f esm-browser", + "build-ssr-esm": "node scripts/build.js compiler-sfc server-renderer runtime-vapor -f esm-browser", "build-sfc-playground-self": "cd packages-private/sfc-playground && npm run build", "preinstall": "npx only-allow pnpm", "postinstall": "simple-git-hooks" diff --git a/packages-private/sfc-playground/src/App.vue b/packages-private/sfc-playground/src/App.vue index 0389c8f51e..3315da4a03 100644 --- a/packages-private/sfc-playground/src/App.vue +++ b/packages-private/sfc-playground/src/App.vue @@ -57,7 +57,6 @@ const importMap = computed(() => { 'vue/vapor': vapor, }, } - if (useVaporMode.value) vaporImportMap.imports!.vue = vapor return mergeImportMap(vueImportMap.value, vaporImportMap) }) diff --git a/packages/runtime-vapor/src/apiDefineComponent.ts b/packages/runtime-vapor/src/apiDefineComponent.ts new file mode 100644 index 0000000000..a9228df475 --- /dev/null +++ b/packages/runtime-vapor/src/apiDefineComponent.ts @@ -0,0 +1,7 @@ +import type { VaporComponent } from './component' + +/*! #__NO_SIDE_EFFECTS__ */ +export function defineComponent(comp: VaporComponent): VaporComponent { + // TODO type inference + return comp +} diff --git a/packages/runtime-vapor/src/block.ts b/packages/runtime-vapor/src/block.ts index 2650fcfd70..fb82eb68c8 100644 --- a/packages/runtime-vapor/src/block.ts +++ b/packages/runtime-vapor/src/block.ts @@ -10,6 +10,19 @@ export type Fragment = { [fragmentKey]: true } +export function isFragment(val: NonNullable): val is Fragment { + return fragmentKey in val +} + +export function isBlock(val: NonNullable): val is Block { + return ( + val instanceof Node || + isArray(val) || + isVaporComponent(val) || + isFragment(val) + ) +} + /*! #__NO_SIDE_EFFECTS__ */ export function normalizeBlock(block: Block): Node[] { const nodes: Node[] = [] diff --git a/packages/runtime-vapor/src/component.ts b/packages/runtime-vapor/src/component.ts index 17973b4076..3bd360cea2 100644 --- a/packages/runtime-vapor/src/component.ts +++ b/packages/runtime-vapor/src/component.ts @@ -2,6 +2,7 @@ import { type ComponentInternalOptions, type ComponentPropsOptions, EffectScope, + type EmitFn, type EmitsOptions, type GenericAppContext, type GenericComponentInstance, @@ -11,8 +12,9 @@ import { nextUid, popWarningContext, pushWarningContext, + warn, } from '@vue/runtime-dom' -import type { Block } from './block' +import { type Block, isBlock } from './block' import { pauseTracking, resetTracking } from '@vue/reactivity' import { EMPTY_OBJ, isFunction } from '@vue/shared' import { @@ -22,6 +24,7 @@ import { } from './componentProps' import { setDynamicProp } from './dom/prop' import { renderEffect } from './renderEffect' +import { emit } from './componentEmits' export type VaporComponent = FunctionalVaporComponent | ObjectVaporComponent @@ -93,11 +96,29 @@ export function createComponent( const setupFn = isFunction(component) ? component : component.setup const setupContext = setupFn!.length > 1 ? new SetupContext(instance) : null - instance.block = setupFn!( - instance.props, - // @ts-expect-error - setupContext, - ) as Block // TODO handle return object + const setupResult = + setupFn!( + instance.props, + // @ts-expect-error + setupContext, + ) || EMPTY_OBJ + + if (__DEV__ && !isBlock(setupResult)) { + if (isFunction(component)) { + warn(`Functional vapor component must return a block directly.`) + instance.block = [] + } else if (!component.render) { + warn( + `Vapor component setup() returned non-block value, and has no render function.`, + ) + instance.block = [] + } else { + instance.block = component.render.call(null, setupResult) + } + } else { + // in prod result can only be block + instance.block = setupResult as Block + } // single root, inherit attrs if ( @@ -161,6 +182,7 @@ export class VaporComponentInstance implements GenericComponentInstance { ec: LifecycleHook // dev only + setupState?: Record propsOptions?: NormalizedPropsOptions emitsOptions?: ObjectEmitsOptions | null @@ -208,13 +230,13 @@ export function isVaporComponent( export class SetupContext { attrs: Record - // emit: EmitFn + emit: EmitFn // slots: Readonly expose: (exposed?: Record) => void constructor(instance: VaporComponentInstance) { this.attrs = instance.attrs - // this.emit = instance.emit as EmitFn + this.emit = emit.bind(null, instance) as EmitFn // this.slots = instance.slots this.expose = (exposed = {}) => { instance.exposed = exposed diff --git a/packages/runtime-vapor/src/componentEmits.ts b/packages/runtime-vapor/src/componentEmits.ts index 4dbbf4f3bd..f26c681350 100644 --- a/packages/runtime-vapor/src/componentEmits.ts +++ b/packages/runtime-vapor/src/componentEmits.ts @@ -1,14 +1,6 @@ -import { - type EmitFn, - type ObjectEmitsOptions, - baseEmit, -} from '@vue/runtime-dom' -import { - type VaporComponent, - type VaporComponentInstance, - currentInstance, -} from './component' -import { EMPTY_OBJ, NOOP, hasOwn, isArray } from '@vue/shared' +import { type ObjectEmitsOptions, baseEmit } from '@vue/runtime-dom' +import type { VaporComponent, VaporComponentInstance } from './component' +import { EMPTY_OBJ, hasOwn, isArray } from '@vue/shared' import { resolveSource } from './componentProps' /** @@ -34,15 +26,6 @@ export function normalizeEmitsOptions( return (comp.__emitsOptions = normalized) } -export function useEmit(): EmitFn { - if (!currentInstance) { - // TODO warn - return NOOP - } else { - return emit.bind(null, currentInstance) - } -} - export function emit( instance: VaporComponentInstance, event: string, diff --git a/packages/runtime-vapor/src/index.ts b/packages/runtime-vapor/src/index.ts index bc7d7e54f2..a368fa6387 100644 --- a/packages/runtime-vapor/src/index.ts +++ b/packages/runtime-vapor/src/index.ts @@ -1,7 +1,7 @@ export { createComponent } from './component' export { renderEffect } from './renderEffect' export { createVaporApp } from './apiCreateApp' -export { useEmit } from './componentEmits' +export { defineComponent } from './apiDefineComponent' // DOM export { template, children, next } from './dom/template'