Rollup-plugin-typescript2: Funktioniert nicht mit Plugin, das async/await-Syntax enthält

Erstellt am 14. Aug. 2018  ·  15Kommentare  ·  Quelle: ezolenko/rollup-plugin-typescript2

Was passiert und warum es falsch ist

Dieses Plugin funktioniert nicht mit einem Plugin, das eine async/await-Syntax enthält, die durch ein Objekt-Hash-Problem und tscache.ts verursacht wird . Ich denke, dies ist schwer zu beheben, da es jetzt keine Möglichkeit gibt, eine asynchrone Funktion zu erkennen. Gibt es also eine Alternative ohne Objekt-Hash?

Umfeld

Versionen

  • Typoskript: 2.8.3
  • Rollup: 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

Nicht relevant.

Paket.json

Nicht relevant.

Plugin-Ausgabe mit Ausführlichkeit 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)

Hilfreichster Kommentar

Ich muss zugeben, dass ich überrascht bin, dass dies bisher kein größeres Problem war, da asynchrone Funktionen inzwischen sehr verbreitet sind 😀. Deshalb denke ich auch, dass das einfache Ignorieren zu vielen Cache-Problemen führen wird. Die PR, die ich vor einiger Zeit bei object-hash eingereicht habe, war eine Folge genau dieses Problems, und ich würde vorschlagen, dass Sie die Abhängigkeit von Object-Hash entfernen. Ich bin mir ziemlich sicher, dass der vor einiger Zeit eingereichte PR gut funktionieren würde, da er mit dem gleichen Wert übereinstimmt, der in der Fehlermeldung angegeben ist, und beide Komponententests bestanden und die Probleme in diesem Plugin gelöst hat. Verlassen Sie sich also auf den PR anstelle des NPM-Pakets hier.

@vwxyutarooo , eine sofortige clean: true in der Konfiguration festzulegen , um den Cache vollständig zu umgehen. Alternativ (sorry für den Stecker) habe ich https://github.com/wessberg/rollup-plugin-ts gebaut, was auch gut funktioniert

Alle 15 Kommentare

Ich habe eine Problemumgehung hinzugefügt, um alles zu ignorieren, was Objekt-Hash nicht verarbeiten kann (siehe Objekthash-Zweig, Option objectHashIgnoreUnknownHack ). Dies kann den Cache jedoch möglicherweise veraltet machen, also keine gute langfristige Lösung.

@wessberg

Ich muss zugeben, dass ich überrascht bin, dass dies bisher kein größeres Problem war, da asynchrone Funktionen inzwischen sehr verbreitet sind 😀. Deshalb denke ich auch, dass das einfache Ignorieren zu vielen Cache-Problemen führen wird. Die PR, die ich vor einiger Zeit bei object-hash eingereicht habe, war eine Folge genau dieses Problems, und ich würde vorschlagen, dass Sie die Abhängigkeit von Object-Hash entfernen. Ich bin mir ziemlich sicher, dass der vor einiger Zeit eingereichte PR gut funktionieren würde, da er mit dem gleichen Wert übereinstimmt, der in der Fehlermeldung angegeben ist, und beide Komponententests bestanden und die Probleme in diesem Plugin gelöst hat. Verlassen Sie sich also auf den PR anstelle des NPM-Pakets hier.

@vwxyutarooo , eine sofortige clean: true in der Konfiguration festzulegen , um den Cache vollständig zu umgehen. Alternativ (sorry für den Stecker) habe ich https://github.com/wessberg/rollup-plugin-ts gebaut, was auch gut funktioniert

@wessberg Ja, ich denke, noch nicht viele Rollup-Plugins haben Async in ihrer Benutzeroberfläche.

Kennen Sie eine bessere Methode zum Hashing von Objekten? Ich muss einen Cache-Schlüssel erstellen, der teilweise auf dem Rollup-Konfigurationsobjekt basiert (und daher die Quelle aller verwendeten Plugins enthält), der beim Start übergeben wird.

Übrigens, um das zu verdeutlichen - das Problem gilt für asynchrone Dinge in der Rollup-Konfiguration selbst. Async im transpilierten Code ist kein Problem, da Code basierend auf Quelltext gehasht wird.

Hmm, nun, Sie könnten sha1 auf das Ergebnis von JSON.stringify'ing der gesamten Konfiguration mit einem benutzerdefinierten Ersetzer anwenden, der Plugins ihrer name Eigenschaft zuordnet,
Zum Beispiel die folgende Rollup-Konfiguration:

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

Könnte in die folgende JSON-Darstellung umgewandelt werden:

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

Und dann könnten Sie sha1 anwenden und einen base64-String oder ähnliches herausholen, den Sie als Cache-Schlüssel verwenden könnten?

Ich dachte in diese Richtung, aber würde das nicht noch mehr Dinge aus der Berücksichtigung für den Cache entfernen? Ich vermute, dass object-hash speziell erstellt wurde, weil JSON.stringify alles wegwirft, was keine reine Werteeigenschaft, kein Array oder ein Wörterbuch ist - es gibt nichts anderes in json spec.

Ich nehme an, ich könnte einen Hash von package-lock,json und ein Garnäquivalent einbauen, wenn es einen zuverlässigen Weg gäbe, sie zu finden. (um den Effekt der Option objectHashIgnoreUnknownHack abzuschwächen)

Danke Leute, die über dieses Problem diskutieren. Tatsächlich clean: true Option ignoreUnknown könnte jedoch möglicherweise der Weg sein, dieses Problem zu beheben, wie @ezolenko sagt. Ich werde sowieso 0.16.2 warten!

@vwxyutarooo , ich war davon ausgegangen, dass clean: true eine Noop-Cache-Strategie verwendet. Daran erinnere ich mich, dass

Ich weiß nicht , wie dieses Objekt-Hash - Ergebnis beeinflusst, aber die objectHashIgnoreUnknownHack Option auf objecthash Zweig arbeitet für mich.

Ich habe den Cache ein wenig überarbeitet, sodass clean: true nicht einmal den Objekt-Hash aufruft und alles in den Master einfügt. Ich werde in ein paar Tagen freigeben

In 0.17.0 jetzt

Für eine andere Problemumgehung, die den objectHashIgnoreUnknownHack Hack nicht verwendet, bin ich mit rollup-plugin-require-context auf dieses Problem gestoßen, und das folgende Snippet scheint zu funktionieren:

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)
    }
  }
}

Nämlich, transform einer normalen Funktion zu machen, die ein Promise zurückgibt.

Ich dachte, ich würde hier ein Update für die Leute hinzufügen, dass die Ursache hier endlich in https://github.com/puleos/object-hash/pull/90 behoben wurde (sehr ähnlich wie https://github.com/puleos/ object-hash/pull/68 (siehe oben) und hier in #203. Keine Notwendigkeit, objectHashIgnoreUnknownHack zu verwenden, um asynchrone Plugins zu unterstützen und keine Cache-Probleme mehr - wurde gerade als v0.26.0 veröffentlicht

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen