Rollup-plugin-typescript2: Por que as declaraçÔes de interface são removidas?

Criado em 19 jul. 2017  Â·  19ComentĂĄrios  Â·  Fonte: ezolenko/rollup-plugin-typescript2

Oi,

Estou tentando passar do webpack para o rollup de uma biblioteca e não consigo fazer as declaraçÔes funcionarem corretamente.

Parece que as declaraçÔes de interfaces não são exportadas, isso é um problema quando tenho coisas como:

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

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

Recebo a mensagem de erro que RenderedCell nĂŁo pode ser encontrado.
Trabalhei em webpack, e não consigo entender qual a diferença na minha configuração que quebrou isso. mas parece que entendo que é normal com Rollup.

POR FALAR NISSO. Estou usando o rollup mais recente, rollup-plugin-typescript2 e rollup-plugin-uglify, posso postar minhas configuraçÔes, se necessårio

ComentĂĄrios muito Ășteis

Para constar, acabei de chamar tsc --emitDeclarationOnly após o rollup, que substitui os arquivos de declaração na pasta de construção.
no meu package.json

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

Todos 19 comentĂĄrios

Este Ă© um erro de tempo de execução ou erro de digitação? VocĂȘ poderia postar como exportar a interface do prĂłprio RenderedCell ?

O fato Ă© que o arquivo nĂŁo Ă© gerado e falha ao usar a biblioteca em outro projeto.

Espere, vocĂȘ estĂĄ esperando que a interface RenderedCell seja gerada? A partir do cĂłdigo que vocĂȘ postou, seria de esperar que o arquivo denominado RenderedCell.ts existisse em um diretĂłrio acima do arquivo atual e precisaria conter algo assim:

export interface RenderedCell 
{ 
    // ...
}

VocĂȘ poderia dar mais detalhes sobre a estrutura do seu projeto? (ĂĄrvore de arquivos, tsconfig, configuração de rollup, etc)

sim, estou esperando que seja gerado.

Aqui estão minhas configuraçÔes:

executando a construção: rollup -c -f es -n sq-web-component-table -o dist/sq-web-component-table.es.min.js

NĂŁo coloquei a ĂĄrvore inteira porque Ă© uma biblioteca bem grande e faz mais barulho do que sinal. Mas vocĂȘ jĂĄ pode ver que muitos arquivos nĂŁo sĂŁo gerados no 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;
}

Árvore de arquivos

.
├── 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, entendo. O cĂłdigo aberto da lib por acaso?

Tente construir com estas opçÔes:

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

Verifique se todos os arquivos que vocĂȘ espera estĂŁo sendo processados. Se as declaraçÔes começarem a ser geradas repentinamente, hĂĄ um problema de cache em algum lugar.

Se RenderedCell.ts nĂŁo for mencionado na saĂ­da ( rpt2: transpiling '...' ), aumente a verbosidade para 3 e verifique se os arquivos que deveriam ser importados estĂŁo fazendo isso. VocĂȘ deveria ver algo como

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

Se o problema nĂŁo for Ăłbvio, adicionarei mais registros em algum lugar.

Eu adoraria, talvez seja no futuro :)

Obrigado pelos truques, vou tentar isso na segunda-feira.

Se vocĂȘ definir declaration: false na seção compilerOptions de seu tsconfig e recompilar, o problema desaparece? Em caso afirmativo, o erro relatado pelo TSC estĂĄ relacionado a um dos arquivos no diretĂłrio dist? Se sim for sua resposta para ambas, o erro desaparece se vocĂȘ introduzir alguma lĂłgica de nĂŁo tipo no arquivo que contĂ©m RenderedCell , como uma exportação de uma função simples? Se sim, o motivo Ă© que o arquivo que contĂ©m RenderedCell Ă© considerado nĂŁo utilizado e o Typescript nunca prepararĂĄ declaraçÔes para ele.

Se tudo isso se aplica a vocĂȘ, vejo 2 opçÔes:

  • Pare de gerar declaraçÔes para seu pacote.
  • Certifique-se de que o roll-up nĂŁo sacudirĂĄ completamente o arquivo, introduzindo alteraçÔes no arquivo que nĂŁo estĂŁo relacionadas ao tipo. Sim, Ă© um hack e espero que encontremos uma maneira de fazer melhor

Oi,

desculpe pela demora, tentei suas dicas e truques, mas ainda não consegui obter as definiçÔes de tipo para interfaces geradas.

Mudei a configuração para typescript({ verbosity: 3, clean: true }) .
Na saĂ­da da construção gerada, nĂŁo hĂĄ uma Ășnica menção Ă  interface RenderedCell .

Tenho 100% de certeza que este arquivo é necessårio, jå que index.d.ts da biblioteca o requer diretamente e todos os arquivos, exceto as interfaces, são gerados, mas as interfaces ainda estão nas importaçÔes de index.d.ts Arquivo.

