为什么我无法使用Webpack编译SASS?

Ped*_*roD 25 webpack vue.js webpack-dev-server webpack-style-loader sass-loader

我的Webpack配置中有以下模块:

module: {
    preLoaders: [
      {
        test: /\.vue$/,
        loader: 'eslint',
        include: projectRoot,
        exclude: /node_modules/
      },
      {
        test: /\.js$/,
        loader: 'eslint',
        include: projectRoot,
        exclude: /node_modules/
      }
    ],
    loaders: [
      {
        test: /\.vue$/,
        loader: 'vue'
      },
      {
        test: /\.js$/,
        loader: 'babel',
        include: projectRoot,
        exclude: /node_modules/
      },
      {
        test: /\.json$/,
        loader: 'json'
      },
      {
        test: /\.html$/,
        loader: 'vue-html'
      },
      {
        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
        loader: 'url',
        query: {
          limit: 10000,
          name: utils.assetsPath('img/[name].[hash:7].[ext]')
        }
      },
      {
        test: /\.scss$/,
        loaders: ['style', 'css', 'sass']
      },
      {
        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
        loader: 'url',
        query: {
          limit: 10000,
          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
        }
      }
    ]
  },
Run Code Online (Sandbox Code Playgroud)

你可以看到我正在使用sass-loader,对于*.scss文件,我正在定义这个管道:['style', 'css', 'sass'].

然后我有我的scss文件:

html {
  height: 100%;
}

body {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100%;
}

(...)
Run Code Online (Sandbox Code Playgroud)

最后,我有我的HTML页面(来自vue.js的VUE文件),它导入了该scss文件:

<script>

require('./styles/main.scss')

(...)

</script>
Run Code Online (Sandbox Code Playgroud)

但不知何故,我在启动项目时遇到此错误:

ERROR in ./~/css-loader!./~/sass-loader!./~/style-loader!./~/css-loader!./~/sass-loader!./src/styles/main.scss
Module build failed:
html {
^
      Invalid CSS after "...load the styles": expected 1 selector or at-rule, was "var content = requi"
      in /Users/td/uprank/src/styles/main.scss (line 1, column 1)
 @ ./src/styles/main.scss 4:14-247 13:2-17:4 14:20-253
Run Code Online (Sandbox Code Playgroud)

为什么管道错了?(似乎webpack正在尝试处理['css', 'sass', 'style', 'css', 'sass']而不是仅仅['style', 'css', 'sass']在模块中配置.

我究竟做错了什么?

谢谢!

编辑:链接到完整的示例项目:https://dl.dropboxusercontent.com/u/1066659/dummy.zip

Tay*_*ser 32

之所以发生这种情况,是因为Vue会自动为CSS,SASS/SCSS,Stylus生成加载程序配置.

(见projectRoot/build/utils.js~10到~50行)

所以你看到错误是因为你有一个webpack加载器试图导入文件,然后Vue试图导入(已经加载的)文件.因此,您可以将装载机链视为sass -> css -> style -> sass -> css -> vue-style

为了解决这个问题,你必须摆脱你添加的加载器:

{
  test: /\.scss$/,
  loaders: ['style', 'css', 'sass']
},
Run Code Online (Sandbox Code Playgroud)

并只依靠提供的装载机.

您可以通过以下两种方式之一加载样式表:

注意:您必须使用scss而不是sass,因为sass将尝试使用缩进语法而不是括号语法来解析样式表.

1:

<style lang="scss">
  @import './styles/main.scss
</style>
Run Code Online (Sandbox Code Playgroud)

2:

<style src="./styles/main.scss"></style>
Run Code Online (Sandbox Code Playgroud)

这两个都将导入样式表,后者只是阻止您向组件添加任何其他样式.

  • 最后一段的快速附录:你可以在.vue组件中使用多个`<style>`标签,所以虽然你不能用`src`属性添加任何CSS规则到标签,你可以添加第二个标签并放置它们在那里. (3认同)