web-dev-qa-db-fra.com

L'option 'noEmit' ne peut pas être spécifiée avec l'option 'incrémental'

Je développe une application next.js. Il a les éléments suivants tsconfig.js

{
  "compilerOptions": {
    "target": "ES2018",
    "module": "esnext",
    "lib": [
      "dom",
      "es2018",
      "es2019.array"
    ],
    "jsx": "preserve",
    "sourceMap": true,
    "skipLibCheck": true,
    "strict": true,
    "esModuleInterop": true,
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "allowJs": true,
    "forceConsistentCasingInFileNames": true,
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "incremental": true
  },
  "exclude": [
    "server",
    "next.config.js"
  ],
  "include": [
    "lib/global.d.ts",
    "next-env.d.ts",
    "**/*.ts",
    "**/*.tsx",
    "**/*.js"
  ]
}

Il fonctionne bien en mode développement, mais lors de la création de la version, il affiche l'erreur suivante:

ERROR in tsconfig.json
22:5 Option 'noEmit' cannot be specified with option 'incremental'.
    20 |     "resolveJsonModule": true,
    21 |     "isolatedModules": true,
  > 22 |     "noEmit": true,
       |     ^
    23 |     "incremental": true
    24 |   },
    25 |   "exclude": [

Next.js injecte automatiquement 'noEmit: true' dans tsconfig.json fichier. Alors que j'ai vraiment besoin du mode incrémentiel pour des builds plus rapides. Quelle peut être la solution à cela?

9
Muhammad Zeeshan

De problème TypeScript # 33809 :

Cela n'a vraiment pas de sens d'avoir incremental et noEmit ensemble, puisque noEmit nous empêche d'écrire des métadonnées incrémentielles. (Donc rien n'est réellement incrémental).

Vous devriez considérer emitDeclarationOnly au lieu de noEmit, si vous voulez juste une vérification incrémentielle.

Selon cela, le incremental: true flag n'a rien fait pour accélérer la construction pendant que noEmit: true est défini. Vous devez donc soit supprimer noEmit: true ou remplacez-le par emitDeclarationOnly: true.

Vous pouvez contrôler les dossiers de sortie en utilisant outDir et declarationDir.

2
Sampo

TS 4.0+

--incremental avec --noEmitest possible maintenant:

"compilerOptions": {
  "noEmit": true,
  "incremental": true,
  // "tsBuildInfoFile": "/tmp/my-proj/tsbuildinfo" // custom build info file path
  // ...
}

Le fichier d'informations de construction est émis même avec noEmit. Vous pouvez définir son emplacement explicite via --tsBuildInfoFile . Sinon outDir - s'il est toujours défini - ou tsconfig.json la racine du projet est prise comme répertoire d'émission.

Anciennes versions (solution de contournement)

  "compilerOptions": {
    "incremental": true,
    "declaration": true,
    "emitDeclarationOnly": true, // to emit at least something
    // "noEmit": true,
    // ...
    
    // Either set overall output directory
    "outDir": "dist",
    //  or separate locations for build file and declarations 
    // "declarationDir": "dist"
    // "tsBuildInfoFile": "/tmp/my-proj/tsbuildinfo"
  }

Plus d'informations

0
ford04