Sass Loader错误:无效的选项对象,不符合API模式。

64
我正在使用VueJS框架VuetifyJS(v2.0.19)。运行npm run serve后,出现以下错误:

初始化Sass Loader时,使用了一个不符合API模式的选项对象。

我尝试过: 我已删除node_modules文件夹,并重新安装/更新了所有npm软件包和node.js到最新稳定版本。
完整错误消息:
 error  in ./node_modules/vuetify/src/components/VRangeSlider/VRangeSlider.sass

Module build failed (from ./node_modules/sass-loader/dist/cjs.js):
ValidationError: Invalid options object. Sass Loader has been initialised using an options object that does not match the API schema.
 - options has an unknown property 'indentedSyntax'. These properties are valid:
   object { implementation?, sassOptions?, prependData?, sourceMap?, webpackImporter? }
    at validate (/home/do/Desktop/A/Projects/Ral/AppCLI3/node_modules/sass-loader/node_modules/schema-utils/dist/validate.js:50:11)
    at Object.loader (/home/do/Desktop/A/Projects/Ral/AppCLI3/node_modules/sass-loader/dist/index.js:36:28)

 @ ./node_modules/vuetify/src/components/VRangeSlider/VRangeSlider.sass 4:14-208 14:3-18:5 15:22-216
 @ ./node_modules/vuetify/lib/components/VRangeSlider/VRangeSlider.js
 @ ./node_modules/vuetify/lib/components/VRangeSlider/index.js
 @ ./node_modules/vuetify/lib/components/index.js
 @ ./node_modules/vuetify/lib/index.js
 @ ./src/main.js
 @ multi (webpack)-dev-server/client?http://192.168.2.115:8080/sockjs-node (webpack)/hot/dev-server.js ./src/main.js

 error  in ./node_modules/vuetify/src/styles/main.sass

我的package.json文件:

  {
  "name": "app",
  "version": "0.1.0",
  "private": false,
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },
  "dependencies": {
    "core-js": "^3.2.1",
    "fibers": "^4.0.1",
    "firebase": "^7.0.0",
    "material-icons": "^0.3.1",
    "register-service-worker": "^1.6.2",
    "vue": "^2.6.10",
    "vue-flickity": "^1.2.1",
    "vue-router": "^3.1.3",
    "vuetify": "^2.0.19",
    "vuex": "^3.1.1"
  },
  "devDependencies": {
    "@mdi/font": "^4.4.95",
    "@vue/cli-plugin-babel": "^3.11.0",
    "@vue/cli-plugin-eslint": "^3.11.0",
    "@vue/cli-plugin-pwa": "^3.11.0",
    "@vue/cli-service": "^3.11.0",
    "@vue/eslint-config-prettier": "^5.0.0",
    "babel-eslint": "^10.0.3",
    "eslint": "^6.5.1",
    "eslint-plugin-prettier": "^3.1.1",
    "eslint-plugin-vue": "^5.2.3",
    "material-design-icons-iconfont": "^5.0.1",
    "node-sass": "^4.12.0",
    "prettier": "1.18.2",
    "sass-loader": "^8.0.0",
    "stylus": "^0.54.7",
    "stylus-loader": "^3.0.2",
    "uglifyjs-webpack-plugin": "^2.2.0",
    "vue-cli-plugin-vuetify": "^0.6.3",
    "vue-loader": "^15.7.1",
    "vue-template-compiler": "^2.6.10",
    "vuetify-loader": "^1.3.0",
    "webpack": "^4.41.0",
    "webpack-cli": "^3.3.9"
  },
  "eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/essential",
      "@vue/prettier"
    ],
    "rules": {
      "no-console": "off"
    },
    "parserOptions": {
      "parser": "babel-eslint"
    }
  },
  "postcss": {
    "plugins": {
      "autoprefixer": {}
    }
  },
  "browserslist": [
    "> 1%",
    "last 2 versions"
  ]
}

如何解决这个问题?

11个回答

119

3
降级对我来说似乎并不是最优雅的方法,但这是唯一让我成功的方法。https://stackoverflow.com/users/5302733/diego-alberto-zapata-h%c3%a4ntsch 给出的答案虽然完整,但仍无法解决我的错误。 - crocodile2u
3
适合我(Worked for me) 2020年5月。 - CodeConnoisseur
3
2020年5月对我有用。看起来人们仍在谈论它:https://github.com/vuejs/vue-cli/issues/4513 - Ryan
1
使用vue-cli 3和vue 2.6,sass-loader v8.0.0适用于我...我执行了yarn remove sass-loader && yarn add -D sass-loader@8.0.0 - geneowak
1
这是 Nuxt 上最快(也最简单)的修复路径。 - Zmart
显示剩余2条评论

49

问题

根据vue-cli - github issue,如果您将sass-loader从版本v7升级到89,则可能会遇到无效选项的验证错误

在webpack中使用sass-loaderv7的有效语法为vue.config.js

  css: {
    loaderOptions: {
      sass: {
        data: `@import "@/assets/styles/variables/index.scss";`
      }
    }
  }

错误

object:
    ValidationError: Invalid options object. Sass Loader has been
    initialized using an options object that does not match the API schema.
      - options has an unknown property 'data'. These properties are valid:

sass-loader v8.0 Breaking Changes

请注意,v8有以下重大更改

  • 最低所需的webpack版本为4.36.0
  • 最低要求node.js版本为8.9.0
  • 将所有sass(includePaths、importer、functions)选项移至sassOptions选项中。函数选项不能用作Function,您应使用sassOption作为Function来实现此目的。
  • 将data选项重命名为prependData选项,默认值取决于devtool值的sourceMap选项不会生成源映射

