Depois de atualizar o TS para a v3.4.2, o tempo de compilação é muito lento. Com o TS v3.3 meu projeto foi construído em ~ 20s e com o TS v3.4 leva cerca de 5 minutos.
Tentei com clean: true
, tentei adicionar typescript: require('typescript')
, tentei atualizar rollup
e todos os plug-ins relacionados. Cada vez, o mesmo resultado a compilação leva muito tempo .
Nota: quando executo tsc -p tsconfig.prod.json
diretamente, leva menos de 10 segundos para gerar o dist.
{
input: 'src/index.ts',
output: [
{ file: pkg.main, format: 'cjs' },
{ file: pkg.module, format: 'es' },
],
plugins: [
external({ includeDependencies: true }),
resolve(),
typescript({
tsconfig: './tsconfig.prod.json',
rollupCommonJSResolveHack: true,
}),
commonjs(),
filesize(),
],
}
tsconfig.json
{
"compilerOptions": {
"module": "esnext",
"target": "es5",
"jsx": "react",
"esModuleInterop": true,
"lib": ["dom", "es2017"],
"moduleResolution": "node",
"rootDir": "src",
"forceConsistentCasingInFileNames": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitAny": true,
"strictNullChecks": true,
"suppressImplicitAnyIndexErrors": true,
"noUnusedLocals": false,
"downlevelIteration": true
},
"include": ["src/**/*", "types/**/*"]
}
tsconfig.prod.json
{
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./dist",
"noUnusedLocals": true,
"sourceMap": true,
"declaration": true
},
"exclude": ["src/doc", "**/stories.tsx", "**/test.tsx", "**/fixture.ts"]
}
"rollup": "^1.6.0",
"rollup-plugin-commonjs": "^9.2.1",
"rollup-plugin-filesize": "^6.0.1",
"rollup-plugin-node-resolve": "^4.0.1",
"rollup-plugin-peer-deps-external": "^2.2.0",
"rollup-plugin-typescript2": "^0.19.2",
"typescript": "^3.4.2"
Resultado
rpt2: typescript version: 3.4.2
rpt2: tslib version: 1.9.3
rpt2: rollup-plugin-typescript2 version: 0.19.2
rpt2: plugin options:
{
"tsconfig": "./tsconfig.prod.json",
"rollupCommonJSResolveHack": true,
"clean": true,
"verbosity": 3,
"typescript": "version 3.4.2",
"check": true,
"cacheRoot": "/Users/yannpringault/git/PayFit/components/.rpt2_cache",
"include": [
"*.ts+(|x)",
"**/*.ts+(|x)"
],
"exclude": [
"*.d.ts",
"**/*.d.ts"
],
"abortOnError": true,
"useTsconfigDeclarationDir": false,
"tsconfigOverride": {},
"transformers": [],
"tsconfigDefaults": {},
"objectHashIgnoreUnknownHack": false
}
rpt2: rollup config:
{
"chunkGroupingSize": 5000,
"experimentalCacheExpiry": 10,
"inlineDynamicImports": false,
"input": "src/index.ts",
"perf": false,
"plugins": [
{
"name": "peer-deps-external"
},
{
"name": "node-resolve"
},
{
"name": "rpt2"
},
{
"name": "commonjs"
},
{
"name": "filesize"
}
]
}
rpt2: built-in options overrides: {
"noEmitHelpers": false,
"importHelpers": true,
"noResolve": false,
"noEmit": false,
"inlineSourceMap": false,
"outDir": "/Users/yannpringault/git/PayFit/components/.rpt2_cache/placeholder",
"moduleResolution": 2,
"allowNonTsExtensions": true,
"declarationDir": "/Users/yannpringault/git/PayFit/components"
}
rpt2: parsed tsconfig: {
"options": {
"module": 6,
"target": 1,
"jsx": 2,
"esModuleInterop": true,
"lib": [
"lib.dom.d.ts",
"lib.es2017.d.ts"
],
"moduleResolution": 2,
"rootDir": "/Users/yannpringault/git/PayFit/components/src",
"forceConsistentCasingInFileNames": true,
"noImplicitReturns": true,
"noImplicitThis": true,
"noImplicitAny": true,
"strictNullChecks": true,
"suppressImplicitAnyIndexErrors": true,
"noUnusedLocals": true,
"downlevelIteration": true,
"outDir": "/Users/yannpringault/git/PayFit/components/.rpt2_cache/placeholder",
"sourceMap": true,
"declaration": true,
"configFilePath": "/Users/yannpringault/git/PayFit/components/./tsconfig.prod.json",
"noEmitHelpers": false,
"importHelpers": true,
"noResolve": false,
"noEmit": false,
"inlineSourceMap": false,
"allowNonTsExtensions": true,
"declarationDir": "/Users/yannpringault/git/PayFit/components"
},
"fileNames": [
"/Users/yannpringault/git/PayFit/components/src/index.ts",
"/Users/yannpringault/git/PayFit/components/src/components/index.ts",
"/Users/yannpringault/git/PayFit/components/src/components/Alert/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Alert/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Avatar/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Avatar/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/AvatarGroup/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/AvatarGroup/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Badge/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Badge/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Button/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Button/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Checkbox/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Checkbox/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/CheckboxGroup/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/CheckboxGroup/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/DatePicker/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/DatePicker/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/DatePicker/Popin/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Dropdown/MenuContext.ts",
"/Users/yannpringault/git/PayFit/components/src/components/Dropdown/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Dropdown/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Dropdown/DropdownItem/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Dropdown/DropdownItem/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Field/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Field/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Icon/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Icon/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Input/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Input/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Layout/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Legend/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Legend/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Loader/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Loader/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/ProgressBar/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/ProgressBar/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/ProgressCircle/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/ProgressCircle/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/RadioGroup/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/RadioGroup/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Select/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Select/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Steps/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Steps/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Table/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Table/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Table/components/Body.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Table/components/Cell.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Table/components/Footer.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Table/components/Header.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Table/components/HeaderCell.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Table/components/HeaderRow.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Table/components/Limit.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Table/components/Row.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/TableGroup/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/TableGroup/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Tag/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Tag/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Text/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Toggle/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Toggle/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Tooltip/index.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/Tooltip/style.tsx",
"/Users/yannpringault/git/PayFit/components/src/components/_helpers/colors.test.ts",
"/Users/yannpringault/git/PayFit/components/src/components/_helpers/colors.ts",
"/Users/yannpringault/git/PayFit/components/src/components/_helpers/react.ts",
"/Users/yannpringault/git/PayFit/components/src/components/_helpers/string.test.ts",
"/Users/yannpringault/git/PayFit/components/src/components/_helpers/string.ts",
"/Users/yannpringault/git/PayFit/components/src/primitives/_helpers.tsx",
"/Users/yannpringault/git/PayFit/components/src/primitives/box.tsx",
"/Users/yannpringault/git/PayFit/components/src/primitives/text.tsx",
"/Users/yannpringault/git/PayFit/components/src/utils/index.ts",
"/Users/yannpringault/git/PayFit/components/src/utils/colors/index.ts",
"/Users/yannpringault/git/PayFit/components/src/utils/shadows/index.ts",
"/Users/yannpringault/git/PayFit/components/src/utils/shadows/test.ts",
"/Users/yannpringault/git/PayFit/components/src/utils/zIndex/index.ts",
"/Users/yannpringault/git/PayFit/components/types/index.d.ts",
"/Users/yannpringault/git/PayFit/components/types/modules.d.ts"
],
"typeAcquisition": {
"enable": false,
"include": [],
"exclude": []
},
"raw": {
"extends": "./tsconfig.json",
"compilerOptions": {
"outDir": "./dist",
"noUnusedLocals": true,
"sourceMap": true,
"declaration": true
},
"exclude": [
"src/doc",
"**/stories.tsx",
"**/test.tsx",
"**/fixture.ts"
],
"compileOnSave": false,
"include": [
"src/**/*",
"types/**/*"
]
},
"errors": [],
"wildcardDirectories": {
"/users/yannpringault/git/payfit/components/src": 1,
"/users/yannpringault/git/payfit/components/types": 1
},
"compileOnSave": false,
"configFileSpecs": {
"includeSpecs": [
"src/**/*",
"types/**/*"
],
"excludeSpecs": [
"src/doc",
"**/stories.tsx",
"**/test.tsx",
"**/fixture.ts"
],
"validatedIncludeSpecs": [
"src/**/*",
"types/**/*"
],
"validatedExcludeSpecs": [
"src/doc",
"**/stories.tsx",
"**/test.tsx",
"**/fixture.ts"
],
"wildcardDirectories": {
"/users/yannpringault/git/payfit/components/src": 1,
"/users/yannpringault/git/payfit/components/types": 1
}
}
}
rpt2: included:
'[
"*.ts+(|x)",
"**/*.ts+(|x)"
]'
rpt2: excluded:
'[
"*.d.ts",
"**/*.d.ts"
]'
Estou tendo o mesmo problema. Foi de 24s
para 345s
ao bater TS de 3.3.4000
para 3.4.3
Tentei reproduzir e a princípio vi uma lentidão, mas usando clean: true
e indo e voltando entre as versões datilografadas várias vezes, não vejo diferença na compilação limpa agora ...
Você poderia definir clean: true
, atualizar rtp2 para o mais recente (0.20.1 ou master) e cronometrar uma compilação várias vezes consecutivas nos ts 3.3 e ts 3.4?
@ezolenko Desculpe pela resposta tardia!
Coloquei clean: true
e atualizei rtp2 para 0.20.1
. Aqui estão os resultados:
TS 3.3.3333
build -> 18s
tsc -> 14.39s
TS 3.3.4000
build -> 17.3s
tsc -> 14.39s
TS 3.4.1
build -> 5m 25.1s
tsc -> 21.26s
TS 3.4.3
build -> 5m 52.7s
tsc -> 21.57s
Além disso, há esse problema no repositório TS que parece relacionado, mas tenho @types/styled-components
fixado em v4.1.4
portanto, não cobre meu caso.
Deixe-me saber se você precisar de mais informações.
Para me divertir, também experimentei a versão mais recente de 3.5
:
TS 3.5.0-dev.20190413
build -> 1m 23.5s
tsc -> 18.84s
Esse problema que você encontrou (https://github.com/Microsoft/TypeScript/issues/30663) e o fato de 3.5-dev ter se tornado 5 vezes mais rápido para você me faz pensar que eles fizeram algo com LanguageServer
API. Esta é a API que o rpt2 usa como parte da compilação e o que os verificadores de tipos em IDEs estão usando (é por isso que o WebStorm atinge o tempo limite, etc.).
Seu projeto pode estar usando estruturas de tipo afetadas em outro lugar, é por isso que fixar styled-components
não ajuda. E é por isso que não vejo uma grande desaceleração ao construir o próprio rpt2, por exemplo.
Acho que vamos esperar pelo lançamento final do 3.5.
a propósito, tente construir com a opção check: false
Alguém confirmou se isso foi corrigido na versão 3.5?
@ tomasro27 Não para mim, nem com 6 ( 3.6.0-dev.20190621
). Parece que <3.3 ainda é o mais rápido.
Parece que 3.5 é um pouco mais rápido, mas ainda poderia ser melhor
Existe alguma atualização sobre isso? Parece que ainda está bloqueado pelo TS?
Sim, acho que nada pode ser feito a partir deste fim. Qualquer pessoa é bem-vinda para tentar :)
+1
3.5.3 também é muito lento para nós
check: false
está funcionando muito bem.
Mas o problema é que não dá nenhum erro de compilação (se você usar o vscode, ele vai mostrar os erros 😄).
Posso fazer pelo menos check: false
quando estou trabalhando em CSS (em JS). 👍
@ezolenko , você sabe qual chamada exata de API de compilação fique mais lenta? :)
@ZilotBrombie não, tudo o que sei está neste tópico. O problema de texto datilografado que está vinculado provavelmente está relacionado, mas não é a causa direta (porque eles dizem que deveria ser corrigido no 3.5+, e aparentemente não é).
Se você tiver compilações lentas em seu projeto, verifique se ts 3.3 é realmente mais rápido se possível, talvez o problema não seja a digitação, mas outra coisa.
Tudo bem, obrigado. Se eu conseguir, isso pode ser uma parede que estou disposto a bater minha cabeça contra, por assim dizer :)
Editar: Este problema ocorre apenas para arquivos que importam componentes estilizados como parece
Além disso, a documentação do Typescript é terrível
A composição do perfil revela que a origem do problema são essas uniões extremamente grandes que os componentes estilizados possuem. O único lugar para corrigir isso é o texto digitado, a menos que haja uma maneira de obter o texto digitado para a resolução do módulo de cache (o que deveria ser).
Na verdade, não estou usando o cache de resolução de módulo na chamada nodeModuleNameResolver aqui: https://github.com/ezolenko/rollup-plugin-typescript2/blob/b7c7389dcdf168715669520128ca656d6e940111/src/index.ts#L148
Não tenho certeza se isso faz com que ts use um padrão ou não use nenhum.
Sim, eu vi aquele TODO :)
Infelizmente, a depuração do cache de resolução do módulo quando usado mostra que ele armazena em cache o rebass, mas não os componentes estilizados por algum motivo. Ele passa um cache interno para aqueles ...
Atualmente, estou no processo de migração da minha base de código C # da minha biblioteca para o TypeScript e estou usando o Rollup para empacotamento. (Eu tinha um conjunto de ferramentas C #> Haxe> JavaScript personalizado antes). Infelizmente, estou sofrendo muito com a velocidade de compilação de minha nova base de código TypeScript, o que torna o desenvolvimento bastante difícil.
Se possível, fico feliz em fornecer alguns relatórios de perfil se for possível gerá-los.
Aqui estão alguns insights do meu projeto:
Normalmente, estou usando ttypescript para fazer alguma transformação AST.
Linhas de código : ~ 50000
rollup -c rollup.config.ts : ~ 9-10sec
rollup -c rollup.config.ts -w (compilação inicial) : ~ 9-10seg
rollup -c rollup.config.ts -w (adicionando 1 alerta em 1 arquivo TS) : ~ 20seg
rollup -c rollup.config.ts -w (removendo alerta novamente) : ~ 20seg
tsc - versão : 3.8.3
tsc --project tsconfig.json : ~ 6-7sec
tsc --project tsconfig.json -w (compilação inicial) : ~ 6-7sec
tsc --project tsconfig.json -w (adicionando 1 alerta em 1 arquivo TS) : ~ 0.1-0.2sec
tsc --project tsconfig.json -w (removendo alerta novamente) : ~ 0.1-0.2sec
ttsc - versão : 3.8.3
ttsc --project tsconfig.json : ~ 7-8sec
ttsc --project tsconfig.json -w (compilação inicial) : ~ 6-7sec
ttsc --project tsconfig.json -w (adicionando 1 alerta em 1 arquivo TS) : ~ 0.1-0.2seg
ttsc --project tsconfig.json -w (removendo alerta novamente) : ~ 0.1-0.2sec
As compilações incrementais estão ativas no tsconfig.
Parece-me bastante incomum que uma compilação incremental / relógio leve o dobro do que uma compilação completa.
As coisas parecem enlouquecer no meu ambiente quando se trata de testes. Eu conectei rollup com karma e este plugin de texto digitado. Como você deve saber: cada suíte de teste recebe seu próprio pacote, o que significa que os números acima se acumulam. A memória cresce para> 2 GB com o tempo; mesmo após alguns minutos, a execução do teste não inicia de fato. Isso acontece em cada npm run test
.
Quando atinge a área "Gerando pacote para ..." na geração de teste, vejo números ridículos:
File01.test.ts contendo 1 teste simples de uma classe de analisador leva 15 segundos
File02.test.ts contendo 11 testes de análise XML precisa de 2,5 minutos
File03.test.ts nem mesmo foi concluído após 5 minutos.
Não tenho ideia de onde esse problema pode ser causado e se é realmente devido ao módulo de rollup de texto digitado, mas esse parece ser o problema mais provável com o qual estou relacionado.
Como meu repo é muito grande e complicado, não compartilhei mais detalhes sobre as configurações. Se alguém puder me orientar como coletá-los, ficarei feliz em fornecer logs / resultados de criação de perfil, etc. Tentarei configurar um novo repositório independente simples refletindo a situação geral do projeto, mas não posso prometer que o problema persistirá.
@ Danielku15 Seu principal problema é que você está migrando de C # e não de C ++ :)
Este plugin não está usando explicitamente as próprias compilações incrementais do typescript (isso não existia quando foi iniciado).
Você poderia tentar @rollup/plugin-typescript
(https://github.com/rollup/plugins/tree/master/packages/typescript), eles usam uma abordagem diferente, eu acho, e podem fornecer números diferentes.
Outra opção é fazer a compilação do texto digitado fora da cadeia de rollup (como uma etapa de pré-construção em npm ou algo assim) e alimentar o js resultante para rollup. Assistir a compilação seria interessante, embora eu ache que você pode iniciar tsc e rollup no modo de observação e se o projeto estiver configurado corretamente, ele simplesmente funcionará.
Seu principal problema é que você está migrando de C # e não de C ++
Off-Topic: Não tenho certeza se gostaria de migrar uma estrutura / biblioteca C ++ para o TypeScript. Dependendo do uso de macros e modelos (que os desenvolvedores de C ++ tendem a adorar), as coisas podem enlouquecer durante a migração 😅 Felizmente, minha base de código C # sempre foi adaptada para um estilo que permite a compilação cruzada para outras linguagens, então o resultado é bastante aceitável em uma estrutura de código . Só preciso descobrir um pouco melhor como organizar os módulos para reduzir alguma sobrecarga. 😊
Este plugin não está usando explicitamente as próprias compilações incrementais do typescript (isso não existia quando foi iniciado).
Isso é interessante, este plugin tem alguma estratégia de construção "incremental" personalizada? Isso pode explicar por que uma compilação totalmente limpa pode demorar mais do que uma mudança de fonte ao usar o relógio. A compilação do script de tipo é mais ou menos estável, é uma pena que este plugin ainda não possa utilizar as atualizações incrementais, mas acho que o tempo gasto no compilador do script de tipo é estável. Mas o tempo gasto no rollup parece variar. Só isso me explica que uma construção limpa é mais rápida do que uma mudança de código com modo de observação.
Você pode tentar @ rollup / plugin-typescript ...
Obrigado pela dica, vou tentar para ver se melhora.
Outra opção é fazer a compilação do texto digitado fora da cadeia de rollup
Eu tinha essa configuração no início, mas deixei-a cair no meio do caminho para "assistir" as compilações durante o desenvolvimento. Vou tentar novamente se conseguir conectar um pipeline com as duas ferramentas "observando" independentemente. 👍
Atualização 1: consegui configurar todo o meu ambiente de compilação e teste agora com a chamada de tsc encadeada com rollup. Eu precisava fazer meu próprio plugin de rollup para resolver os caminhos tsconfig corretamente, mas depois disso ele estava funcionando bem.
Compilação limpa: 9segs, Watch compilation: 0.5-1secs e testes via Karma + Rollup também estão rodando (a compilação leva um pouco mais de tempo, pois gera um pacote para cada suíte de teste).
Comentários muito úteis
@ezolenko Desculpe pela resposta tardia!
Coloquei
clean: true
e atualizei rtp2 para0.20.1
. Aqui estão os resultados:TS 3.3.3333
TS 3.3.4000
TS 3.4.1
TS 3.4.3
Além disso, há esse problema no repositório TS que parece relacionado, mas tenho
@types/styled-components
fixado emv4.1.4
portanto, não cobre meu caso.Deixe-me saber se você precisar de mais informações.
Para me divertir, também experimentei a versão mais recente de
3.5
:TS 3.5.0-dev.20190413