From 365184c93e0362eaf8e6eb31c86ffd87a31432a4 Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 15 Jun 2023 15:44:47 +0800 Subject: [PATCH 1/3] chore: fix ci --- package.json | 2 +- pnpm-lock.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index e848fc83138..9ad6b011cfa 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "private": true, "version": "3.3.4", - "packageManager": "pnpm@8.4.0", + "packageManager": "pnpm@8.6.2", "type": "module", "scripts": { "dev": "node scripts/dev.js", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 37e9bd7fee8..ea58fdc7066 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.1' +lockfileVersion: '6.0' settings: autoInstallPeers: true From 6f45f76df2c43796b35067ef8f8b9a7bca454040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Thu, 15 Jun 2023 16:35:41 +0800 Subject: [PATCH 2/3] fix(compiler-sfc): don't registerTS when bundling for browsers (#8582) --- packages/vue/compiler-sfc/index.browser.js | 1 + packages/vue/compiler-sfc/index.browser.mjs | 1 + packages/vue/package.json | 10 ++++++++++ pnpm-lock.yaml | 4 +++- 4 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 packages/vue/compiler-sfc/index.browser.js create mode 100644 packages/vue/compiler-sfc/index.browser.mjs diff --git a/packages/vue/compiler-sfc/index.browser.js b/packages/vue/compiler-sfc/index.browser.js new file mode 100644 index 00000000000..774f9da2742 --- /dev/null +++ b/packages/vue/compiler-sfc/index.browser.js @@ -0,0 +1 @@ +module.exports = require('@vue/compiler-sfc') diff --git a/packages/vue/compiler-sfc/index.browser.mjs b/packages/vue/compiler-sfc/index.browser.mjs new file mode 100644 index 00000000000..3c30abc8ccf --- /dev/null +++ b/packages/vue/compiler-sfc/index.browser.mjs @@ -0,0 +1 @@ +export * from '@vue/compiler-sfc' diff --git a/packages/vue/package.json b/packages/vue/package.json index 0f41b3f6220..7627b60caa8 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -44,10 +44,12 @@ "./compiler-sfc": { "import": { "types": "./compiler-sfc/index.d.mts", + "browser": "./compiler-sfc/index.browser.mjs", "default": "./compiler-sfc/index.mjs" }, "require": { "types": "./compiler-sfc/index.d.ts", + "browser": "./compiler-sfc/index.browser.js", "default": "./compiler-sfc/index.js" } }, @@ -99,5 +101,13 @@ "@vue/runtime-dom": "3.3.4", "@vue/compiler-sfc": "3.3.4", "@vue/server-renderer": "3.3.4" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea58fdc7066..ea36e547631 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -386,6 +386,9 @@ importers: '@vue/shared': specifier: 3.3.4 version: link:../shared + typescript: + specifier: '*' + version: 5.0.2 packages/vue-compat: dependencies: @@ -5410,7 +5413,6 @@ packages: resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} engines: {node: '>=12.20'} hasBin: true - dev: true /ufo@1.1.1: resolution: {integrity: sha512-MvlCc4GHrmZdAllBc0iUDowff36Q9Ndw/UzqmEKyrfSzokTd9ZCy1i+IIk5hrYKkjoYVQyNbrw7/F8XJ2rEwTg==} From d2c3d8b70b2df6e16f053a7ac58e6b04e7b2078f Mon Sep 17 00:00:00 2001 From: Evan You Date: Thu, 15 Jun 2023 16:38:44 +0800 Subject: [PATCH 3/3] perf(compiler-sfc): lazy require typescript --- .../compileScript/resolveType.spec.ts | 2 +- .../compiler-sfc/src/script/resolveType.ts | 44 ++++++++++++------- packages/vue/compiler-sfc/register-ts.js | 2 +- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts index 85d67e01cb8..607654a952b 100644 --- a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts @@ -10,7 +10,7 @@ import { } from '../../src/script/resolveType' import ts from 'typescript' -registerTS(ts) +registerTS(() => ts) describe('resolveType', () => { test('type literal', () => { diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index d30150a82d5..146c454729c 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -708,13 +708,14 @@ function resolveGlobalScope(ctx: TypeResolveContext): TypeScope[] | undefined { } } -let ts: typeof TS +let ts: typeof TS | undefined +let loadTS: (() => typeof TS) | undefined /** * @private */ -export function registerTS(_ts: any) { - ts = _ts +export function registerTS(_loadTS: () => typeof TS) { + loadTS = _loadTS } type FS = NonNullable @@ -723,7 +724,10 @@ function resolveFS(ctx: TypeResolveContext): FS | undefined { if (ctx.fs) { return ctx.fs } - const fs = ctx.options.fs || ts.sys + if (!ts && loadTS) { + ts = loadTS() + } + const fs = ctx.options.fs || ts?.sys if (!fs) { return } @@ -779,22 +783,25 @@ function importSourceToScope( } else { // module or aliased import - use full TS resolution, only supported in Node if (!__NODE_JS__) { - ctx.error( + return ctx.error( `Type import from non-relative sources is not supported in the browser build.`, node, scope ) } if (!ts) { - ctx.error( - `Failed to resolve import source ${JSON.stringify(source)}. ` + - `typescript is required as a peer dep for vue in order ` + - `to support resolving types from module imports.`, - node, - scope - ) + if (loadTS) ts = loadTS() + if (!ts) { + return ctx.error( + `Failed to resolve import source ${JSON.stringify(source)}. ` + + `typescript is required as a peer dep for vue in order ` + + `to support resolving types from module imports.`, + node, + scope + ) + } } - resolved = resolveWithTS(scope.filename, source, fs) + resolved = resolveWithTS(scope.filename, source, ts, fs) } if (resolved) { resolved = scope.resolvedImportSources[source] = normalizePath(resolved) @@ -839,6 +846,7 @@ const tsConfigRefMap = new Map() function resolveWithTS( containingFile: string, source: string, + ts: typeof TS, fs: FS ): string | undefined { if (!__NODE_JS__) return @@ -853,7 +861,7 @@ function resolveWithTS( const normalizedConfigPath = normalizePath(configPath) const cached = tsConfigCache.get(normalizedConfigPath) if (!cached) { - configs = loadTSConfig(configPath, fs).map(config => ({ config })) + configs = loadTSConfig(configPath, ts, fs).map(config => ({ config })) tsConfigCache.set(normalizedConfigPath, configs) } else { configs = cached @@ -918,7 +926,11 @@ function resolveWithTS( } } -function loadTSConfig(configPath: string, fs: FS): TS.ParsedCommandLine[] { +function loadTSConfig( + configPath: string, + ts: typeof TS, + fs: FS +): TS.ParsedCommandLine[] { // The only case where `fs` is NOT `ts.sys` is during tests. // parse config host requires an extra `readDirectory` method // during tests, which is stubbed. @@ -940,7 +952,7 @@ function loadTSConfig(configPath: string, fs: FS): TS.ParsedCommandLine[] { if (config.projectReferences) { for (const ref of config.projectReferences) { tsConfigRefMap.set(ref.path, configPath) - res.unshift(...loadTSConfig(ref.path, fs)) + res.unshift(...loadTSConfig(ref.path, ts, fs)) } } return res diff --git a/packages/vue/compiler-sfc/register-ts.js b/packages/vue/compiler-sfc/register-ts.js index 87f61b64863..7a073b3a3f8 100644 --- a/packages/vue/compiler-sfc/register-ts.js +++ b/packages/vue/compiler-sfc/register-ts.js @@ -1,5 +1,5 @@ if (typeof require !== 'undefined') { try { - require('@vue/compiler-sfc').registerTS(require('typescript')) + require('@vue/compiler-sfc').registerTS(() => require('typescript')) } catch (e) {} }