Webpack 中的 sass-loader 又更新了,回想起在 Vue-cli3 刚发布的时候,sass-loader 刚更新到 v7 版本。
时至今日 Vue-cli4 已经发布了了好长一段时间,咱们的 sass-loader 也在不知不觉中更新了 v8 再到 v9 版本。
因为更新涉及到比较常用的一些配置项的变动,你可能会像我一样在更新后遇到一些小问题。
经过一番搜索与小折腾,我将发现的关于 sass-loader 重要的更新事项与解决方案整理了出来,供参阅。
版本更新
经过查阅 sass-loader 的官方文档,整理了一下 v8 与 v9 版本重要的升级变更。
版本 | 变更类型 | 详情 |
---|---|---|
v8 | 兼容性 | 最低兼容的 webpack 版本为 4.36.0 |
v8 | 兼容性 | 最低兼容的 nodejs 版本为 8.9.0 |
v8 | 配置移动 | 将所有 sass 相关的配置选项 (includePaths, importer, functions) 移动到 sassOptions 选项对象下 |
v8 | 配置更改 | sassOptions 选项对象下的配置项不再支持返回一个函数,除非将整个 sassOptions 对象作为一个函数 |
v9 | 配置更名 | data 选项被命名为 prependData |
v9 | 兼容性 | 最低兼容的 nodejs 版本为 10.13 |
v9 | 实现调整 | 优先且默认以 dart-sass 作为 sass-loader 的实现,官方强烈推荐用 dart-sass 替代 node-sass 或 ruby-sass |
v9 | 配置更名 | prependData 更名为 additionalData |
v9 | 配置调整 | 当 sourceMap 选项值为 true 时,sassOptions.sourceMap, sassOptions.sourceMapContents, sassOptions.sourceMapEmbed, sassOptions.sourceMapRoot and sassOptions.omitSourceMapUrl 将统统被忽略 |
https://github.com/webpack-contrib/sass-loader/releases/tag/v8.0.0
https://github.com/webpack-contrib/sass-loader/releases/tag/v9.0.0
典型问题
配置全局变量
sass-loader 从 V7 升级到 V8 或 V9 版本之后在 配置全局变量时 你命中注定会遇到 验证选项错误 的问题。
问题复现
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:
vue.config.js 配置文件中:( sass-loader v7 版本时在 webpack 中配置时这是正确的写法 )
在 sass-loader 为 V7 版本时,配置 sass 全局变量可以用 data 作为选项名进行传值,同时这也是 Vue-cli3 官方文档里面里面的写法,但目前这个写法已经过期了。
css: {
loaderOptions: {
sass: {
data: `@import "@/assets/styles/variables/index.scss";`
}
}
}
解决方案
css: {
loaderOptions: {
sass: {
prependData: `@import "@/assets/styles/variables/index.scss";` // V8
additionalData: `@import "@/assets/styles/variables/index.scss";` // V9
}
}
}
参考链接 https://stackoverflow.com/questions/58184549/sass-loader-error-invalid-options-object-that-does-not-match-the-api-schema https://github.com/vuejs/vue-cli/issues/4513