diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index 146c454729c..9829899bba0 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -715,7 +715,25 @@ let loadTS: (() => typeof TS) | undefined * @private */ export function registerTS(_loadTS: () => typeof TS) { - loadTS = _loadTS + loadTS = () => { + try { + return _loadTS() + } catch (err: any) { + if ( + typeof err.message === 'string' && + err.message.includes('Cannot find module') + ) { + throw new Error( + 'Failed to load TypeScript, which is required for resolving imported types. ' + + 'Please make sure "typescript" is installed as a project dependency.' + ) + } else { + throw new Error( + 'Failed to load TypeScript for resolving imported types.' + ) + } + } + } } type FS = NonNullable @@ -764,7 +782,12 @@ function importSourceToScope( scope: TypeScope, source: string ): TypeScope { - const fs = resolveFS(ctx) + let fs: FS | undefined + try { + fs = resolveFS(ctx) + } catch (err: any) { + return ctx.error(err.message, node, scope) + } if (!fs) { return ctx.error( `No fs option provided to \`compileScript\` in non-Node environment. ` + diff --git a/packages/vue/compiler-sfc/register-ts.js b/packages/vue/compiler-sfc/register-ts.js index 7a073b3a3f8..36de2a350d6 100644 --- a/packages/vue/compiler-sfc/register-ts.js +++ b/packages/vue/compiler-sfc/register-ts.js @@ -1,5 +1,3 @@ if (typeof require !== 'undefined') { - try { - require('@vue/compiler-sfc').registerTS(() => require('typescript')) - } catch (e) {} + require('@vue/compiler-sfc').registerTS(() => require('typescript')) }