v8解决方案

如文档所述:

  • 将所有sass(includePathsimporterfunctions)选项移至sassOptions选项中。函数选项不能用作Function,您应使用sassOption作为Function来实现此目的。
  • data选项重命名为prependData选项

sass-loader v9.0 Breaking Changes

请注意,v9有以下重大更改

  • BREAKING CHANGES最低支持的Node.js版本为10.13
  • 默认情况下,sass(dart-sass)优先使用,强烈建议迁移到sass(dart-sass)
  • prependData选项已删除,而是使用additionalData选项,请参见文档
  • 当sourceMap为true时,将忽略sassOptions.sourceMap、sassOptions.sourceMapContents、sassOptions.sourceMapEmbed、sassOptions.sourceMapRoot和sassOptions.omitSourceMapUrl。

v9解决方案

在ver9中,如选项sassOptionadditionalData中所述,如果将data更改为additionalData,则会修复无效的选项错误。

  css: {
    loaderOptions: {
      sass: {
        additionalData: `@import "@/assets/styles/variables/index.scss";`
      }
    }
  }

28

如果你使用的是 vue-cli 4,为了避免这个错误,你需要在 vue.config.js 中像下面的例子一样修改 sass-loader 的配置,之后错误就会被修复。

const path = require('path');

module.exports = {
  chainWebpack(config) {
    config
      .entry('app')
      .clear()
      .add('./src/core/main.js')
      .end();
    config.resolve.alias
      .set('~', path.join(__dirname, './src'))
      .set('@', path.join(__dirname, './src/core'))
      .set('#', path.join(__dirname, './src/modules'))
  },
  css: {
    loaderOptions: {
      sass: {
        sassOptions: {
          includePaths: [
            path.resolve(__dirname, 'src/core/')
          ],
          indentedSyntax: true,
        },
        prependData: '@import "~@/assets/sass/main.scss"',
      },
    },
  },
  assetsDir: '@/assets/',
}

请不要忘记指定自己的配置。请查看sass-loader存储库上的配置。

如果您使用vue cli 3,则需要使用sass-loader v7,而不是v8。如果您使用vue cli 3sass-loader v7,则以前的配置仍然有效。

祝好运!敬礼。

更新(2021年):

正如@gdaniel在评论中所说,sass-loader团队将选项中的prependData更改为additionalData属性,如下面的提交062991588769f2所示。


问题已解决。谢谢。 - Firmino Changani
2
更改为 data -> prependDataincludePathssassOptions.includePaths(在新对象内)。所有这些都发生在具有 sass 键的对象内。 - bassplayer7
1
它解决了我的问题。文档不是很用户友好,但你给了它更好的方向。 - Felipe Maia
1
他们已经从使用data更改为prependData和additionalData。 - gdaniel

8

当我升级到sass-loader 10时,也遇到了同样的问题。根据以下方法,我用additionalData替换了prependData以解决这个问题:

{
  test: /\.scss$/,
  loader: 'sass-loader',
  options: {
    additionalData: `@import 'src/scss/helpers/variables';`
  }
}

是的,新的API实现了additionalData选项。 - keremistan
把这个放在哪里? - Prathamesh More

6

indentedSyntaxsassOptions 的一部分:

sassOptions: {  indentedSyntax: true  }

例如:

{
    loader: 'sass-loader',
    options: {
        sassOptions: {
            indentedSyntax: true
        }
    }
}

因此 - 修改您的Webpack配置以反映这一点。

1
我无法运行它,并在CLI中收到了一个错误,提示我使用new webpack.LoaderOptionsPlugin({,因为load options已经过时。我正在使用_vue.config.js_(Vue CLI 3)来配置webpack。你能否提供更多细节? - Tom
1
你是如何创建这个应用程序的(使用vue init with template,vue create),另外,请发布vue.config.js。 - madflow

3

如果你正在使用更新版本的sass-loader,则需要使用additionalData而不是data。

module.exports = {
    css: {
      loaderOptions: {
        sass: {
            additionalData: `@import "@/styles/base.scss";`
        }
      }
    }
  };

2
在我的情况下,我不得不降级sass-loader,之后当我运行ng serve时,在终端上出现了真正的错误提示,你的情况应该是vue-cli-service。我认为这是sass-loader的v8版本的问题,需要进一步调查。
同时,这可能会有所帮助:在package.json中,将sass-loader编辑为"sass-loader": "7.0.1",

1

对于那些仍在苦苦挣扎且没有 sass-loader v8 解决方案的人:

const includePaths = [
  'mypath'
]

module.exports = {
  // ... other config here

  css: {
    extract: false,
    loaderOptions: {
      sass: {
        sassOptions: { // <<<< This wrapper is needed!
          // ... all options here, e.g. prependData, includePaths a.s.o.
          includePaths  
        }
      }
    }
  },

  // ... other config here
}

嗨,谢谢你的解决方案。sassOptions对象实际上应该包含什么? - jovialcore

1
data 改为 prependData。最终结果(vue.config.js):
module.exports = {
    css: {
        loaderOptions: {
            sass: {
                prependData: `@import "@/sass/variables.sass"`
            }
        }
    }
}

0

基于当前文档,并假设sass-loader 8+,这是导入全局的语法。这将从src/styles/..whatever导入一个文件。

module.exports = {
  css: {
    loaderOptions: {
      scss: {
        prependData: `@import "~@/styles/[rest of path to import]";`,
      },
    },
  },
}

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