Rollup-plugin-typescript2: Почему удалены объявления интерфейсов?

Созданный на 19 июл. 2017  ·  19Комментарии  ·  Источник: ezolenko/rollup-plugin-typescript2

Привет,

Я пытаюсь перейти от веб-пакета к накопительному пакету для библиотеки, и у меня возникают проблемы с правильной работой объявлений.

Кажется, что объявления интерфейсов не экспортируются, это проблема, когда у меня есть такие вещи, как:

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

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

Я получаю сообщение об ошибке, что RenderedCell не может быть найден.
Я работал в webpack, и я не могу понять, в чем разница в моей конфигурации, которая сломала это. но я вроде понимаю, что с Rollup это нормально.

КСТАТИ. Я использую последние версии rollup, rollup-plugin-typescript2 и rollup-plugin-uglify. При необходимости могу опубликовать свои конфигурации.

Самый полезный комментарий

Что бы это ни стоило, я просто вызываю tsc --emitDeclarationOnly после объединения, что заменяет файлы объявлений в папку сборки.
в моем package.json

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

Все 19 Комментарий

Это ошибка времени выполнения или ошибка машинописного текста? Не могли бы вы опубликовать, как вы экспортируете интерфейс из самого RenderedCell ?

Дело в том, что файл вообще не генерируется, и он дает сбой при использовании библиотеки в другом проекте.

Подождите, вы ожидаете создания интерфейса RenderedCell ? Из кода, который вы опубликовали, машинописный текст ожидает, что файл с именем RenderedCell.ts будет существовать на один каталог выше текущего файла, и он должен содержать что-то вроде этого:

export interface RenderedCell 
{ 
    // ...
}

Не могли бы вы подробнее рассказать о структуре вашего проекта? (дерево файлов, tsconfig, конфигурация объединения и т. д.)

да, я ожидаю, что он будет сгенерирован.

Вот мои конфигурации:

запуск сборки: rollup -c -f es -n sq-web-component-table -o dist/sq-web-component-table.es.min.js

Я не ставил все дерево целиком, потому что это довольно большая библиотека и в ней больше шума, чем сигнала. Но вы уже можете видеть, что многие файлы не создаются в 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;
}

Файловое дерево

.
├── 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

Ах я вижу. Является ли библиотека с открытым исходным кодом случайно?

Попробуйте построить с такими опциями:

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

Проверьте, все ли файлы, которые вы ожидаете, обрабатываются. Если объявления внезапно начинают формироваться, значит, где-то есть проблема с кешем.

Если RenderedCell.ts не упоминается в выходных данных ( rpt2: transpiling '...' ), увеличьте степень детализации до 3 и проверьте, делают ли это файлы, которые должны его импортировать. Вы должны увидеть что-то вроде

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

Если проблема не очевидна, я где-нибудь добавлю еще логи.

Я бы с удовольствием, возможно, будет в будущем :)

Спасибо за хитрости, попробую в понедельник.

Если вы установите declaration: false в разделе compilerOptions вашего tsconfig и перекомпилируете, проблема исчезнет? Если да, то связана ли ошибка, о которой сообщает TSC, с одним из файлов в каталоге dist? Если да, то ваш ответ на оба вопроса исчезнет, ​​исчезнет ли ошибка, если вы введете некоторую логику, не связанную с типом, в файл, содержащий файл RenderedCell например экспорт простой функции? Если да, то причина в том, что файл, содержащий RenderedCell , считается неиспользуемым, и Typescript никогда не будет готовить для него объявления.

Если все это относится к вам, я вижу 2 варианта:

  • Прекратите создавать объявления для вашего пакета.
  • Убедитесь, что при свертывании файл не будет полностью вытеснен деревом путем внесения в файл изменений, не связанных с типом. Да, это взлом, и я надеюсь, что мы найдем способ исправить это

Привет,

извините за долгую задержку, я попробовал ваши советы и уловки, но мне все еще не удалось получить определения типов для сгенерированных интерфейсов.

Я изменил конфигурацию на typescript({ verbosity: 3, clean: true }) .
В выводе сгенерированной сборки нет ни единого упоминания об интерфейсе RenderedCell .

Я на 100% уверен, что этот файл необходим, так как index.d.ts библиотеки напрямую требует его, и все файлы, кроме интерфейсов, генерируются, но интерфейсы все еще находятся в импорте index.d.ts файл.

