【问题标题】:How to load a CSS into a JavaScript variable in Webpack 5?如何将 CSS 加载到 Webpack 5 中的 JavaScript 变量中?
【发布时间】:2021-07-27 04:58:04
【问题描述】:

我有

style.css

section {
    display: flex;
    background: url('./bg.svg');
}

script.mjs

import css from './style.css'
console.log(css)

webpack.config.mjs

import path from 'path'
import url from 'url';
import autoprefixer from 'autoprefixer'

const __dirname = path.dirname(url.fileURLToPath(import.meta.url))

export default {
  mode: 'production',
  context: path.resolve(__dirname),
  entry: path.resolve(__dirname, 'script.mjs'),
  output: {
    path: path.resolve(__dirname, 'build'),
    filename: `[name].js`,
  },
  module: {
    rules: [
      {
        test: /\.(svg|png|jpg|jpeg)$/,
        type: 'asset/inline',
      },
      {
        test: /\.css$/,
        type: 'asset/source',
        use: [
          'css-loader',
          {
            loader: 'postcss-loader',
            options: {
              plugins: [
                autoprefixer,
              ],
            },
          },
        ],
      },
    ],
  },
}

package.json

{
  "scripts": {
    "build": "webpack --config webpack.config.mjs"
  },
  "devDependencies": {
    "autoprefixer": "~10.2.5",
    "css-loader": "~5.2.4",
    "postcss-loader": "~5.2.0",
    "webpack": "~5.36.2",
    "webpack-cli": "~4.6.0"
  }
}

预期的 console.log 输出

display: -webkit-box;display: -ms-flexbox;display: flex;background: url('data:image/svg+xml;utf8,...');

实际结果

当 postcss-loader 存在时,我得到了构建错误:

PostCSS Loader has been initialized using an options object that does not match the API schema"

当 webpack.config.mjs 中没有 postcss-loader 时,我在 console.log 中得到了错误的输出:

// Imports
import ___CSS_LOADER_API_IMPORT___ from "./node_modules/css-loader/dist/runtime/api.js";
import ___CSS_LOADER_GET_URL_IMPORT___ from "./node_modules/css-loader/dist/runtime/getUrl.js";
import ___CSS_LOADER_URL_IMPORT_0___ from "./bg.svg";
var ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]});
var ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___);
// Module
___CSS_LOADER_EXPORT___.push([module.id, "section {\n\tdisplay: flex;\n\tbackground: url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ");\n}", ""]);
// Exports
export default ___CSS_LOADER_EXPORT___;

【问题讨论】:

  • 您能否在您的 webpack.config.mjs 中尝试 loader: 'postcss-loader', options: { postcssOptions: { plugins: [autoprefixer] } }, 而不是 loader: 'postcss-loader', options: { plugins: [ autoprefixer, ], }, 如果仍然无法解决,请尝试替换 [ autoprefixer ], 像这样 [], &然后rm -f package-lock.json && rm -rf node_modules && npm install
  • @Subha,是的,它修复了“PostCSS Loader 已使用与 API 架构不匹配的选项对象进行初始化”错误。谢谢!但是 console.log 仍然输出一个“脏”的 css。
  • 很高兴它成功了。您能否再次分享一下修复后控制台正在记录的内容。
  • @Subha,输出类似于有问题的输出:// Imports import ___CSS_LOADER_API_IMPORT___ from "./node_modules/css-loader/dist/runtime/api.js"; import ___CSS_LOADER_GET_URL_IMPORT___ from "./node_modules/css-loader/dist/runtime/getUrl.js"; import ___CSS_LOADER_URL_IMPORT_0___ from "./bg.svg"; var ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(function(i){return i[1]}); var ___CSS_LOADER_URL_REPLACEMENT_0___ = ___CSS_LOADER_GET_URL_IMPORT___(___CSS_LOADER_URL_IMPORT_0___); // Module ___CSS_LOADER_EXPORT___.push([module.id, "section {\n\tdisplay: flex;\n\tbackg ...
  • 进行了一些故障排除并发布了答案。请检查它是否有效。

标签: javascript css webpack-5 postcss-loader


【解决方案1】:

请针对两个不同的问题尝试这些修复

  1. PostCSS 加载器未初始化:
  //....{
        loader: "postcss-loader",
        options: {
          postcssOptions: {
            plugins: [
              autoprefixer,
            ],
          },
        },
      }, //....
  1. 控制台未按预期退出: 目前,CSS 文件正在加载但未转换为字符串,因此您会在控制台中看到垃圾。您需要 systemjs/text plugin 将 CSS 文件中的文本作为字符串加载。

首先在终端中执行以下操作

//install Systemjs
npm install systemjs
//install jspm
npm install jspm@0.16x -g
// change over to your project directory
cd my-project
//intall jspm into your project
npm install jspm@0.16x --save-dev
//initialise jspm
jspm init
//install text plugin
jspm install text

然后在你的 script.mjs 中

import './style.css!';
// Now, you can retrieve the contents of the file using the text plugin:
import css from './style.css!text';
console.log(css);

请注意:还有其他安装 systemjs/text 插件的方法。更多安装信息请参考systemjs/textsystemjs

【讨论】:

  • 谢谢!我稍后会尝试并评论结果。
  • @mihail-haritonov 欢迎。如果你能接受我的回答,它会很好,那么我会知道它有效。再次感谢
  • 不幸的是,它不起作用(我得到“找不到模块:错误:无法解析'/home/m/projects/upwork/webpack-test'中的'文本'”),我切换到使用配置 plugins: [postcss({plugins: [cssurl({url: 'inline'})]}) 的汇总
猜你喜欢
  • 2021-11-05
  • 2017-07-13
  • 2021-03-03
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 2017-12-17
  • 2020-10-15
  • 1970-01-01
相关资源
最近更新 更多