Webpack 不加载 Vue 的单文件组件 CSS

Dan*_*l L 5 webpack vue.js webpack-dev-server vue-component

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

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

源代码/索引.html

<html>
<head>
    <title>Vue Hello World</title>
</head>
<body>
    <h1>Header</h1>
    <div id="app"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

源代码/你好.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>
Run Code Online (Sandbox Code Playgroud)

源代码/main.js

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

new Vue({
    el: '#app',
    render: h => h(Hello),
  });
Run Code Online (Sandbox Code Playgroud)

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(),
  ]
};
Run Code Online (Sandbox Code Playgroud)

MvR*_*ens 23

我只是花了最后 4 个小时来解决这个问题。我只想使用 Webpack,因为它比 Vue CLI 更好地集成到我的 Gulp 管道中。不确定您使用的是哪个版本的 css-loader 以及是否是相同的原因,但希望这也能帮助您。

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

{
  loader: 'css-loader',
  options: {
    esModule: false
  }
}
Run Code Online (Sandbox Code Playgroud)

我使用具有相同问题的 SCSS,但对于您的示例,它将是:

{ test: /\.css$/, exclude: /node_modules/, use: ['vue-style-loader', { loader: 'css-loader', options: { esModule: false }}]}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 太棒了,这节省了我很多时间!谢谢 :) (2认同)

sei*_*luv 9

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

使用 style-loader 而不是 vue-style-loader

正如这里所建议的。

use: ['style-loader', 'css-loader']
Run Code Online (Sandbox Code Playgroud)

基本上升级到 css-loader 4.xx + 不能很好地与 vue-style-loader 配合使用。

或者

禁用 css-loader 的 esModule 选项

MvRens的解决方案也是有效的,并由github 上的此评论确认。

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