Я углублюсь в код, чтобы увидеть, есть ли конкретная причина, по которой эти файлы не создаются.

@wessberg Прекращение генерации объявлений для моего пакета - это не вариант, поскольку это библиотека, которая является частью более крупного проекта, написанного на TypeScript, поэтому, если в нем нет типизации, она не работает.

Итак, я провел небольшое расследование и создал репозиторий, который воспроизводит мой случай с минимальным набором настроек: https://github.com/onigoetz/typescript-rollup-experiment

Я также включил конфигурацию веб-пакета, чтобы сравнить, как он работает.

Насколько я понимаю, проблема заключается в том, что когда для rollup-plugin-typescript2 требуется скомпилированная версия файла (скажем, index.ts), Typescript вернет скомпилированные файлы и импортирует их, но без интерфейсов в импорте.

Вот почему свертка никогда не генерирует их: она не знает об их существовании.

Чтобы запустить репозиторий, выполните внутри каталога npm install && npm run build .

Если вы добавите:
import "./SomeInterface"; (именно так, - без каких-либо именованных привязок) к вашему файлу index.ts , он должен работать. Имеет ли это?

К сожалению, Rollup не вызывает обработчик преобразования подключаемых модулей для файлов, содержащих только объявления, таких как файлы, содержащие только объявления типов. То, что указано выше, должно работать, поскольку это заставляет Rollup оценить файл. Эта проблема: https://github.com/rollup/rollup-plugin-typescript/issues/28 объясняет, как и почему существует эта проблема. Теоретически мы могли бы вручную разрешить все зависимости вашего приложения из точки входа и определить те, которые содержат только объявления типов, но нет способа заставить свертку вызывать ловушку преобразования (помимо других очевидных недостатков, таких как повышенная сложность этапов сборки ).

Боюсь, что мы ничего не сможем сделать, не изменив саму свертку. Однако описанный мною «хак» пока должен работать.

Да, только что проверил, добавление import "./SomeInterface"; в тестовое репо все исправляет.

При импорте только типов машинописный текст исключает операторы импорта из вывода js, а накопительный пакет не видит эти файлы и, таким образом, не отправляет их для транспилирования.

Я попытаюсь обмануть и отслеживать, какие файлы машинописный текст запрашивает с диска, а какой набор файлов отправляется на транспилирование. Должна быть возможность принудительно перенести разницу с помощью только флага. Хотя в некоторых случаях это может привести к слишком большому количеству файлов d.ts (например, для вещей, которые свертка законно удаляется из дерева)

Спасибо, что изучили это, я также проверю, могу ли я внести свой вклад в это.

@onigoetz , хорошо, попробуй свой проект с мастером. Убедитесь, что генерируются правильные объявления, но также проверьте, нет ли неожиданных :)

Замечательно, ты немного поправил, пока я спал :)

Я протестировал его, и он почти отлично работает.

Есть небольшая проблема, но я думаю, что с этим мы ничего не можем сделать, загрузчик веб-пакетов делает то же самое, а список файлов создается самим TypeScript.

Например; Если у меня в репо три файла:

  • index.ts импорт SomeInterface.ts
  • SomeInterface.ts
  • nongenerated.ts импорт SomeInterface.ts

nongenerated.ts никогда не упоминается, но его типы все равно генерируются.

Круто, спасибо за тестирование. Я выпущу его чуть позже, когда подтвердится другая проблема.

Да, мы мало что можем сделать при обходе свертки. Вы должны иметь возможность исключить эти файлы вручную с помощью параметра exclude , но это плохой способ обхода.

Хорошо, теперь в 0.5.1

работать хорошо, просто настройте tsconfig.json

{
    "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 раздел расскажет вам, что сгенерировать

YMMV, но я заставил его работать вот так ...

до

export type MyType = { ... };

после

type MyType = { ... };

export { MyType }

Что бы это ни стоило, я просто вызываю tsc --emitDeclarationOnly после объединения, что заменяет файлы объявлений в папку сборки.
в моем package.json

"scripts": {
    "build": "rollup -c",
    "postbuild: "tsc --emitDeclarationOnly"
}
Была ли эта страница полезной?
0 / 5 - 0 рейтинги