Просмотр исходного кода

fix(compiler-sfc): throw error when failing to load TS during type resolution (#8883)

三咲智子 Kevin Deng 2 лет назад
Родитель
Сommit
4936d2e11a

+ 25 - 2
packages/compiler-sfc/src/script/resolveType.ts

@@ -719,7 +719,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<SFCScriptCompileOptions['fs']>
@@ -768,7 +786,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. ` +

+ 1 - 3
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'))
 }