Angular 8 - Módulos de carga diferida: Error TS1323: la importación dinámica solo se admite cuando el indicador '--module' es 'commonjs' o 'esNext'

107

Cuando actualicé Angular de 7 a Angular 8, obteniendo un error para los módulos de carga diferida

He probado las opciones, que están en la guía de actualización angular.

Hizo los siguientes cambios:

antes de

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

Después

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

error TS1323: la importación dinámica solo se admite cuando el indicador '--module' es 'commonjs' o 'esNext'.

RajuPedda
fuente

Respuestas:

205

Está utilizando la importación dinámica, por lo que debe cambiar su tsconfig.json de esta manera para apuntar su código al esnextmódulo

{
  "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"
    ]
  }
}

También asegúrese de verificar que tsconfig.app.json no tenga el módulo y la configuración de destino algo como esto

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "./out-tsc/app",
    "types": []
  },
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
    "src/test.ts",
    "src/**/*.spec.ts"
  ]
}
Tony Ngo
fuente
4
ng newno usa esto por defecto. ¿Hay una razón?
Helzgate
2
Parece funcionar en Edge, Chrome, Firefox e IE11 cuando elimino el comentario de la sección IE11 en polyfills, así que estoy feliz.
Helzgate
12
Tuve que eliminar la "module": "es2015"línea de mi tsconfig.app.jsonarchivo
ranbuch
5
@ranbuch, tuve el mismo problema pero no eliminé la línea, simplemente la cambié a "module": "esnext".
Alfa Bravo
aún enfrenta el mismo evento problemático después de actualizar el archivo tsconfig.json
Gaurav Aggarwal
25

Simplemente agregando al anwser de @ Tony, es posible que también deba hacer lo mismo (cambiar a "módulo": "esnext") en tsconfig.app.json. En mi caso, tsconfig.json ya estaba usando esnext como módulo, pero tsconfig.app.json todavía usaba es2015 y eso causó este error.

Niz
fuente
3
Podemos evitar agregar "módulo": "esnext" en ambos archivos, podemos ponerlo en tsconfig.json pero no en tsconfig.app.json, ya que esto ya está extendiendo el tsconfig.json.
RajuPedda
14

Solo quiero agregar mi experiencia a la respuesta de @ Tony. Después de cambiar tsconfig.json, todavía mostraba un error (subrayado en rojo). Solo después de volver a abrir el editor (usé VSCode) vi desaparecer el subrayado rojo.

Tai JinYuan
fuente
No tengo el archivo tsconfig.app.json. ¿Debería crear uno?
Mark
Sí, consulte esto. stackoverflow.com/questions/36916989/…
Tai JinYuan
Fue muy útil. Gracias :)
Praveen Kumar Palai
1
En IDEA Intelij tuve el mismo problema. Necesitas volver a abrir el proyecto.
NieMaszNic
12

Creo que la forma correcta de hacer esto es ajustarse en tsconfig.app.jsonlugar de hacerlo tsconfig.json.

tsconfig.app.json

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

tsconfig.app.jsones el archivo de configuración de TypeScript específico de la aplicación que se encuentra debajo de la raíz del espacio de trabajo de Angular . El tsconfig.app.jsonexiste por lo que si usted está construyendo un espacio de trabajo angular que tiene múltiples aplicaciones en ella, puede ajustar la configuración de imprenta por separado para cada aplicación sin tener que escribir las propiedades de configuración redundante que se superponen entre las aplicaciones (de ahí su extendspropiedad).

Técnicamente, no necesitas tsconfig.app.jsonnada. Si lo elimina, tendrá que colocar el archivo "module": "esnext"in tsconfig.json. Si lo mantiene allí, tendrá prioridad sobre tsconfig.json, por lo que solo necesita agregar la "module":"esnext"línea tsconfig.app.json.

Zach Gollwitzer
fuente
Sí, tuve que agregar el módulo: 'esnext' tanto en tsconfig.json como en tsconfig.app.json
RDV
0

Resuelvo este error siguiendo los pasos del paso 1: "módulo": "es2015" a "módulo": "AMD" en tsconfig.json

paso 2: cree un nuevo archivo tsconfig.app.json en el directorio raíz de la aplicación, copie el código de Tony Ngo y péguelo, luego este problema se resolverá.

Rashid Bukhari
fuente