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?
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,
})
],
...
};
Não é relevante.
Não é relevante.
[!] (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)
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 🎉 😄
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