Jsdom: 'Erro: não foi possível analisar a folha de estilo CSS' desde 11.6.x

Criado em 26 mar. 2018  ·  13Comentários  ·  Fonte: jsdom/jsdom

Informação básica:

  • Versão Node.js: 8.9.1
  • versão jsdom: 11.6.2

Estou recebendo este erro depois de atualizar de 11.5.1 para 11.6.2 no CSS sweetalert2, ao montar um componente Vue durante uma execução de teste vue-test-utils mocha-webpack. (que usa JSDOM)
Avise-me se puder fornecer mais detalhes; não tenho certeza de como depurar isso.

Error: Could not parse CSS stylesheet
    at exports.createStylesheet (node_modules/jsdom/lib/jsdom/living/helpers/stylesheets.js:35:21)
    at HTMLStyleElementImpl._updateAStyleBlock (node_modules/jsdom/lib/jsdom/living/nodes/HTMLStyleElement-impl.js:68:5)
    at HTMLStyleElementImpl._childTextContentChangeSteps (node_modules/jsdom/lib/jsdom/living/nodes/HTMLStyleElement-impl.js:37:12)
    at HTMLStyleElementImpl.insertBefore (node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:225:14)
    at HTMLStyleElementImpl.insertBefore (node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:202:14)
    at HTMLStyleElementImpl.appendChild (node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:327:17)
    at HTMLToDOM._parseWithParse5 (node_modules/jsdom/lib/jsdom/browser/htmltodom.js:60:21)
    at HTMLToDOM._doParse (node_modules/jsdom/lib/jsdom/browser/htmltodom.js:47:42)
    at HTMLToDOM.appendToNode (node_modules/jsdom/lib/jsdom/browser/htmltodom.js:37:17)
    at setInnerHTML (node_modules/jsdom/lib/jsdom/living/nodes/Element-impl.js:40:25)
    at HTMLStyleElementImpl.set innerHTML [as innerHTML] (node_modules/jsdom/lib/jsdom/living/nodes/Element-impl.js:211:5)
    at HTMLStyleElement.set [as innerHTML] (node_modules/jsdom/lib/jsdom/living/generated/Element.js:874:29)
    at node_modules/sweetalert2/dist/sweetalert2.all.js:1978:1
    at Object.<anonymous> (node_modules/sweetalert2/dist/sweetalert2.all.js:1978:1)
[snip]

Caso de reprodução mínima

const { JSDOM } = require("jsdom");

const options = {
    runScripts: "dangerously",
    resources: "usable"
};
const dom = new JSDOM(`
<html>
    <head>
        <link href="https://cdnjs.cloudflare.com/ajax/libs/limonte-sweetalert2/7.18.0/sweetalert2.css" rel="stylesheet" type="text/css" media="all">
    </head>
</html>
`, options);
css

Comentários muito úteis

@jktravis Acabei de adicionar isso à minha configuração de teste por enquanto :)
// Prevent a lot of "[vuex] unknown mutation type .." logs during tests const _ = require('lodash') const originalConsoleError = console.error console.error = function(msg) { if(_.startsWith(msg, '[vuex] unknown')) return if(_.startsWith(msg, 'Error: Could not parse CSS stylesheet')) return originalConsoleError(msg) }

Todos 13 comentários

Infelizmente, isso não segue o modelo de problema, portanto, não podemos ajudar. Sinta-se à vontade para editar o OP para fazê-lo, deixe um comentário e podemos reabri-lo.

@domenic atualizado

Perfeito, obrigado!

Infelizmente, parece que isso se deve ao fato de a folha de estilo usar recursos (legítimos) que nosso analisador CSS não suporta. Dado o analisador atual de jsdom, isso resulta em nós descartando a folha de estilo inteira e dando a você um aviso no console.

Não há muito que você possa fazer aqui. Se você achar esta mensagem feia, você pode suprimi-la (e outras mensagens semelhantes) usando as técnicas em https://github.com/jsdom/jsdom#virtual -consoles (este é um "jsdomError" ). A solução de longo prazo é conseguir um analisador CSS melhor, mas isso é muito difícil.

Como solução intermediária, talvez investigue como tornar a mensagem mais expressiva? (Imprime apenas o CSS que não pôde ser analisado?) Dessa forma, a pessoa ficaria mais inclinada a olhar para a adição de suporte para esse recurso CSS específico. No momento, não tenho ideia do que está causando isso.
A menos que você vá mudar para um analisador CSS de terceiros e não queira construir este.

