webpack - 如何在 NextJS 项目的 head 标签中内联 CSS?

标签 webpack next.js

我的 NextJS 项目具有以下 Webpack 配置:

import path from 'path';
import glob from 'glob';
import ExtractTextPlugin from 'extract-text-webpack-plugin';
import webpack from 'webpack';
import dotenv from 'dotenv';
import OptimizeCSSAssetsPlugin from 'optimize-css-assets-webpack-plugin';

import withSass from '@zeit/next-sass';

dotenv.config();

module.exports = withSass({
  distDir: '.build',
  webpack: (config, { dev, isServer }) => {
    if (isServer) {
      return config;
    }
    config.plugins.push(
      new webpack.optimize.LimitChunkCountPlugin({
        maxChunks: 1,
      }),
    );
    config.optimization.minimizer.push(
      new OptimizeCSSAssetsPlugin({}),
    );
    return config;
  },
});

这使我可以在任何页面中导入任意数量的 scss 文件,并将它们全部捆绑在一起,缩小为单个文件,然后提供:
<link rel="stylesheet" href="/_next/static/css/styles.84a02761.chunk.css">

但是,而不是 <link> ,我非常希望将样式定义内联到我的 <head> 中。标记为 <style></style> .是否有可能不堆积大量第三方模块?

如果没有,是否至少可以更改结果 <link>relpreload来自 stylesheet并添加添加 as="style" crossorigin要吗?

最佳答案

我通过稍微调整 pages/_document.jsx 成功地内联了我的 CSS。文件。我扩展了<Head>组件原生提供 下一个JS 并将其添加到我的自定义文档标记中。这是我修改的部分表示:

import { readFileSync } from 'fs';
import { join } from 'path';

class InlineStylesHead extends Head {
  getCssLinks() {
    return this.__getInlineStyles();
  }

  __getInlineStyles() {
    const { assetPrefix, files } = this.context._documentProps;
    if (!files || files.length === 0) return null;

    return files.filter(file => /\.css$/.test(file)).map(file => (
      <style
        key={file}
        data-href={`${assetPrefix}/_next/${file}`}
        dangerouslySetInnerHTML={{
          __html: readFileSync(join(process.cwd(), '.build', file), 'utf-8'),
        }}
      />
    ));
  }
}

class MyDocument extends Document {
  render() {
    return (
      <Html lang="en" dir="ltr">
        <InlineStylesHead>
          <meta name="theme-color" content="#ffcc66" />
        </InlineStylesHead>
        <body>
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
}

我将此解决方案归功于 https://github.com/zeit/next-plugins/issues/238#issuecomment-432211871 .

关于webpack - 如何在 NextJS 项目的 head 标签中内联 CSS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57057947/

相关文章:

reactjs - 带有 React Hot Loader 的 Webpack 开发服务器

typescript - 如何让热模块重新加载以在 typescript monorepo 中工作

javascript - 使用 webpack,我可以将 Node.js 和浏览器代码放在同一个文件中,但阻止 Node.js 代码进入浏览器吗?

node.js - 您可以在 Next.js API 中保持 PostgreSQL 连接处于事件状态吗?

node.js - 如何让webpack使用父目录中的共享 Node 模块

node.js - 使用react和next.js时找不到fs模块的错误如何解决

next.js - 从 nextjs Link 组件传递数据并在 getStaticProps 中使用它

reactjs - fsevents@2.3.2 安装问题的平台不受支持

reactjs - 使用 NextJS + Express 在本地主机上使用 HTTPS

javascript - 忽略 Webpack 中的特定 require()s?