Rollup-plugin-typescript2: Não funciona com o plugin que contém sintaxe assíncrona / espera

Criado em 14 ago. 2018  ·  15Comentários  ·  Fonte: ezolenko/rollup-plugin-typescript2

O que acontece e porque está errado

Este plugin não funciona com o plugin que contém sintaxe assíncrona / espera causada por problema de hash de objeto e tscache.ts . Acho que é difícil corrigir o hash do objeto porque não há como detectar a função assíncrona agora. Então, há alguma alternativa sem hash de objeto?

Ambiente

Versões

  • texto datilografado: 2.8.3
  • acúmulo: 2.1.1
  • rollup-plugin-typescript2: 0.14.0

rollup.config.js

import svgr from '@svgr/rollup';
import typescript from 'rollup-plugin-typescript2';

export default {
  ...
  plugins: [
    replace({ 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV) }),
    svgr(),
    typescript({
      useTsconfigDeclarationDir: true,
    })
  ],
  ...
};

tsconfig.json

Não é relevante.

package.json

Não é relevante.

saída do plugin com verbosidade 3

[!] (rpt2 plugin) Error: Unknown object type "asyncfunction"
src/components/atoms/Icon/index.ts
Error: Unknown object type "asyncfunction"
    at Object._object (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:218:17)
    at Object._function (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:319:14)
    at Object.dispatch (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:185:30)
    at /Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:246:18
    at Array.forEach (<anonymous>)
    at Object._object (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:242:21)
    at Object.dispatch (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:185:30)
    at /Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:260:23
    at Array.forEach (<anonymous>)
    at Object._array (/Users/vwxyutarooo/Projects/kouzoh/mercari-web-jp-component/node_modules/rollup-plugin-typescript2/node_modules/object-hash/index.js:259:20)

Comentários muito úteis

Devo admitir que estou surpreso que isso não tenha sido um problema maior até agora, já que as funções assíncronas são extremamente comuns agora 😀. E é também por isso que acho que simplesmente ignorá-lo levará a uma grande quantidade de problemas de cache. O PR que enviei ao hash de objeto algum tempo atrás foi uma consequência desse mesmo problema, e eu sugeriria que você remova a dependência do hash de objeto. Estou bastante confiante de que o PR enviado há algum tempo funcionaria bem, pois corresponde ao mesmo valor fornecido na mensagem de erro e passou nos testes de unidade e resolveu os problemas neste plug-in, então fique à vontade para depender do PR em vez do pacote NPM aqui.

@vwxyutarooo , uma solução imediata é definir clean: true na configuração para ignorar o cache completamente. Como alternativa (desculpe pelo plug), criei https://github.com/wessberg/rollup-plugin-ts que também funcionará bem

Todos 15 comentários

Eu adicionei uma solução alternativa para ignorar qualquer coisa que o hash de objeto não possa processar (consulte o branch de objecthash, opção objectHashIgnoreUnknownHack ). Isso pode tornar o cache potencialmente obsoleto, portanto, não é uma boa solução a longo prazo.

@wessberg

Devo admitir que estou surpreso que isso não tenha sido um problema maior até agora, já que as funções assíncronas são extremamente comuns agora 😀. E é também por isso que acho que simplesmente ignorá-lo levará a uma grande quantidade de problemas de cache. O PR que enviei ao hash de objeto algum tempo atrás foi uma consequência desse mesmo problema, e eu sugeriria que você remova a dependência do hash de objeto. Estou bastante confiante de que o PR enviado há algum tempo funcionaria bem, pois corresponde ao mesmo valor fornecido na mensagem de erro e passou nos testes de unidade e resolveu os problemas neste plug-in, então fique à vontade para depender do PR em vez do pacote NPM aqui.

@vwxyutarooo , uma solução imediata é definir clean: true na configuração para ignorar o cache completamente. Como alternativa (desculpe pelo plug), criei https://github.com/wessberg/rollup-plugin-ts que também funcionará bem

@wessberg Sim, acho que ainda não há muitos plug-ins de rollup assíncronos em sua interface.

Você conhece uma maneira melhor de fazer hash de objetos? Preciso criar uma chave de cache baseada parcialmente no objeto de configuração de rollup (e, portanto, contendo a fonte de todos os plug-ins usados) que é passada na inicialização.

btw, para esclarecer - o problema se aplica a coisas assíncronas na própria configuração de rollup. Async no código que está sendo transpilado não é um problema, porque o código é hash com base no texto de origem.

Hmm, bem, você poderia aplicar sha1 ao resultado de JSON.stringify'ing a configuração inteira com um substituto personalizado que mapeia plug-ins para sua propriedade name que tenho certeza que é necessário.
Por exemplo, a seguinte configuração de rollup:

{
  // ...
  treeshake: true,
  plugins: [
    myPlugin1(),
    myPlugin2()
  ],
  // ...
}

Pode ser convertido na seguinte representação JSON:

{
  "treeshake": true,
  "plugins": [
    "name-of-my-plugin-1",
    "name-of-my-plugin-2"
  ]
}

E então você poderia aplicar sha1 e obter uma string base64 ou algo parecido que você poderia usar como chave de cache?

Eu estava pensando nisso, mas isso não removeria ainda mais coisas da consideração para o cache? Suspeito que object-hash foi feito especificamente porque JSON.stringify joga fora qualquer coisa que não seja uma propriedade de valor simples, array ou dicionário - não há mais nada na especificação json.

Suponho que poderia incorporar um hash de package-lock,json e equivalente de fio, se houvesse uma maneira confiável de encontrá-los. (para mitigar o efeito da opção objectHashIgnoreUnknownHack )

Obrigado pessoal discutindo sobre este assunto. Na verdade, a opção clean: true não ignora o processo de cache, por isso não está funcionando nem por um momento. No entanto, ignoreUnknown pode ser a maneira de corrigir esse problema, como diz @ezolenko . Vou esperar 0.16.2 de qualquer maneira!

@vwxyutarooo , clean: true usa uma estratégia de cache noop. Isso é o que eu lembro que o @ezolenko implementou há algum tempo. Se ele ainda tenta calcular uma chave de cache a partir da configuração de rollup, esse comportamento precisa ser examinado, em minha opinião

Não sei como isso afetou o resultado do hash do objeto, no entanto, a opção objectHashIgnoreUnknownHack no branch objecthash funciona para mim.

Refiz o cache um pouco para que clean: true nem mesmo invoque o hash de objeto e mescle tudo no mestre. Eu vou liberar em alguns dias

Em 0.17.0 agora

Para outra solução alternativa não usando o hack objectHashIgnoreUnknownHack , encontrei este problema usando rollup-plugin-require-context , e o seguinte snippet parece funcionar:

import requireContextORIGINAL from 'rollup-plugin-require-context'

const requireContext = (options) => {
  const plugin = requireContextORIGINAL(options)
  return {
    name: plugin.name,
    transform(code, id) {
      return plugin.transform(code, id)
    }
  }
}

Ou seja, fazer de transform uma função normal e retornar uma promessa.

Pensei em adicionar uma atualização para as pessoas aqui de que a causa raiz aqui foi finalmente corrigida em https://github.com/puleos/object-hash/pull/90 (muito semelhante a https://github.com/puleos/ object-hash / pull / 68 referenciado acima) e aqui em # 203. Não há necessidade de usar objectHashIgnoreUnknownHack para oferecer suporte a plug-ins assíncronos e sem mais problemas de cache - acaba de ser lançado como v0.26.0 🎉 😄

Esta página foi útil?
0 / 5 - 0 avaliações