链接其他加载器时用资产模块替换文件加载器

Replace file-loader with asset module when chaining other loaders

我有以下 webpack v4 模块:

{
  test: /atffonts\.scss$/,
  use: [
        {
          loader: 'file-loader',
          options: {
            name: 'style/[name].css',
          },
        },
        'extract-loader',
        'css-loader',
        'sass-loader',
  ],
}

此代码的目的是获取一个 SCSS 文件并输出一个有效的新文件 CSS。

我正在尝试迁移到 Webpack v5 并使用资产模块。我知道可以继续使用已弃用的文件加载器语法,但我试图不再依赖于此已弃用的功能。

我将上面的代码重写为:

 {
  test: /atffonts\.scss$/,
  type: 'asset/resource',
  generator: {
    filename: 'style/[name].css',
  },

  use: [
    'extract-loader',
    'css-loader',
    'sass-loader',
  ],
}

此代码确实输出了一个文件,但文件的内容无效CSS。相反,文件的内容是:


var content = require("!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!../../node_modules/style-loader/index.js!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./atffonts.scss");

if(typeof content === 'string') content = [[module.id, content, '']];

var transform;
var insertInto;



var options = {"hmr":true}

options.transform = transform
options.insertInto = undefined;

var update = require("!../../node_modules/style-loader/lib/addStyles.js")(content, options);

if(content.locals) module.exports = content.locals;

if(module.hot) {
    module.hot.accept("!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!../../node_modules/style-loader/index.js!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./atffonts.scss", function() {
        var newContent = require("!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!../../node_modules/style-loader/index.js!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./atffonts.scss");

        if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];

        var locals = (function(a, b) {
            var key, idx = 0;

            for(key in a) {
                if(!b || a[key] !== b[key]) return false;
                idx++;
            }

            for(key in b) idx--;

            return idx === 0;
        }(content.locals, newContent.locals));

        if(!locals) throw new Error('Aborting CSS HMR due to changed css-modules locals.');

        update(newContent);
    });

    module.hot.dispose(function() { update(); });
}

我不清楚我正在尝试做的事情是否与资产模块范例兼容。

我走在正确的道路上但忽略了什么吗?或者我现在应该为此目的继续使用已弃用的文件加载器吗?

我用 MiniCssExtractPlugin

做了类似的事情
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
use : [
  MiniCssExtractPlugin.loader,
  "css-loader",
  "sass-loader",
],

提醒:您必须通过npm/yarn

安装加载程序

希望对你有用,对我也有用