Rollup-plugin-typescript2: Warum werden Schnittstellendeklarationen entfernt?

Erstellt am 19. Juli 2017  ·  19Kommentare  ·  Quelle: ezolenko/rollup-plugin-typescript2

Hallo,

Ich versuche, für eine Bibliothek vom Webpack zum Rollup zu wechseln, und ich habe Probleme, Deklarationen korrekt auszuführen.

Es scheint, dass Schnittstellendeklarationen nicht exportiert werden. Dies ist ein Problem, wenn ich Dinge wie habe:

import { RenderedCell } from "../RenderedCell";

export default class MergedCell implements RenderedCell {
    // ...
}

Ich erhalte die Fehlermeldung, dass RenderedCell nicht gefunden werden kann.
Ich habe in Webpack gearbeitet und kann nicht verstehen, was der Unterschied in meiner Konfiguration ist, der dieses Problem verursacht hat. aber ich scheine zu verstehen, dass es bei Rollup normal ist.

Übrigens. Ich verwende das neueste Rollup, rollup-plugin-typescript2 und rollup-plugin-uglify. Ich kann meine Konfigurationen bei Bedarf posten

Hilfreichster Kommentar

Was es wert ist, rufe ich nach dem Rollup einfach tsc --emitDeclarationOnly auf, wodurch die Deklarationsdateien im Build-Ordner überschrieben werden.
in meinem package.json

"scripts": {
    "build": "rollup -c",
    "postbuild: "tsc --emitDeclarationOnly"
}

Alle 19 Kommentare

Ist dies ein Laufzeitfehler oder ein Typskriptfehler? Könnten Sie posten, wie Sie die Schnittstelle von RenderedCell selbst exportieren?

Die Sache ist, dass die Datei überhaupt nicht generiert wird und fehlschlägt, wenn die Bibliothek in einem anderen Projekt verwendet wird.

Warten Sie, erwarten Sie, dass die Schnittstelle RenderedCell generiert wird? Von dem Code, den Sie gepostet haben, würde Typescript erwarten, dass die Datei RenderedCell.ts ein Verzeichnis über der aktuellen Datei vorhanden ist und etwa Folgendes enthalten muss:

export interface RenderedCell 
{ 
    // ...
}

Könnten Sie nähere Angaben zu Ihrer Projektstruktur machen? (Dateibaum, tsconfig, Rollup-Konfiguration usw.)

ja, ich erwarte, dass es generiert wird.

Hier meine Konfigurationen:

Ausführen des Builds: rollup -c -f es -n sq-web-component-table -o dist/sq-web-component-table.es.min.js

Ich habe nicht den ganzen Baum eingefügt, weil es eine ziemlich große Bibliothek ist und mehr Rauschen als Signal ist. Aber man sieht schon, dass viele Dateien nicht in der dist.

rollup.config.ts

import typescript from 'rollup-plugin-typescript2';
import uglify from 'rollup-plugin-uglify';
import { minify } from 'uglify-es';

export default {
    entry: './src/index.ts',
    dest: 'dist/sq-web-component-table.min.js',
    sourceMap: true,

    plugins: [
        typescript(),
        uglify({}, minify)
    ]
}

tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "es2015",
    "moduleResolution": "node",
    "declaration": true,
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "outDir": "dist"
  },
  "include": [
    "src/**/*.ts"
  ],
  "exclude": [
    "dist",
    "node_modules",
    "**/*-test.ts"
  ]
}

RenderedCell.ts

import {RenderedElement} from "./RenderedElement";
import {RenderedRow} from "./RenderedRow";
export interface RenderedCell extends RenderedElement {
    isMergedCell(): boolean;
    getColspan(): number;
    setColspan(colspan: number): void;
    getParent(): RenderedRow;
}

Dateibaum

