CSS Loader已经使用一个与API模式不匹配的选项对象进行初始化。

18

生产构建失败,显示以下错误:

ValidationError: Invalid options object. CSS Loader has been initialised using an options object that does not match the API schema.
 - options has an unknown property 'minimize'. These properties are valid:
   object { url?, import?, modules?, sourceMap?, importLoaders?, localsConvention?, onlyLocals? }
    at validate (/Users/username/Sites/projectname/node_modules/css-loader/node_modules/schema-utils/dist/validate.js:85:11)
    at Object.loader (/Users/username/Sites/projectname/node_modules/css-loader/dist/index.js:34:28)

使用这个webpack模板:http://vuejs-templates.github.io/webpack/,升级到Webpack 4并面临构建问题,package.json:

{
  "name": "projectname",
  "private": true,
  "scripts": {
    "dev": "webpack-dev-server --inline --progress --config webpack.config.js --port 3000 --hot",
    "start": "npm run dev",
    "build": "cross-env NODE_ENV=production webpack --progress --hide-modules"
  },
  "dependencies": {
    "@vue/cli-service": "^3.2.0",
    "axios": "^0.18.0",
    "babel-polyfill": "^6.26.0",
    "cross-env": "^5.2.0",
    "css-loader": "^3.2.1",
    "jquery": "^3.3.1",
    "moment": "^2.22.2",
    "style-loader": "^1.0.1",
    "swiper": "^4.5.0",
    "v-tabs-router": "^1.4.0",
    "vee-validate": "^2.1.0-beta.9",
    "vue": "^2.5.2",
    "vue-awesome-swiper": "^3.1.3",
    "vue-backtotop": "^1.6.1",
    "vue-carousel": "^0.18.0",
    "vue-cleave-component": "^2.1.2",
    "vue-instant": "^1.0.2",
    "vue-jsonp": "^0.1.8",
    "vue-magic-line": "^0.2.1",
    "vue-masked-input": "^0.5.2",
    "vue-resource": "^1.5.1",
    "vue-router": "^3.0.2",
    "vue-select": "^2.5.1",
    "vue-slider-component": "^2.8.0",
    "vue-smooth-scroll": "^1.0.13",
    "vuejs-datepicker": "^1.5.3",
    "vuelidate": "^0.7.4",
    "vuex": "^3.0.1"
  },
  "devDependencies": {
    "autoprefixer": "^7.1.2",
    "babel-core": "^6.22.1",
    "babel-helper-vue-jsx-merge-props": "^2.0.3",
    "babel-loader": "^7.1.1",
    "babel-plugin-syntax-jsx": "^6.18.0",
    "babel-plugin-transform-runtime": "^6.22.0",
    "babel-plugin-transform-vue-jsx": "^3.5.0",
    "babel-preset-env": "^1.3.2",
    "babel-preset-stage-2": "^6.22.0",
    "chalk": "^2.0.1",
    "copy-webpack-plugin": "^4.0.1",
    "extract-text-webpack-plugin": "^3.0.0",
    "file-loader": "^5.0.2",
    "friendly-errors-webpack-plugin": "^1.6.1",
    "html-webpack-plugin": "^3.2.0",
    "node-notifier": "^5.1.2",
    "node-sass": "^4.13.0",
    "optimize-css-assets-webpack-plugin": "^5.0.3",
    "ora": "^1.2.0",
    "portfinder": "^1.0.13",
    "postcss-import": "^12.0.1",
    "postcss-loader": "^3.0.0",
    "postcss-url": "^8.0.0",
    "rimraf": "^2.6.0",
    "sass-loader": "^8.0.0",
    "semver": "^5.3.0",
    "shelljs": "^0.7.6",
    "uglifyjs-webpack-plugin": "^1.1.1",
    "url-loader": "^1.1.2",
    "vue-loader": "^14.2.2",
    "vue-resource": "^1.5.1",
    "vue-style-loader": "^4.1.2",
    "vue-template-compiler": "^2.5.2",
    "webpack": "^4.41.2",
    "webpack-cli": "^3.3.10",
    "webpack-dev-server": "^3.9.0"
  },
  "engines": {
    "node": ">= 6.0.0",
    "npm": ">= 3.0.0"
  },
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
  ]
}

我在项目根目录下使用grep -rl 'minimize' .命令进行了检查,但没有发现任何相关选项。真奇怪..


1
升级后遇到了相同的问题。 - Ajay Patel
你解决了这个问题吗?你做了什么让它工作的?@Alexander Kim - Dolphin
4个回答

25

这与模块中的破坏性变更有关。根据语义化版本规则,主要更改(版本x.y.z中的第一个数字x)是一项破坏性变更。

在这种情况下,旧版本的语法使用了

    {
        loader: 'postcss-loader',
        options: {
            plugins: postCSSPlugins
        }
    }

而新版本中的选项则使用嵌套的postcssOptions在插件之前。

    {
        loader: 'postcss-loader',
        options: {
            postcssOptions: {
                plugins: postCSSPlugins
            }
        }
    }

