Webpack 4 - 样式加载器/url 不起作用

Posted

技术标签:

【中文标题】Webpack 4 - 样式加载器/url 不起作用【英文标题】:Webpack 4 - Style-loader/url not working 【发布时间】:2018-12-07 09:53:42 【问题描述】:

我正在设置我的 webpack,它运行良好,但在开发中,它内联提供我编译的 scss 样式表,而不是使用 URL。

module: 
    rules: [
        
            test: /\.scss$/,
            use: [
                 loader: "style-loader",
                 loader: "css-loader" ,
                 loader: 'postcss-loader',
                    options: 
                        plugins: () => [require('autoprefixer')]
                    
                ,
                 loader: "sass-loader" 
            ]
        
    ]

所以我抓住了docs 并阅读了如何改用单个CSS 文件。我将我的 webpack 配置更新为以下内容,并且由于所有加载程序都以相反的顺序运行,这应该可以工作;

module: 
    rules: [
        
            test: /\.scss$/,
            use: [
                 loader: "style-loader/url", 
                 loader: "file-loader" ,
                 loader: "css-loader" ,
                 loader: 'postcss-loader',
                    options: 
                        plugins: () => [require('autoprefixer')]
                    
                ,
                 loader: "sass-loader" 
            ]
        
    ]

它不会导致错误,并将以下样式表插入到我的标题中;

<link rel="stylesheet" type="text/css" href="6bbafb3b6c677b38556511efc7391506.scss">

如您所见,它正在创建一个 scss 文件,而我期待的是一个 .css 文件。我尝试移动文件加载器,但这也不起作用并导致了几次崩溃。知道如何将其转换为可用的 css 文件吗?

不能在我的开发环境中使用 mini-css-extract,因为我正在使用 HMR。我已经在我的 prod 环境中进行了这项工作。

更新:当删除 css-loader 时,它会编译并显示我应用于页面的 css。但是当我检查元素时,所有内容都在第 1 行,并且找不到它引用的文件

顺便说一下,我在index.js 中导入我的css;

import '../css/styles.scss';

【问题讨论】:

“HRM”是什么意思/代表什么? 抱歉,这里打错了。我的意思是 HMR,热模块更换。 【参考方案1】:

您可以使用以下方法为 webpack 4 安装 extract-text-webpack-plugin:

npm i -D extract-text-webpack-plugin@next

你可以定义以下常量:

// Configuring PostCSS loader
const postcssLoader = 
    loader: 'postcss-loader',
    options: 
        ident: 'postcss',
        plugins: [
                // Write future-proof CSS and forget old preprocessor specific syntax.
                // It transforms CSS specs into more compatible CSS so you don’t need to wait for browser support.
                require('postcss-preset-env')()
        ]
    
;

// Configuring CSS loader
const cssloader = 
    loader: 'css-loader',
    options: 
       importLoaders: 1
    
;

然后在您的 SASS 加载程序部分中,您可以使用以下内容:

ExtractTextPlugin.extract(
    use: [cssloader, postcssLoader, 'sass-loader']
)

然后在你的插件部分,你需要使用以下内容:

new ExtractTextPlugin(
    filename: 'css/[name].css'
)

现在假设您的条目部分如下所示:

    entry: 
        app: 'index.js'
    

生成的 CSS 将被命名为 app.css 并放置在 css 文件夹中。

处理这些类型的帖子创建操作的另一个有用的插件是:

htmlWebpackPlugin 和 HtmlWebpackIncludeAssetsPlugin

将这些插件与 extract-text-webpack-plugin 一起使用可为您提供很大的灵活性。

【讨论】:

【参考方案2】:

我也遇到过类似的webpack问题,找了半天找到了结合几个插件的解决方案:

这是我的结果配置:(作为奖励,它保留了您的 sass 源图;))

watch: true,
mode: 'development',
devtool: 'source-map',
plugins: [
    new MiniCssExtractPlugin(
        filename: "[name].css", //make sure you use this format to prevent .scss extention in the hot reload file
        chunkFilename: "[id].css"
    )
],
module: 
    rules: [
        
            test: /\.scss$/,
            use: [
                'css-hot-loader', //5. this will hot load all the extracted css.
                MiniCssExtractPlugin.loader, //4 this will extract all css
                
                    loader: "css-loader", //3. this is where the fun starts
                    options: 
                        sourceMap: true
                    
                ,
                
                    loader: "postcss-loader", //2. add post css
                    options: 
                        sourceMap: true
                    
                ,
                
                    loader: "sass-loader", //1 . you can ingore the globImporter
                    options: 
                        importer: globImporter(),
                        includePaths: ["node_modules"],
                        sourceMap: true
                    
                
            ]
        ,
    ]

【讨论】:

以上是关于Webpack 4 - 样式加载器/url 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Webpack 样式加载器未将样式注入 DOM

Sass 加载器在 webpack 中不起作用

webpack 样式加载器是不是意味着加载所有 css?或者只是应用程序特定的css?

反应服务器端渲染 - webpack的“样式加载器”失败

Webpack 样式加载器与 mini-css-extract-plugin

通过微前端方法的脚本标签加载 webpack 包