Angular 8 - Leniwe ładowanie modułów: Błąd TS1323: Import dynamiczny jest obsługiwany tylko wtedy, gdy flaga „--module” to „commonjs” lub „esNext”

107

Kiedy zaktualizowałem Angular z 7 do Angular 8, otrzymałem błąd z powodu leniwego ładowania modułów

Wypróbowałem opcje, które są dostępne w przewodniku aktualizacji kątowej

Wprowadzono poniższe zmiany:

Przed

    loadChildren: '../feature/path/sample- 
                         tage.module#SameTagModule'

Po

   loadChildren: () => import('../feature/path/sample- 
                      tags.module').then(m => m.CreateLinksModule)

błąd TS1323: Import dynamiczny jest obsługiwany tylko wtedy, gdy flaga „--module” ma wartość „commonjs” lub „esNext”.

RajuPedda
źródło

Odpowiedzi:

206

Używasz dynamicznego importu, więc musisz zmienić plik tsconfig.json w ten sposób, aby skierować kod do esnextmodułu

{
  "compileOnSave": false,
  "compilerOptions": {
    "baseUrl": "./",
    "outDir": "./dist/out-tsc",
    "sourceMap": true,
    "declaration": false,
    "module": "esnext", // add this line
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "importHelpers": true,
    "target": "es2015",
    "typeRoots": [
      "node_modules/@types"
    ],
    "lib": [
      "es2018",
      "dom"
    ]
  }
}

Upewnij się również, że sprawdziłeś tsconfig.app.json nie masz modułu i konfiguracji docelowej, coś takiego

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "./out-tsc/app",
    "types": []
  },
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
    "src/test.ts",
    "src/**/*.spec.ts"
  ]
}
Tony Ngo
źródło
4
ng newnie używa tego domyślnie. Czy jest powód?
Helzgate
2
Wygląda na to, że działa w Edge, Chrome, Firefox i IE11, kiedy odkomentowuję sekcję IE11 w polyfills, więc jestem zadowolony.
Helzgate
12
Musiałem usunąć "module": "es2015"linię z mojego tsconfig.app.jsonpliku
ranbuch
5
@ranbuch, miałem ten sam problem, ale nie usunąłem linii, po prostu też ją zmieniłem "module": "esnext".
Alfa Bravo,
nadal stoi w tym samym wydarzeniu problem po aktualizacji pliku tsconfig.json
Gaurav Aggarwal
25

Po prostu dodając do anwser @ Tony'ego, może być konieczne zrobienie tego samego (zmiana na "module": "esnext") w tsconfig.app.json. W moim przypadku tsconfig.json używał już esnext jako modułu, ale tsconfig.app.json nadal używał es2015 i to spowodowało ten błąd.

Niz
źródło
3
Możemy uniknąć dodawania „module”: „esnext” w obu plikach, możemy umieścić go w tsconfig.json, ale nie w tsconfig.app.json, ponieważ to już rozszerza tsconfig.json.
RajuPedda
17

Chcę tylko dodać moje doświadczenie do odpowiedzi @ Tony'ego. Po zmianie tsconfig.jsonnadal pokazywał błąd (czerwone podkreślenie). Dopiero po ponownym otwarciu edytora (użyłem VSCode) zauważyłem, że czerwone podkreślenie zniknęło.

Tai JinYuan
źródło
Nie mam pliku tsconfig.app.json. Powinienem go stworzyć?
Marek
Tak, proszę o przekazanie tego. stackoverflow.com/questions/36916989/…
Tai JinYuan
Był bardzo pomocny. Dzięki :)
Praveen Kumar Palai
1
W IDEA Intelij miałem ten sam problem. Musisz ponownie otworzyć projekt.
NieMaszNic
Tak. Uratowałeś mi dzień.
Shailesh Pratapwar
12

Myślę, że właściwym sposobem na to jest tsconfig.app.jsonraczej dostosowanie niż tsconfig.json.

tsconfig.app.json

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "baseUrl": "./",
    "module": "esnext",
    "types": []
  },
  "exclude": [
    "test.ts",
    "**/*.spec.ts"
  ]
}

tsconfig.app.jsonto plik konfiguracyjny Typescript specyficzny dla aplikacji, który znajduje się poniżej katalogu głównego obszaru roboczego Angular . tsconfig.app.jsonIstnieje więc, że jeśli budujemy kątowym roboczy zawierający wiele aplikacji w nim, można dostosować konfigurację maszynopis oddzielnie dla każdej aplikacji bez konieczności pisania zbędnych właściwości konfiguracyjne, które pokrywają się między aplikacjami (stąd extendswłasności).

Technicznie wcale nie potrzebujesz tsconfig.app.json. Jeśli go usuniesz, będziesz musiał umieścić "module": "esnext"w tsconfig.json. Jeśli go tam zatrzymasz, będzie miał pierwszeństwo przed tsconfig.json, więc musisz tylko dodać "module":"esnext"linię tsconfig.app.json.

Zach Gollwitzer
źródło
Tak, musiałem dodać moduł: 'esnext' w obu tsconfig.json i tsconfig.app.json
RDV
0

rozwiązuję ten błąd, wykonując następujące kroki krok 1: „moduł”: „es2015” do „moduł”: „AMD” w tsconfig.json

krok 2: utwórz nowy plik tsconfig.app.json w katalogu głównym aplikacji, skopiuj kod Tony Ngo i wklej do niego, wtedy ten problem zostanie rozwiązany.

Rashid Bukhari
źródło