Infelizmente, não obtemos essas informações do nosso analisador CSS :(. E o nosso analisador CSS não é muito bem mantido, por isso não é fácil adicionar suporte para recursos a ele :(. @Zirro tinha um projeto para substitua-o completamente em https://github.com/Zirro/css-object-model, mas nunca foi concluído ...

@domenic Tenho exatamente o mesmo problema, em que meu css é despejado em meu terminal quando estou executando meus testes de AVA. Gostaria de suprimir os erros jsdom como você sugeriu, mas não tenho certeza de onde o código a seguir deve ir (tentei no meu arquivo index.test.js, mas não o está suprimindo):

`const jsdom = require (" jsdom ");
const {JSDOM} = jsdom;

const virtualConsole = new jsdom.VirtualConsole ();
const dom = new JSDOM (` , { virtualConsole });

Alguma ideia de onde isso deve ir? Obrigado

Eu não sei nada sobre ava, desculpe.

@aphofstede Você

@jktravis Acabei de adicionar isso à minha configuração de teste por enquanto :)
// Prevent a lot of "[vuex] unknown mutation type .." logs during tests const _ = require('lodash') const originalConsoleError = console.error console.error = function(msg) { if(_.startsWith(msg, '[vuex] unknown')) return if(_.startsWith(msg, 'Error: Could not parse CSS stylesheet')) return originalConsoleError(msg) }

eu uso o VirtualConsole, mas esse erro ainda acontece

e no meu ambiente, tenho algum motivo, então não uso https://github.com/jsdom/jsdom/issues/2177#issuecomment -426825829

espero uma opção para ignorar este erro

const jsdom = await JSDOM.fromURL(`http://127.0.0.1:${rootOptions.server.port}${route}`, {
                            resources: 'usable',
                            runScripts: 'dangerously',
                            // @ts-ignore
                            pretendToBeVisual: true,
                            includeNodeLocations: true,

                            referrer,

                            VirtualConsole: virtualConsole,
                        });
2:59:38 PM: Error: Could not parse CSS stylesheet
2:59:38 PM:     at Object.exports.createStylesheet (/opt/build/repo/node_modules/prerenderer-renderer-jsdom/node_modules/jsdom/lib/jsdom/living/helpers/stylesheets.js:34:21)
2:59:38 PM:     at onStylesheetLoad (/opt/build/repo/node_modules/prerenderer-renderer-jsdom/node_modules/jsdom/lib/jsdom/living/helpers/stylesheets.js:74:13)
2:59:38 PM:     at onLoadWrapped (/opt/build/repo/node_modules/prerenderer-renderer-jsdom/node_modules/jsdom/lib/jsdom/browser/resources/per-document-resource-loader.js:53:33)
2:59:38 PM:     at Object.check (/opt/build/repo/node_modules/prerenderer-renderer-jsdom/node_modules/jsdom/lib/jsdom/browser/resources/resource-queue.js:76:23)
2:59:38 PM:     at /opt/build/repo/node_modules/prerenderer-renderer-jsdom/node_modules/jsdom/lib/jsdom/browser/resources/resource-queue.js:119:14
2:59:38 PM:     at processTicksAndRejections (internal/process/task_queues.js:89:5) <strong i="11">@import</strong> url(https://fonts.googleapis.com/css?family=M+PLUS+Rounded+1c);<strong i="12">@import</strong> url(https://fonts.googleapis.com/css?family=Audiowide);@-moz-keyframes shake{59%{margin-left:0}60%,80%{margin-left:2px}70%,90%{margin-left:-2px}}@-webkit-keyframes shake{59%{margin-left:0}60%,80%{margin-left:2px}70%,90%{margin-left:-2px}}@-o-keyframes shake{59%{margin-left:0}60%,80%{margin-left:2px}70%,90%{margin-left:-2px}}<strong i="13">@keyframes</strong> shake{59%{margin-left:0}60%,80%{margin-left:2px}70%,90%{margin-left:-2px}}.black{background-color:#000!important;border-color:#000!important}.black--text{color:#000!important;caret-color:#000!important}.white{background-color:#fff!important;border-color:#fff!important}.white--text{color:#fff!important;caret-color:#fff!important}.transparent{background-color:transparent!important;border-color:transparent!important}.transparent--text{color:transparent!important;caret-color:transparent!important}.red{background-color:#f44336!important;border-color:#f44336!important}.red--text{color:#f44336!important;caret-color:#f44336!important}.red.lighten-5{background-color:#ffebee!important;border-color:#ffebee!important}.red--text.text--lighten-5{color:#ffebee!important;caret-color:#ffebee!important}.red.lighten-4{background-

Está tendo o mesmo problema aqui - ainda sem resolução?

Esta solução alternativa funciona para mim.

const virtualConsole = new jsdom.VirtualConsole();
virtualConsole.sendTo(console, { omitJSDOMErrors: true });
virtualConsole.on("jsdomError", (err) => {
    if (err.message !== "Could not parse CSS stylesheet") {
        console.error(err);
    }
});
Esta página foi útil?
0 / 5 - 0 avaliações