【问题标题】:Webpack not loading Vue's single file components CSSWebpack 不加载 Vue 的单文件组件 CSS
【发布时间】:2023-03-15 22:48:02
【问题描述】:

Webpack 正在编译单个文件组件但不加载 CSS。 HTML 和 Vue 正确呈现,但没有 CSS。这似乎是 webpack 配置的问题。知道有什么问题吗?

我正在使用webpack-dev-server 加载开发服务器。

src/index.html

<html>
<head>
    <title>Vue Hello World</title>
</head>
<body>
    <h1>Header</h1>
    <div id="app"></div>
</body>
</html>

src/Hello.vue

<template>
  <p>{{ greeting }} Test!</p>
</template>

<script>
module.exports = {
  data : function () {
      return {
          greeting: 'Hello'
        }
    }
}
</script>

<style scoped>
  p {
    font-size: 18px;
    font-family: 'Roboto', sans-serif;
    color: blue;
  }
</style>

src/main.js

import Vue from 'vue';
import Hello from './Hello.vue';

new Vue({
    el: '#app',
    render: h => h(Hello),
  });

webpack.config.js

const HtmlWebpackPlugin = require('html-webpack-plugin');
const VueLoaderPlugin = require('vue-loader/lib/plugin');

module.exports = {
  entry: './src/main.js',
  module: {
    rules: [
      { test: /\.js$/,  exclude: /node_modules/, use: 'babel-loader' },
      { test: /\.vue$/, exclude: /node_modules/, use: 'vue-loader' },
      { test: /\.css$/, exclude: /node_modules/, use: ['vue-style-loader', 'css-loader']},
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: './src/index.html',
    }),
    new VueLoaderPlugin(),
  ]
};

【问题讨论】:

  • 有什么理由不使用 Vue CLI?
  • 根据the documentation,作用域 CSS 是通过使用 PostCSS 实现的。考虑到这一点,你有configured PostCSS吗?
  • 我认为 postCSS 不是问题,我已经通过 npm 添加它并添加到 webpack css 链中,但仍然无法正常工作。它必须与 webpack 配置有关,因为在运行 vue-cli-service 时它确实有效。我没有使用 Vue CLI,因为当你初始化一个项目时,它会添加很多包和复杂的配置。启动一个简单的“Hello World”项目应该更容易。
  • 虽然我不同意您对 Vue CLI 的分析,但我尊重您的意见。您可以尝试的一件事是使用 Vue CLI 设置一个空项目,然后运行 ​​vue inspect &gt; config.js 转储生成的 Webpack 配置。那么至少你可以看到你错过了什么
  • 就像一个注释...今天postcss@vue/compiler-sfc 捆绑在一起,而您不需要完全需要配置它来获得vue-loader 的作用域CSS .

标签: vue.js webpack vue-component webpack-dev-server


【解决方案1】:

我刚刚花了最后 4 个小时才弄清楚这一点。我只想使用 Webpack,因为它比 Vue CLI 更好地集成到我的 Gulp 管道中。不确定您使用的是什么版本的 css-loader 以及是否是相同的原因,但希望这也对您有所帮助。

TL;DR:不仅仅是“css-loader”,使用:

{
  loader: 'css-loader',
  options: {
    esModule: false
  }
}

我使用的 SCSS 也有同样的问题,但对于你的例子来说:

{ test: /\.css$/, exclude: /node_modules/, use: ['vue-style-loader', { loader: 'css-loader', options: { esModule: false }}]}

我不确定这是一个正确的解决方案还是只是一种解决方法。我发现了这一点,因为我以前有一个旧项目,但是一旦我升级了所有软件包,它就失败了。最终我追查到 css-loader,更新前是 2.1 版,更新后是 4.3 版。它工作到 3.6 版,然后在 4.0 版失败。然后我只是尝试切换各种选项,这就是修复它的选项(我从未声称知道我在做什么;-))。

编辑:seiluv 在 vue-style-loader 的 Github 上添加了指向 comment 的链接,确认这是一种解决方法。它显然是一个月前发布的,但我在寻找答案时没有找到它。谢谢seiluv!

【讨论】:

  • 太棒了,这为我节省了很多时间!谢谢:)
  • 我正在拔头发,这很好地解决了问题!
【解决方案2】:

我遇到了同样的问题,所以要么:

使用 style-loader 代替 vue-style-loader

按照here的建议。

use: ['style-loader', 'css-loader']

基本上升级到 css-loader 4.x.x + 并不能很好地与 vue-style-loader 一起使用。

禁用 css-loader 的 esModule 选项

MvRens 的解决方案同样有效 并由 github 上的 comment 确认。

问题是css-loader的esModule默认设置为true,在这种情况下应该为false。

【讨论】:

    【解决方案3】:

    除了以上两个答案,这里总结一下可能的解决方案包括新的一个——sideEffects。如果有人可以改进,请编辑列表。

    可能的解决方案

    【讨论】:

    • 很高兴成为第一个为您投票的人。提到副作用对我来说至关重要!谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-09-17
    • 2018-12-21
    • 2021-03-12
    • 1970-01-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    相关资源
    最近更新 更多