.
├── src
│   ├── index.ts
│   └── table
│       ├── extensions
│       │   ├── base
│       │   │   ├── FirstTableExtension.ts
│       │   │   ├── LastTableExtension.ts
│       │   │   ├── SectionDispatcher.ts
│       │   │   ├── SectionManager.ts
│       │   │   └── SizeChangeMonitor.ts
│       │   ├── InvalidateEvent.ts
│       │   ├── InvalidateSizesEvent.ts
│       │   ├── RenderedCell.ts
│       │   ├── RenderedElement.ts
│       │   ├── RenderedRow.ts
│       │   ├── RenderedSection.ts
│       │   ├── RenderedTable.ts
│       │   ├── SectionClickedEvent.ts
│       │   ├── support
│       │   │   └── ...
│       │   ├── TableAttributes.ts
│       │   ├── TableExtensionChain.ts
│       │   ├── TableExtensionList.ts
│       │   └── TableExtension.ts
│       ├── model
│       │   └── ...
│       ├── TableRenderingOptions.ts
│       ├── Table.ts
│       ├── util
│       │   └── ...
│       └── view
│           └── ...
├── dist
│   ├── index.d.ts
│   ├── sq-web-component-table.es.min.js
│   ├── sq-web-component-table.es.min.js.map
│   ├── sq-web-component-table.min.js
│   ├── sq-web-component-table.min.js.map
│   └── table
│       ├── extensions
│       │   ├── base
│       │   │   ├── FirstTableExtension.d.ts
│       │   │   ├── LastTableExtension.d.ts
│       │   │   ├── SectionDispatcher.d.ts
│       │   │   ├── SectionManager.d.ts
│       │   │   └── SizeChangeMonitor.d.ts
│       │   ├── InvalidateEvent.d.ts
│       │   ├── InvalidateSizesEvent.d.ts
│       │   ├── RenderedRow.d.ts
│       │   ├── SectionClickedEvent.d.ts
│       │   ├── support
│       │   │   └── ...
│       │   ├── TableAttributes.d.ts
│       │   └── TableExtensionList.d.ts
│       ├── model
│       │   └── ...
│       ├── Table.d.ts
│       ├── util
│       │   └── ...
│       └── view
│           └── ...
├── node_modules
│   └── ...
├── __tests__
│   └── ...
├── package.json
├── rollup.config.js
└── tsconfig.json

Ah ich sehe. Ist die lib zufällig Opensource?

Versuchen Sie, mit diesen Optionen zu bauen:

typescript({ verbosity: 2, clean: true }),

Prüfen Sie, ob alle erwarteten Dateien verarbeitet werden. Wenn plötzlich Deklarationen generiert werden, liegt irgendwo ein Cache-Problem vor.

Wenn RenderedCell.ts in der Ausgabe nicht erwähnt wird ( rpt2: transpiling '...' ), erhöhen Sie die Ausführlichkeit auf 3 und prüfen Sie, ob die Dateien, die es importieren sollen, dies tun. Du solltest so etwas sehen wie

rpt2: resolving '../RenderedCell'
rpt2:     to '...'

Wenn das Problem nicht offensichtlich ist, füge ich irgendwo weitere Protokollierung hinzu.

Ich würde gerne, vielleicht in der Zukunft :)

Danke für die Tricks, werde ich am Montag ausprobieren.

Wenn Sie declaration: false im Abschnitt "compilerOptions" Ihrer tsconfig festlegen und neu kompilieren, verschwindet das Problem dann? Wenn ja, bezieht sich der von TSC gemeldete Fehler auf eine der Dateien im Verzeichnis dist? Wenn ja, Ihre Antwort auf beides ist, verschwindet der Fehler, wenn Sie der Datei, die die Datei RenderedCell enthält, eine typunabhängige Logik hinzufügen, z. B. einen Export einer einfachen Funktion? Wenn ja, liegt der Grund darin, dass die Datei, die RenderedCell als unbenutzt betrachtet wird und Typescript niemals Deklarationen dafür vorbereitet.

Wenn all dies auf Sie zutrifft, sehe ich 2 Möglichkeiten:

  • Beenden Sie die Generierung von Deklarationen für Ihr Bundle.
  • Stellen Sie sicher, dass das Roll-up die Datei nicht vollständig wegschüttet, indem Sie Änderungen an der Datei vornehmen, die nicht typbezogen sind. Ja, es ist ein Hack und ich hoffe, wir finden einen Weg, es besser zu machen

Hallo,

Entschuldigung für die lange Verzögerung, ich habe Ihre Tipps und Tricks ausprobiert, konnte aber immer noch keine Typdefinitionen für Schnittstellen generieren.

Ich habe die Konfiguration in typescript({ verbosity: 3, clean: true }) geändert.
In der Ausgabe des generierten Builds wird die RenderedCell Schnittstelle nicht ein einziges Mal erwähnt.

Ich bin mir zu 100% sicher, dass diese Datei benötigt wird, da die index.d.ts der Bibliothek sie direkt benötigen und alle Dateien außer den Schnittstellen generiert werden, aber die Schnittstellen sind noch in den Importen der index.d.ts Datei.

Ich werde in den Code eintauchen, um zu sehen, ob es einen bestimmten Grund gibt, warum diese Dateien nicht generiert werden.

@wessberg Das Generieren von Deklarationen für mein Bundle zu stoppen, ist keine Option, da dies eine Bibliothek ist, die Teil eines größeren Projekts ist, die alle in TypeScript geschrieben sind. Wenn sie also keine Eingaben enthält, funktioniert sie nicht.

Also habe ich einige Nachforschungen angestellt und ein Repository erstellt, das meinen Fall mit einem minimalen Konfigurationssatz reproduziert: https://github.com/onigoetz/typescript-rollup-experiment

