简体   繁体   English

Webpack2不理解我的SASS文件中的@import语句(如何使用webpack2编译SASS?)

[英]Webpack2 not understanding @import statement in my SASS files (How to compile SASS with webpack2?)

Using Webpack 2 and sass-loader 4.11 使用Webpack 2sass-loader 4.11

webpack --config webpack.config.js

在此输入图像描述

Here is my 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'
};

Note when I tried this at the top of my config: 请注意,当我在配置的顶部尝试此操作时:

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

Got this error: 得到此错误:

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

Which is why I went with just this: var sass = require("./sass/lifeleveler.scss"); 这就是为什么我这样做: var sass = require("./sass/lifeleveler.scss");


And my lifeleveler.scss file ( from my SASS project starter kit ): 还有我的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

Any finally my folder structure, do you see any glaring issues? 最后我的文件夹结构,你看到任何明显的问题吗?

在此输入图像描述

I found this solution here , however I added my ./sass path to the modulesDirectories array and still getting the error. 我在这里找到了这个解决方案 ,但是我将./sass路径添加到modulesDirectories数组中并仍然收到错误。

After more digging I also found this Github issue and solution here , but his fix didn't work for me either :( 经过更多的挖掘后,我也发现了这个Github问题和解决方案 ,但他的修复对我来说也不起作用:(

I reproduced your issue here and was able to fix it. 我在这里复制了你的问题,并且能够解决它。

First of all, you need to change your webpack configuration file. 首先,您需要更改webpack配置文件。 Some points: 一些要点:

  1. put yout scss loader inside rules option and separate each loader into an object (like this ); 把你的scss加载器置于rules选项中,并将每个加载器分成一个对象(就像这样 );
  2. get rid of the line var sass = require("./sass/lifeleveler.scss"); 摆脱行var sass = require("./sass/lifeleveler.scss"); at the top of the configuration. 在配置的顶部。 The file should be called from your entrypoint JS. 应该从入口点JS调用该文件。 In this case: dist/main.js . 在这种情况下: dist/main.js At this point (before reading the config), webpack is not configured to load any stuff. 此时(在读取配置之前),webpack未配置为加载任何内容。 That's causing the error you showed. 这导致你出现的错误。
  3. get rid of sassLoader.includePaths and resolve.modulesDirectories , as they are not valid webpack 2 keys. 摆脱sassLoader.includePathsresolve.modulesDirectories ,因为它们是无效的WebPack 2个键。

Webpack 2 configuration structure is a bit different from Webpack 1 (you can check a official migration guide here ).. Webpack 2配置结构与Webpack 1略有不同(您可以在此处查看官方迁移指南)。

The working webpack.config.js file would be something like this: 工作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'
};

In your main.js , now you can require your scss file calling: 在你的main.js ,现在你可以要求你的scss文件调用:

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

Make sure you've npm installed style-loader , css-loader , node-sass and sass-loader . 确保你已经安装了npm style-loadercss-loadernode-sasssass-loader

Now compiles correctly! 现在编译正确!

Try this configuration to your webpack.config.js 尝试将此配置添加到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'
  })
]
...

This is the version of dependencies you need. 这是您需要的依赖项版本。

"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",
  }

don't forget to require your style.scss root to your entry file. 不要忘记将style.scss root用于您的输入文件。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM