【问题标题】:How to move css links to the bottom of the html document with webpack?如何使用 webpack 将 css 链接移动到 html 文档的底部?
【发布时间】:2019-07-12 09:21:22
【问题描述】:

我的 webpack 目前正在设置的方式,它将 css 资源链接放在文档的头部,这会阻止我的初始内容的呈现。

例子:

<head>
   <link href="main.28396255e7678a2cdf3c.css" rel="stylesheet">
</head>

因此,我想将它们移动到文档底部,就在 &lt;/body&gt; 之前。

有没有办法配置我已经拥有的东西来实现这一点,或者有没有我找不到的插件?

这是我的一些 webpack 配置:

{{
  entry: {
    app: [
      './styles/main.scss',
    ]
  },
  module: {
    rules: [
      {
        test: /main.scss$/,
        use: [
          {loader: MiniCssExtractPlugin.loader, options: {hmr: isActiveDevelopment}},
          'css-loader?sourceMap',
          {loader: 'postcss-loader', options: {sourceMap: true, ident: 'postcss', plugins: () => [postcssPresetEnv({browsers: 'last 20 versions'})]}},
          'sass-loader?sourceMap',
          'import-glob',
        ],
      },
    ]
  },
  plugins: removeEmpty([
    new MiniCssExtractPlugin({
      filename: ifOptimized('[name].[chunkhash].css', '[name].css'),
    }),
    new HtmlWebpackPlugin({
      template: './app.ejs',
      filename: indexHtml,
      chunksSortMode: (a, b) => scriptsOrder.indexOf(a.names[0]) > scriptsOrder.indexOf(b.names[0]),
      env: {isProd, isWeb, isHybrid},
      config: createConfig(ifWeb, ifHybrid, ifProd, ifDev)
    })
  ])
};


这是我的 html(ejs) 模板,以防万一:

<!DOCTYPE html>
<html lang="en" class="noOverflow">
<head>
    <meta charset="UTF-8">
    <title>title</title>
    <meta name="description" content="description">
    <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover" />
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
    <meta name="format-detection" content="telephone=no">
    <% if (htmlWebpackPlugin.options.env.isWeb) { %>
    <link rel="manifest" href="/manifest.json">
    <base href="/">
    <% } else if (htmlWebpackPlugin.options.env.isHybrid) { %>
    <script type="text/javascript" src="cordova.js"></script>
    <% } %>
</head>
<body>
<noscript>How do we put this.. Your browser does not support JavaScript o_O</noscript>
<% if (htmlWebpackPlugin.options.env.isWeb) { %>
<%- require('!html-loader!./splash/splash.html') %>
<% } %>
<link href="https://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700&subset=cyrillic" rel="stylesheet">
<link rel="preload" href="<%- htmlWebpackPlugin.options.config.staticUrl %>/common/mk" as="fetch" type="application/json" crossorigin>
<link href="<%- htmlWebpackPlugin.files.chunks.app.css[0] %>" rel="stylesheet">
</body>
</html>

【问题讨论】:

  • 这样所有样式的转移,对页面的显示效果不好。阅读更多关于关键风格的服务工作者,您可以使用它缓存文件,如 css、图像、图标等等 -> look。您可以使用 critical-webpack-plugin 来优化 css。使用 loadCSS 插件放置不重要的代码和链接以这种方式放置 &lt;link rel="preload "href="path/to/mystylesheet.css" as="style" onload="this.rel='stylesheet'"&gt; -> look
  • @GrzegorzT。你能链接你所指的 loadCSS 插件吗?
  • 最后一个“look”链接指向描述如何使用它的地方以及指向插件的链接。
  • @GrzegorzT。理想情况下,我会编辑我的 webpack 配置来实现我所需要的。 loadCss 然而,它不是一个 webpack 插件,所以它需要手动工作。你知道封装它的 webpack 插件吗?
  • 查看HtmlWebpackPlugin 的文档,您有预加载插件、内联样式等等。

标签: webpack webpack-4 css-loader html-webpack-plugin


【解决方案1】:

首先,我很好奇你的意图。根据提供的示例代码,您似乎主要关心的是仅转换 SCSS 文件,并能够将结果放入 HTML 文件中。如果这就是你所关心的,我建议阅读this article。那里可能有更好的文章,但它在 Google 上排名最高,所以你去吧。

如果您的示例代码为了简洁而被精简 - 或者您只是想使用 Webpack 转译单个 SCSS 文件 - 我建议您阅读插件的 documentation for the options

但是基于your comment here,以及您打开此问题的事实,我感觉您不想阅读文档 - 所以,inject 属性似乎是您需要设置的到false

true || 'head' || 'body' || false

将所有资产注入给定的templatetemplateContent。当传递true'body' 时,所有的javascript 资源将被放置在body 元素的底部。 'head' 会将脚本放在 head 元素中

inject设置为false时如何访问文件的示例可以在here, in their examples folder找到。

【讨论】:

  • 请不要揣测,专注于我的查询。我在转换 scss 文件时没有问题。所以我尝试了你的建议,并通过了inject: false,但这阻止了app.ejs 模板中引用任何资产。您还有什么建议吗?
  • 看来你没有明白我的意思。我不是在猜测,如果您想要做的只是转译 SCSS(基于您为我们提供的代码),我会为您建议一个更简单的解决方案。有比使用 WP 更简单的方法。此时,您的模板似乎很好,并且根据文档,设置 truebody 应该可以满足您的要求。也就是说,我被引导相信其他地方有什么东西。我建议你整理一个简单的 repo 来展示这个问题。然后我自己或其他人可以更准确地解决问题。另外,发布您生成的 HTML。
  • 为了更好地衡量,我在原始回复的底部添加了额外的一行。
【解决方案2】:

对于任何搜索的人,请尝试 this plugin,它会将您的样式表放在底部,并将 rel="preload" 属性放在一边

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 2012-02-07
    • 2021-10-10
    • 2015-03-28
    • 1970-01-01
    相关资源
    最近更新 更多