node.js - Webpack + Typescript + watch duce la eroarea TS2554 doar la re-compilare


Software implicat:

  • webpack 4.8.3
  • typescript 2.8.3
  • ts-loader 4.3.0

Configurarea Webpack:

rules: [
    {
        test: /\.ts(x?)$/,
        exclude: /node_modules/,
        use: ['ng-annotate-loader', 'ts-loader']
    },
    ...
]

Acest lucru compilează proiectul meu fără probleme la o singură compilare (webpack --mode development).

Totuși, începe să producă erori atunci când se construiește în modul de monitorizare:

webpack --progress --watch --mode development
Webpack is watching the files…

Hash: e8f3fc158b2b6feaad07                                                                  
Version: webpack 4.8.3
Time: 75713ms
Built at: 05/15/2018 3:25:27 PM
          Asset       Size      Chunks             Chunk Names
          ...

(Construcția este în regulă. Acum schimb un fișier și se reconstruiește:)

[./ts/foo/foo.ts] 3.82 KiB {foo} [built] [1 error]
[./ts/foo/controllers/bar.ts] 3.8 KiB {baz} {foo} [built]
[./ts/foo/baz.ts] 4.21 KiB {baz} [built] [1 error]
    + 668 hidden modules

ERROR in .../ts/foo/foo.ts
./ts/foo/foo.ts
[tsl] ERROR in .../ts/foo/foo.ts(84,9)
      TS2554: Expected 0 arguments, but got 1.

ERROR in .../ts/foo/baz.ts
./ts/foo/baz.ts
[tsl] ERROR in .../ts/foo/baz.ts(105,9)
      TS2554: Expected 0 arguments, but got 1.

Liniile la care se face referire sunt toate liniile care conțin apeluri console.log, de exemplu:

console.log(`Using locale ${locale}`);

Din nou, dacă întrerup ceasul și construiesc de la zero, funcționează perfect. Care e problema aici?

Pentru testare am eliminat ng-annotate-loader; fără schimbare.
Acest lucru a început să se întâmple după actualizarea lanțului de instrumente de construție de la Webpack 3 la 4, împreună cu actualizările asociate la Typescript de la 2.3.x. În versiunile vechi build --watch funcționa bine.

Răspuns #1

Cred că problema este legată de webpack.NewWatchingPlugin (pluginul de observare implicit), dar poți forța webpack să folosească logica veche de observare a fișierelor dacă adaugi noul plugin webpack.OldWatchingPlugin(). OldWatchingPlugin este mai stabil decât NewWatchingPlugin.

Există o varietate de motive pentru care webpack ar putea să nu funcționeze corespunzător:

  • Dacă nu sunt generate fișiere (cu hashuri diferite), este probabil o problemă de configurare, nu o problemă legată de monitorizarea fișierelor.
  • Lipsa unui număr suficient de urmăritori de fișiere face ca urmăritorul de fișiere din Webpack să nu recunoască modificările.