Rollup-plugin-typescript2: No funciona con el complemento que contiene sintaxis async / await

Creado en 14 ago. 2018  ·  15Comentarios  ·  Fuente: ezolenko/rollup-plugin-typescript2

Que pasa y por que esta mal

Este complemento no funciona con el complemento que contiene sintaxis asíncrona / en espera causada por un problema de hash de objeto y tscache.ts . Creo que esto es difícil de arreglar el objeto-hash porque ahora no hay forma de detectar la función asíncrona. Entonces, ¿hay alguna alternativa sin object-hash?

Medio ambiente

Versiones

  • mecanografiado: 2.8.3
  • resumen: 2.1.1
  • rollup-plugin-typescript2: 0.14.0

rollup.config.js

import svgr from '@svgr/rollup';
import typescript from 'rollup-plugin-typescript2';

export default {
  ...
  plugins: [
    replace({ 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV) }),
    svgr(),
    typescript({
      useTsconfigDeclarationDir: true,
    })
  ],
  ...
};

tsconfig.json

No es relevante.

package.json

No es relevante.

salida del complemento con verbosidad 3

[!] (rpt2 plugin) Error: Unknown object type "asyncfunction"
src/components/atoms/Icon/index.ts
Error: Unknown object type "asyncfunction"
    at Object._object (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:218:17)
    at Object._function (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:319:14)
    at Object.dispatch (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:185:30)
    at /Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:246:18
    at Array.forEach (<anonymous>)
    at Object._object (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:242:21)
    at Object.dispatch (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:185:30)
    at /Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:260:23
    at Array.forEach (<anonymous>)
    at Object._array (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:259:20)

Comentario más útil

Debo admitir que me sorprende que esto no haya sido un problema mayor hasta ahora, ya que las funciones asíncronas son extremadamente comunes en este momento 😀. Por eso también creo que simplemente ignorarlo conducirá a una gran cantidad de problemas de caché. El PR que envié a object-hash hace algún tiempo fue una consecuencia de este mismo problema, y ​​le sugiero que elimine la dependencia de object-hash. Estoy bastante seguro de que el PR enviado hace algún tiempo funcionaría bien, ya que coincide con el mismo valor que se proporciona en el mensaje de error y pasó ambas pruebas unitarias y resolvió los problemas en este complemento, así que siéntase libre de depender del PR. en lugar del paquete NPM aquí.

@vwxyutarooo , una solución inmediata es establecer clean: true en la configuración para omitir el caché por completo. Alternativamente (perdón por el enchufe) construí https://github.com/wessberg/rollup-plugin-ts que también funcionará bien

Todos 15 comentarios

Agregué una solución para ignorar cualquier cosa que el hash de objeto no pueda procesar (vea la rama objecthash, opción objectHashIgnoreUnknownHack ). Sin embargo, esto puede hacer que el caché quede obsoleto, por lo que no es una buena solución a largo plazo.

@wessberg

Debo admitir que me sorprende que esto no haya sido un problema mayor hasta ahora, ya que las funciones asíncronas son extremadamente comunes en este momento 😀. Por eso también creo que simplemente ignorarlo conducirá a una gran cantidad de problemas de caché. El PR que envié a object-hash hace algún tiempo fue una consecuencia de este mismo problema, y ​​le sugiero que elimine la dependencia de object-hash. Estoy bastante seguro de que el PR enviado hace algún tiempo funcionaría bien, ya que coincide con el mismo valor que se proporciona en el mensaje de error y pasó ambas pruebas unitarias y resolvió los problemas en este complemento, así que siéntase libre de depender del PR. en lugar del paquete NPM aquí.

@vwxyutarooo , una solución inmediata es establecer clean: true en la configuración para omitir el caché por completo. Alternativamente (perdón por el enchufe) construí https://github.com/wessberg/rollup-plugin-ts que también funcionará bien

@wessberg Sí, supongo que todavía no muchos complementos acumulativos tienen async en su interfaz.

¿Conoces una forma mejor de hacer hash de objetos? Necesito crear una clave de caché basada en parte en el objeto de configuración de resumen (y, por lo tanto, que contiene la fuente de todos los complementos utilizados) que se pasa al inicio.

por cierto, para aclarar: el problema se aplica a las cosas asíncronas en la configuración acumulada en sí. La asincronía en el código que se transpila no es un problema, porque el código se basa en el texto fuente.

Hmm, bueno, podría aplicar sha1 al resultado de JSON.stringify'ing toda la configuración con un reemplazador personalizado que mapea complementos a su propiedad name que estoy bastante seguro de que es necesario.
Por ejemplo, la siguiente configuración acumulada:

{
  // ...
  treeshake: true,
  plugins: [
    myPlugin1(),
    myPlugin2()
  ],
  // ...
}

Podría convertirse en la siguiente representación JSON:

{
  "treeshake": true,
  "plugins": [
    "name-of-my-plugin-1",
    "name-of-my-plugin-2"
  ]
}

¿Y luego podría aplicar sha1 y obtener una cadena base64 o algo así que podría usar como clave de caché?

Estaba pensando en ese sentido, pero ¿eso no eliminaría aún más cosas de la consideración de caché? Sospecho que object-hash se hizo específicamente porque JSON.stringify tira cualquier cosa que no sea una propiedad de valor simple, una matriz o un diccionario; no hay nada más en la especificación json.

Supongo que podría incorporar un hash de package-lock,json y su equivalente en hilo, si hubiera una forma confiable de encontrarlos. (para mitigar el efecto de la opción objectHashIgnoreUnknownHack )

Gracias a todos por discutir sobre este tema. En realidad, la dosis de la opción clean: true no omite el proceso de caché, por lo que no funciona ni siquiera por un tiempo. Sin embargo, ignoreUnknown posiblemente sea la forma de solucionar este problema, como dice @ezolenko . ¡Esperaré 0.16.2 de todos modos!

@vwxyutarooo , clean: true usa una estrategia de caché noop. Eso es lo que recuerdo que implementó @ezolenko hace un tiempo. Si todavía intenta calcular una clave de caché a partir de la configuración acumulada, ese comportamiento debe analizarse en mi opinión

No sé cómo esto afectó al resultado objeto de hash, sin embargo el objectHashIgnoreUnknownHack opción en objecthash rama es que funciona para mí.

Modifiqué un poco el caché para que clean: true ni siquiera invoque el hash de objeto y fusioné todo en el maestro. Lo liberaré en unos días

En 0.17.0 ahora

Para otra solución alternativa que no usa el truco objectHashIgnoreUnknownHack , encontré este problema usando rollup-plugin-require-context , y el siguiente fragmento parece funcionar:

import requireContextORIGINAL from 'rollup-plugin-require-context'

const requireContext = (options) => {
  const plugin = requireContextORIGINAL(options)
  return {
    name: plugin.name,
    transform(code, id) {
      return plugin.transform(code, id)
    }
  }
}

Es decir, hacer de transform una función normal que devuelve una promesa.

Pensé que agregaría una actualización para la gente aquí de que la causa raíz aquí finalmente se solucionó en https://github.com/puleos/object-hash/pull/90 (muy similar a https://github.com/puleos/ object-hash / pull / 68 mencionado anteriormente) y aquí en # 203. No es necesario usar objectHashIgnoreUnknownHack para admitir complementos asíncronos y no más problemas de caché: se lanzó como v0.26.0 🎉 😄

¿Fue útil esta página
0 / 5 - 0 calificaciones