Ich habe auch eine Webpack-Konfiguration hinzugefügt, um zu vergleichen, wie Webpack funktioniert.

Ich verstehe das Problem so, dass wenn rollup-plugin-typescript2 die kompilierte Version einer Datei erfordert (sagen wir index.ts), Typescript die kompilierten Dateien und seine Importe zurückgibt, jedoch ohne die Schnittstellen in den Importen.

Aus diesem Grund generiert Rollup sie nie: Es ist sich ihrer Existenz nicht bewusst.

Um das Repository auszuführen, führen Sie ein npm install && npm run build im Verzeichnis aus.

Wenn Sie hinzufügen:
import "./SomeInterface"; (genau so, - ohne benannte Bindungen) zu deiner index.ts Datei, es sollte funktionieren. Macht es?

Leider ruft Rollup nicht den Transformationshandler von Plugins für reine Deklarationsdateien auf, z. B. Dateien, die nur Typdeklarationen enthalten. Das obige sollte funktionieren, da Rollup dadurch gezwungen wird, die Datei auszuwerten. Dieses Problem: https://github.com/rollup/rollup-plugin-typescript/issues/28 erklärt, wie und warum dieses Problem besteht. Theoretisch könnten wir alle Abhängigkeiten Ihrer Anwendung vom Einstiegspunkt aus manuell auflösen und diejenigen bestimmen, die nur Typdeklarationen enthalten ).

Ich fürchte, wir können nicht viel dagegen tun, ohne das Rollup selbst zu ändern. Der von mir beschriebene "Hack" sollte jedoch vorerst funktionieren.

Ja, gerade überprüft, das Hinzufügen von import "./SomeInterface"; im Test-Repository behebt die Dinge.

Wenn nur Typen importiert werden, blendet typescript import-Anweisungen aus der js-Ausgabe aus und rollup sieht diese Dateien nicht und sendet sie daher nicht zum Transpilieren.

Ich werde versuchen, zu betrügen und zu überwachen, welche Dateien mit Typskript von der Festplatte angefordert werden und welche Dateien Rollup zum Transpilieren gesendet hat. Es sollte möglich sein, den Unterschied mit dem Flag "Nur Definitionen" zu erzwingen. Dies kann in einigen Fällen zu zu vielen d.ts-Dateien führen (zum Beispiel für Dinge, die Rollup rechtmäßig aus dem Baum geschüttelt hat).

Danke fürs Hinschauen, ich werde auch prüfen, ob ich dazu einen Beitrag leisten kann.

@onigoetz , ok, probiere dein Projekt mit Master aus. Überprüfen Sie, ob richtige Deklarationen generiert werden, aber überprüfen Sie auch, dass keine unerwarteten auftreten :)

Super, du hast es buchstäblich repariert, während ich geschlafen habe :)

Ich habe es getestet und es funktioniert fast einwandfrei.

Es gibt nur ein kleines Problem, aber ich denke, dagegen können wir nichts tun, der Webpack-Loader macht genau das gleiche und die Dateiliste wird von TypeScript selbst generiert.

Als Beispiel; Wenn ich drei Dateien in meinem Repository habe:

  • index.ts importieren SomeInterface.ts
  • SomeInterface.ts
  • nongenerated.ts importieren SomeInterface.ts

nongenerated.ts wird nie referenziert, aber seine Typen werden trotzdem generiert.

Cool, danke fürs testen. Ich werde es etwas später veröffentlichen, nachdem ein weiteres Problem bestätigt wurde.

Ja, wir können nicht viel tun, wenn wir das Rollup umgehen. Sie sollten diese Dateien in der Option exclude manuell ausschließen können, aber das ist eine schlechte Problemumgehung.

Ok, jetzt in 0.5.1

funktioniert gut, einfach tsconfig.json konfigurieren

{
    "compilerOptions": {
        "module": "es2015",
        "target": "es5",
        "declaration":true,
        "declarationDir": "lib",
        "typeRoots": [
            "node_modules/@six006",
            "node_modules/@types"
        ],
        "lib": [
            "es2015",
            "es2017",
            "es5"
        ],
    },
    "include": [
        "src/index.ts",
        "src/module/**/*.ts"
    ],
    "exclude": [
        "node_modules"
    ]
}

include Abschnitt

YMMV, aber ich habe es so zum Laufen gebracht ...

Vor

export type MyType = { ... };

nach

type MyType = { ... };

export { MyType }

Was es wert ist, rufe ich nach dem Rollup einfach tsc --emitDeclarationOnly auf, wodurch die Deklarationsdateien im Build-Ordner überschrieben werden.
in meinem package.json

"scripts": {
    "build": "rollup -c",
    "postbuild: "tsc --emitDeclarationOnly"
}
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen