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
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:
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"
}
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