7

使用 Webpack 2sass-loader 4.11

webpack --config webpack.config.js

在此处输入图像描述

这是我的 webpack.config.js

var path = require('path');
var sass = require("./sass/lifeleveler.scss");

module.exports = {
    entry: './dist/main.js',
    output: {
        filename: 'lifeleveler.app.js',
        path: path.resolve(__dirname, 'dist')
    },
    watch: true,
    watchOptions: {
        aggregateTimeout: 300,
        poll: 1000,
        ignored: /node_modules/
    },
    module: {
        loaders: [
            {
                test: /\.scss$/,
                include: [
                    path.resolve(__dirname, 'node_modules'),
                    path.resolve(__dirname, './sass')
                ],
                loaders: ["style-loader", "css-loader", "sass-loader"]
            }
        ],
        rules: [
            {
                test: /\.tsx?$/,
                loader: 'ts-loader',
                exclude: /node_modules/,
            },
            {
                enforce: 'pre',
                test: /\.tsx?$/,
                use: "source-map-loader"
            }
        ]
    },
    sassLoader: {
        includePaths: [path.resolve(__dirname, "./sass")]
    },
    resolve: {
        modulesDirectories: ['./sass'],
        extensions: [".tsx", ".ts", ".js", "scss"]
    },
    devtool: 'inline-source-map'
};

请注意,当我在配置顶部尝试此操作时:

var css = require("!raw-loader!sass-loader!./sass/lifeleveler.scss");
var css = require("!css-loader!sass-loader!./sass/lifeleveler.scss");

得到这个错误:

错误:找不到模块'!raw-loader!sass-loader!./sass/lifeleveler.scss'

这就是我选择这个的原因:var sass = require("./sass/lifeleveler.scss");


还有我的 lifeleveler.scss 文件(来自我的 SASS 项目入门工具包):

@import "vendors/normalize";    // Normalize stylesheet
@import "vendors/reset";        // Reset stylesheet
@import "modules/base";         // Load base files
@import "modules/defaults";     // Defaults elements
@import "modules/inputs";       // Inputs & Selects
@import "modules/buttons";      // Buttons
@import "modules/layout";       // Load Layouts
@import "modules/svg";          // Load SVG
@import "modules/queries";      // Media Queries

最后是我的文件夹结构,您是否看到任何明显的问题?

在此处输入图像描述

我在这里找到了这个解决方案,但是我将我的./sass路径添加到了modulesDirectories数组中,但仍然出现错误。

经过更多挖掘后,我还在这里找到了这个 Github 问题和解决方案,但他的修复对我也不起作用:(

4

2 回答 2

10

我在这里重现了您的问题并能够解决它。

首先,您需要更改您的 webpack 配置文件。几点:

  1. 将你的scss加载器放在rules选项中,并将每个加载器分成一个对象(像这样);
  2. 摆脱var sass = require("./sass/lifeleveler.scss");配置顶部的行。应该从您的入口点 JS 调用该文件。在这种情况下:dist/main.js。此时(在阅读配置之前),webpack 没有被配置为加载任何东西。这导致了您显示的错误。
  3. 摆脱sassLoader.includePathsand resolve.modulesDirectories,因为它们不是有效的webpack 2密钥。

Webpack 2配置结构与Webpack 1有点不同(您可以在此处查看官方迁移指南)..

工作webpack.config.js文件将是这样的:

var path = require('path');


module.exports = {
    entry: './dist/main.js',
    output: {
        filename: 'lifeleveler.app.js',
        path: path.resolve(__dirname, 'dist')
    },
    watch: true,
    watchOptions: {
        aggregateTimeout: 300,
        poll: 1000,
        ignored: /node_modules/
    },
    module: {
        rules: [
            {
                test: /\.scss$/,
                include: [
                    path.resolve(__dirname, "sass")
                ],             
                use: [
                     { loader: "style-loader" },
                     { loader: "css-loader" },
                     { loader: "sass-loader" }
                ]
            },
            {
                test: /\.tsx?$/,
                loader: 'ts-loader',
                exclude: /node_modules/,
            },
            {
                enforce: 'pre',
                test: /\.tsx?$/,
                use: "source-map-loader"
            }
        ]
    },
    resolve: {
        extensions: [".tsx", ".ts", ".js", "scss"]
    },
    devtool: 'inline-source-map'
};

在你的main.js,现在你可以要求你的 scss 文件调用:

require('../sass/lifeleveler.scss'); //assuming main.js is at ./dist

确保您已安装npm style-loadercss-loader和.node-sasssass-loader

现在编译正确!

于 2017-02-08T00:13:16.707 回答
3

试试这个配置到你的webpack.config.js

...
module: {
  rules: [
    {
      test: /.s?css$/,
      use: ExtractTextWebpack.extract({
        fallback: 'style-loader',
        use: [
          {
            loader: 'css-loader',
            options: {
              sourceMap: true,
              importLoader: true
            }
          },
          {
            loader: 'postcss-loader',
            options: {
              plugins: [
                ... // fill your config
              ]
            }
          },
          {
            loader: 'sass-loader',
            options: {
              ... // fill your config
            }
          }
        ]
      })
    }
  ]
},
plugins: [
  new ExtractTextWebpack({
    filename: 'bundle.css'
  })
]
...

这是您需要的依赖项版本。

"devDependencies": {
    "css-loader": "^0.26.1",
    "extract-text-webpack-plugin": "beta",
    "node-sass": "^4.5.0",
    "postcss-loader": "^1.2.2",
    "sass-loader": "^4.1.1",
    "style-loader": "^0.13.1",
    "webpack": "^2.2.1",
  }

不要忘记将您的style.scss根目录添加到您的入口文件中。

示例: 在您的./dist/main.js要求中通过编写require('../sass/liveleverer.scss')

于 2017-02-07T23:57:52.923 回答