Vou mergulhar no cĂłdigo para ver se hĂĄ um motivo especĂ­fico pelo qual esses arquivos nĂŁo sĂŁo gerados.

@wessberg Parar de gerar declaraçÔes para o meu pacote não é uma opção, pois esta é uma biblioteca que faz parte de um projeto maior todo escrito em TypeScript, então se não tiver tipificaçÔes não funciona.

Então, fiz algumas investigaçÔes e criei um repositório que reproduz meu caso com um conjunto mínimo de configuraçÔes: https://github.com/onigoetz/typescript-rollup-experiment

Também incluí uma configuração do webpack para comparar como o webpack o faz funcionar.

Meu entendimento do problema é que quando rollup-plugin-typescript2 requer a versão compilada de um arquivo (digamos index.ts), o Typescript retornarå os arquivos compilados e suas importaçÔes, mas sem as interfaces nas importaçÔes.

É por isso que o rollup nunca os gera: ele nĂŁo tem conhecimento de sua existĂȘncia.

Para executar o repositório, faça um npm install && npm run build dentro do diretório.

Se vocĂȘ adicionar:
import "./SomeInterface"; (exatamente assim, - sem quaisquer vínculos nomeados) para seu arquivo index.ts , ele deve funcionar. É mesmo?

Infelizmente, Rollup nĂŁo invoca o manipulador de transformação de plug-ins para arquivos apenas de declaração, como arquivos contendo apenas declaraçÔes de tipo. A coisa acima deve funcionar, jĂĄ que força o Rollup a avaliar o arquivo. Este problema: https://github.com/rollup/rollup-plugin-typescript/issues/28 explica como e por que esse problema existe. Teoricamente, poderĂ­amos resolver manualmente todas as dependĂȘncias de seu aplicativo a partir do ponto de entrada e determinar aquelas que contĂȘm apenas declaraçÔes de tipo, mas nĂŁo hĂĄ como forçar o rollup a invocar o gancho de transformação (alĂ©m de outras desvantagens Ăłbvias, como a complexidade adicional da etapa de construção )

Infelizmente, nĂŁo podemos fazer muito sobre isso sem alterar o prĂłprio rollup. O "hack" que descrevi deve funcionar por enquanto.

Sim, acabei de verificar, adicionar import "./SomeInterface"; no repositĂłrio de teste corrige as coisas.

Ao importar apenas tipos, o typescript elimina as instruçÔes de importação da saĂ­da js e o rollup nĂŁo vĂȘ esses arquivos e, portanto, nĂŁo os envia para transpilação.

Vou tentar trapacear e monitorar quais arquivos datilografados solicitados do disco versus quais arquivos rollup enviados para transpilação. Deve ser possível forçar a transpilar a diferença com apenas sinalização de definiçÔes. Em alguns casos, isso pode resultar em muitos arquivos d.ts (para coisas que o rollup foi legitimamente sacudido da årvore, por exemplo)

Obrigado por investigar, também verificarei se posso fazer uma contribuição para isso.

@onigoetz , ok, experimente seu projeto com o master. Verifique se as declaraçÔes corretas são geradas, mas também verifique se nenhuma declaração inesperada foi gerada :)

IncrĂ­vel, vocĂȘ literalmente consertou enquanto eu estava dormindo :)

Eu testei e quase funciona bem.

HĂĄ apenas um pequeno problema, mas acho que Ă© algo contra o qual nada podemos fazer, o webpack loader faz exatamente o mesmo e a lista de arquivos Ă© gerada pelo prĂłprio TypeScript.

Como um exemplo; Se eu tiver trĂȘs arquivos em meu repo:

  • index.ts importando SomeInterface.ts
  • SomeInterface.ts
  • nongenerated.ts importando SomeInterface.ts

nongenerated.ts nunca Ă© referenciado, mas seus tipos sĂŁo gerados de qualquer maneira.

Legal, obrigado pelo teste. Vou lançå-lo um pouco mais tarde, depois que outro problema for confirmado.

Sim, nĂŁo podemos fazer muito ao ignorar o rollup. VocĂȘ deve ser capaz de excluir esses arquivos manualmente na opção exclude , mas essa Ă© uma solução pobre.

Ok, em 0.5.1 agora

funciona bem, basta configurar 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 seção

YMMV mas consegui funcionar assim ...

antes de

export type MyType = { ... };

depois de

type MyType = { ... };

export { MyType }

Para constar, acabei de chamar tsc --emitDeclarationOnly após o rollup, que substitui os arquivos de declaração na pasta de construção.
no meu package.json

"scripts": {
    "build": "rollup -c",
    "postbuild: "tsc --emitDeclarationOnly"
}
Esta pĂĄgina foi Ăștil?
0 / 5 - 0 avaliaçÔes