1
postCSSPlugins 是什么意思?@Kaxa - Dolphin
这是由用户定义的常量,用于将插件分组在一起。抱歉我忘记写关于这个的内容了。 const postCSSPlugins = [ require('postcss-import'), require('postcss-mixins'), require('postcss-simple-vars'), require('postcss-nested'), require('postcss-hexrgba'), require('autoprefixer') ] - Kaxa

8

当我更新到webpack 4并使用MiniCssExtractPlugin时,也遇到了这个错误。

通过使用旧版本的css-loader,我成功消除了错误并进行了构建。

以下是适用于我的版本:

 "devDependencies": {
   "css-loader": "1.0.1",

或者

   "css-loader": "^0.28.0",

css-loader 2* 和 3* 给我带来了错误。

更新: 经过测试发布后发现,使用旧版本的 css-loader 会导致在浏览器中呈现网站时无法加载 css 文件。所以这似乎不是一个解决方案。


2

在我运行yarn upgrade --latest命令后,我遇到了相同的问题。

它将sass-loader版本从7.1.0更改为8.0.0。之后会出现相同的错误。

可能是由于sass-loader选项发生了更改,导致此错误发生。您可以查看发布:https://github.com/webpack-contrib/sass-loader/releases和更新的选项https://github.com/webpack-contrib/sass-loader

尝试删除/更改sass-loader选项,这可以帮助您解决问题。

希望这可以帮助您,如果您可以分享webpack.config.js文件,那就太好了。

祝好~


我检查了我的配置,但没有找到任何选项配置,但仍然面临问题。@Ajay Patel https://stackoverflow.com/questions/70774740/css-loader-has-been-initialized-using-an-options-object-that-does-not-match-the - Dolphin

1
我曾经在升级 webpack 4 时遇到过类似的问题。我使用了 Vue.js CLI,它生成了一个 build/utils.js 文件,根据我是处于开发环境还是生产环境,在其中配置了一个可配置的 webpack。
自动生成的(在升级之后失败的)代码中相关的 utils.js 行:
var ExtractTextPlugin = require('extract-text-webpack-plugin')

exports.cssLoaders = function (options) {
  options = options || {}

  var cssLoader = {
    loader: 'css-loader',
    options: {
      minimize: process.env.NODE_ENV === 'production',
      sourceMap: options.sourceMap
    }
  }

  // generate loader string to be used with extract text plugin
  function generateLoaders (loader, loaderOptions) {
    var loaders = [cssLoader]
    if (loader) {
      loaders.push({
        loader: loader + '-loader',
        options: Object.assign({}, loaderOptions, {
          sourceMap: options.sourceMap
        })
      })
    }

    // Extract CSS when that option is specified
    // (which is the case during production build)
    if (options.extract) {
      return ExtractTextPlugin.loader({
        use: loaders,
        fallback: 'vue-style-loader'
      })
    } else {
      return ['vue-style-loader'].concat(loaders)
    }
  }

  // https://vue-loader.vuejs.org/en/configurations/extract-css.html
  return {
    css: generateLoaders(),
    postcss: generateLoaders(),
    less: generateLoaders('less'),
    sass: generateLoaders('sass', { indentedSyntax: true }),
    scss: generateLoaders('sass'),
    stylus: generateLoaders('stylus'),
    styl: generateLoaders('stylus')
  }
}

我尝试了简单的“只需更新模块”方法:

var ExtractTextPlugin = require('mini-css-extract-plugin')

我遇到了你遇到的错误。在对文件进行大量操作后,我使用了“复活节彩蛋故障排除策略”,发现我可以按照以下方式操作并使其正常工作。有效的方法如下:

npm i extract-loader --save-dev

然后修改build/utils.js

exports.cssLoaders = function (options) {
  options = options || {}

  var cssLoader = {
    loader: 'css-loader',
    options: {
      // minimize: process.env.NODE_ENV === 'production',
      sourceMap: options.sourceMap
    }
  }

  // generate loader string to be used with extract text plugin
  function generateLoaders (loader, loaderOptions) {
    var loaders = [cssLoader]
    if (loader) {
      loaders.push({
        loader: loader + '-loader',
        options: Object.assign({}, loaderOptions, {
          sourceMap: options.sourceMap
        })
      })
    }

    // Extract CSS when that option is specified
    // (which is the case during production build)
    if (options.extract) {
      return ['extract-loader'].concat(loaders)
      // return ExtractTextPlugin.loader({
      //   use: loaders,
      //   fallback: 'vue-style-loader'
      // })
    } else {
      return ['vue-style-loader'].concat(loaders)
    }
  }

  // https://vue-loader.vuejs.org/en/configurations/extract-css.html
  return {
    css: generateLoaders(),
    postcss: generateLoaders(),
    less: generateLoaders('less'),
    sass: generateLoaders('sass', { indentedSyntax: true }),
    scss: generateLoaders('sass'),
    stylus: generateLoaders('stylus'),
    styl: generateLoaders('stylus')
  }
}

注意,我注释掉了第9行,这是我的错误源。我还使用extract-loader模块去除了我唯一的依赖项mini-css-extract-plugin

      // minimize: process.env.NODE_ENV === 'production',

现在我必须弄清楚为什么eslint不喜欢我的Vue语法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接