为什么我从 PostCSS 构建中收到 CssSyntaxError: <css input> ?

Mal*_*lio 2 postcss next.js google-fonts

我正在做我认为标准的 Next.js 构建。它在开发模式下工作正常,但当我尝试获得生产版本时,我得到:

\n
(node:39333) UnhandledPromiseRejectionWarning: CssSyntaxError: <css input>:17:20: Missed semicolon\nat Input.error (/node_modules/next/node_modules/postcss/lib/input.js:129:16)\n
Run Code Online (Sandbox Code Playgroud)\n

但奇怪的是:我没有\xe2\x80\x99t 有任何CSS。

\n

实际上,我有一些 CSS,但我将其全部删除以找出问题所在。不用找了。

\n

Mal*_*lio 7

经过一个小时左右的沮丧之后,我做了我应该在前 10 分钟内完成的事情,并编辑了文件postcss/lib/input.js以打印出有问题的 CSS,结果让我大吃一惊。让我按照事件发生的顺序来描述事件的顺序,而不是我发现它们的顺序。

\n

几天前,我收到了设计师发来的 HTML 文件,其中包含她想要的布局。在 中<head>,有一些<link>她选择的字体的 s,包括:

\n
<link\n        href="https://fonts.googleapis.com/css?family=FontAwesome"\n        rel="stylesheet"\n  />\n
Run Code Online (Sandbox Code Playgroud)\n

我没有\xe2\x80\x99t注意到(显然设计者也没有\xe2\x80\x99t)是没有这样的字体系列(FontAwesome是字体工具包的名称),我尽职地将这一行复制到我的React中代码。Next.js 和浏览器解决了这个问题。

\n

PostCSS 没有。相反,当尝试生产构建时,它尝试解析Google 发送的错误页面。

\n

不幸的是,你知道,错误页面只是一个错误页面。谷歌没有人对其严格的标准合规性进行审查。果然,在顶部附近我发现:

\n
     body {\n       background: 100% 5px no-repeat;\n       margin-top: 0;\n       max-width: none:\n
Run Code Online (Sandbox Code Playgroud)\n

最后的冒号应该是分号。当然,删除指向不存在字体的无用链接解决了问题。

\n

现在我不知道该怪谁:

\n
    \n
  • Google 在错误页面上出现语法错误
  • \n
  • 谷歌没有对其错误页面进行检查
  • \n
  • Google 在找不到字体时返回 400 而不是 404
  • \n
  • PostCSS 用于尝试解析错误页面(我不知道 400/404 的事情是否混淆了它,但仍然如此)
  • \n
  • PostCSS 给出如此晦涩的错误消息
  • \n
  • 设计师给了我一个糟糕字体的链接
  • \n
\n

因为,你知道我并没有责怪自己......

\n


小智 5

对于仍然无法理解问题或找出错误所在的人,请检查是否有任何链接,例如

<link
        href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap"
        rel="stylesheet"
      />
Run Code Online (Sandbox Code Playgroud)

请确保你的权重按升序排列,否则谷歌会抛出400错误,并且 PostCSS 仍然显示相同的错误