Skip to content

Commit af17a9b

Browse files
committed
feat: support sass-loader v8
1 parent d37d68a commit af17a9b

File tree

7 files changed

+112
-80
lines changed

7 files changed

+112
-80
lines changed

docs/guide/css.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,16 +133,17 @@ module.exports = {
133133
// pass options to sass-loader
134134
// @/ is an alias to src/
135135
// so this assumes you have a file named `src/variables.sass`
136+
// Note: this option is named as "data" in sass-loader v7
136137
sass: {
137-
data: `@import "~@/variables.sass"`
138+
prependData: `@import "~@/variables.sass"`
138139
},
139140
// by default the `sass` option will apply to both syntaxes
140141
// because `scss` syntax is also processed by sass-loader underlyingly
141142
// but when configuring the `data` option
142143
// `scss` syntax requires an semicolon at the end of a statement, while `sass` syntax requires none
143144
// in that case, we can target the `scss` syntax separately using the `scss` option
144145
scss: {
145-
data: `@import "~@/variables.scss";`
146+
prependData: `@import "~@/variables.scss";`
146147
},
147148
// pass Less.js Options to less-loader
148149
less:{

docs/zh/guide/css.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,15 +121,16 @@ module.exports = {
121121
sass: {
122122
// @/ 是 src/ 的别名
123123
// 所以这里假设你有 `src/variables.sass` 这个文件
124-
data: `@import "~@/variables.sass"`
124+
// 注意:在 sass-loader v7 中,这个选项名是 "data"
125+
prependData: `@import "~@/variables.sass"`
125126
},
126127
// 默认情况下 `sass` 选项会同时对 `sass` 和 `scss` 语法同时生效
127128
// 因为 `scss` 语法在内部也是由 sass-loader 处理的
128129
// 但是在配置 `data` 选项的时候
129130
// `scss` 语法会要求语句结尾必须有分号,`sass` 则要求必须没有分号
130131
// 在这种情况下,我们可以使用 `scss` 选项,对 `scss` 语法进行单独配置
131132
scss: {
132-
data: `@import "~@/variables.scss";`
133+
prependData: `@import "~@/variables.scss";`
133134
},
134135
// 给 less-loader 传递 Less.js 相关选项
135136
less:{

packages/@vue/cli-service/__tests__/css.spec.js

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,12 @@ test('default loaders', () => {
6767
})
6868
})
6969
// sass indented syntax
70-
expect(findOptions(config, 'sass', 'sass')).toMatchObject({ indentedSyntax: true, sourceMap: false })
70+
expect(findOptions(config, 'sass', 'sass')).toMatchObject({
71+
sassOptions: {
72+
indentedSyntax: true
73+
},
74+
sourceMap: false
75+
})
7176
})
7277

7378
test('production defaults', () => {
@@ -296,21 +301,30 @@ test('css-loader options', () => {
296301
})
297302

298303
test('css.loaderOptions', () => {
299-
const data = '$env: production;'
304+
const prependData = '$env: production;'
300305
const config = genConfig({
301306
vue: {
302307
css: {
303308
loaderOptions: {
304309
sass: {
305-
data
310+
prependData
306311
}
307312
}
308313
}
309314
}
310315
})
311316

312-
expect(findOptions(config, 'scss', 'sass')).toMatchObject({ data, sourceMap: false })
313-
expect(findOptions(config, 'sass', 'sass')).toMatchObject({ data, indentedSyntax: true, sourceMap: false })
317+
expect(findOptions(config, 'scss', 'sass')).toMatchObject({
318+
prependData,
319+
sourceMap: false
320+
})
321+
expect(findOptions(config, 'sass', 'sass')).toMatchObject({
322+
prependData,
323+
sassOptions: {
324+
indentedSyntax: true
325+
},
326+
sourceMap: false
327+
})
314328
})
315329

316330
test('scss loaderOptions', () => {
@@ -322,24 +336,33 @@ test('scss loaderOptions', () => {
322336
css: {
323337
loaderOptions: {
324338
sass: {
325-
sassData
339+
prependData: sassData
326340
},
327341
scss: {
328-
scssData
342+
prependData: scssData
329343
}
330344
}
331345
}
332346
}
333347
})
334348

335-
expect(findOptions(config, 'scss', 'sass')).toMatchObject({ scssData, sourceMap: false })
336-
expect(findOptions(config, 'sass', 'sass')).toMatchObject({ sassData, indentedSyntax: true, sourceMap: false })
349+
expect(findOptions(config, 'scss', 'sass')).toMatchObject({
350+
prependData: scssData,
351+
sourceMap: false
352+
})
353+
expect(findOptions(config, 'sass', 'sass')).toMatchObject({
354+
prependData: sassData,
355+
sassOptions: {
356+
indentedSyntax: true
357+
},
358+
sourceMap: false
359+
})
337360
})
338361

339362
test('should use dart sass implementation whenever possible', () => {
340363
const config = genConfig()
341-
expect(findOptions(config, 'scss', 'sass')).toMatchObject({ fiber: require('fibers'), implementation: require('sass') })
342-
expect(findOptions(config, 'sass', 'sass')).toMatchObject({ fiber: require('fibers'), implementation: require('sass') })
364+
expect(findOptions(config, 'scss', 'sass')).toMatchObject({ implementation: require('sass') })
365+
expect(findOptions(config, 'sass', 'sass')).toMatchObject({ implementation: require('sass') })
343366
})
344367

345368
test('skip postcss-loader if no postcss config found', () => {

packages/@vue/cli-service/generator/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,15 @@ module.exports = (api, options) => {
2929
const deps = {
3030
sass: {
3131
sass: '^1.19.0',
32-
'sass-loader': '^7.1.0'
32+
'sass-loader': '^8.0.0'
3333
},
3434
'node-sass': {
3535
'node-sass': '^4.12.0',
36-
'sass-loader': '^7.1.0'
36+
'sass-loader': '^8.0.0'
3737
},
3838
'dart-sass': {
3939
sass: '^1.19.0',
40-
'sass-loader': '^7.1.0'
40+
'sass-loader': '^8.0.0'
4141
},
4242
less: {
4343
'less': '^3.0.4',

packages/@vue/cli-service/lib/config/css.js

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
const fs = require('fs')
22
const path = require('path')
3+
const semver = require('semver')
4+
const { warn } = require('@vue/cli-shared-utils')
35

46
const findExisting = (context, files) => {
57
for (const file of files) {
@@ -15,10 +17,21 @@ module.exports = (api, rootOptions) => {
1517
const shadowMode = !!process.env.VUE_CLI_CSS_SHADOW_MODE
1618
const isProd = process.env.NODE_ENV === 'production'
1719

20+
let sassLoaderVersion
21+
try {
22+
sassLoaderVersion = semver.major(require('sass-loader/package.json').version)
23+
} catch (e) {}
24+
if (sassLoaderVersion < 8) {
25+
warn('sass-loader v8 is out, please consider upgrading your sass-loader version.')
26+
}
27+
1828
const defaultSassLoaderOptions = {}
1929
try {
2030
defaultSassLoaderOptions.implementation = require('sass')
21-
defaultSassLoaderOptions.fiber = require('fibers')
31+
// since sass-loader 8, fibers will be automatically detected and used
32+
if (sassLoaderVersion < 8) {
33+
defaultSassLoaderOptions.fiber = require('fibers')
34+
}
2235
} catch (e) {}
2336

2437
const {
@@ -175,13 +188,28 @@ module.exports = (api, rootOptions) => {
175188
defaultSassLoaderOptions,
176189
loaderOptions.scss || loaderOptions.sass
177190
))
178-
createCSSRule('sass', /\.sass$/, 'sass-loader', Object.assign(
179-
defaultSassLoaderOptions,
180-
{
181-
indentedSyntax: true
182-
},
183-
loaderOptions.sass
184-
))
191+
if (sassLoaderVersion < 8) {
192+
createCSSRule('sass', /\.sass$/, 'sass-loader', Object.assign(
193+
defaultSassLoaderOptions,
194+
{
195+
indentedSyntax: true
196+
},
197+
loaderOptions.sass
198+
))
199+
} else {
200+
createCSSRule('sass', /\.sass$/, 'sass-loader', Object.assign(
201+
defaultSassLoaderOptions,
202+
loaderOptions.sass,
203+
{
204+
sassOptions: Object.assign(
205+
(loaderOptions.sass && loaderOptions.sass.sassOptions) || {},
206+
{
207+
indentedSyntax: true
208+
}
209+
)
210+
}
211+
))
212+
}
185213
createCSSRule('less', /\.less$/, 'less-loader', loaderOptions.less)
186214
createCSSRule('stylus', /\.styl(us)?$/, 'stylus-loader', Object.assign({
187215
preferPathResolver: 'webpack'

packages/@vue/cli-service/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@
8585
"devDependencies": {
8686
"fibers": ">= 3.1.1 <5.0.0",
8787
"sass": "^1.19.0",
88-
"sass-loader": "^7.1.0",
88+
"sass-loader": "^8.0.0",
8989
"vue": "^2.6.10",
9090
"vue-router": "^3.0.6",
9191
"vue-template-compiler": "^2.6.10",

yarn.lock

Lines changed: 32 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -4650,15 +4650,14 @@ cliui@^5.0.0:
46504650
strip-ansi "^5.2.0"
46514651
wrap-ansi "^5.1.0"
46524652

4653-
clone-deep@^2.0.1:
4654-
version "2.0.2"
4655-
resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713"
4656-
integrity sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==
4653+
clone-deep@^4.0.1:
4654+
version "4.0.1"
4655+
resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
4656+
integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
46574657
dependencies:
4658-
for-own "^1.0.0"
46594658
is-plain-object "^2.0.4"
4660-
kind-of "^6.0.0"
4661-
shallow-clone "^1.0.0"
4659+
kind-of "^6.0.2"
4660+
shallow-clone "^3.0.0"
46624661

46634662
clone@2.x, clone@^2.1.1:
46644663
version "2.1.2"
@@ -7375,23 +7374,11 @@ follow-redirects@^1.0.0:
73757374
dependencies:
73767375
debug "^3.2.6"
73777376

7378-
for-in@^0.1.3:
7379-
version "0.1.8"
7380-
resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1"
7381-
integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=
7382-
7383-
for-in@^1.0.1, for-in@^1.0.2:
7377+
for-in@^1.0.2:
73847378
version "1.0.2"
73857379
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
73867380
integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
73877381

7388-
for-own@^1.0.0:
7389-
version "1.0.0"
7390-
resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
7391-
integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=
7392-
dependencies:
7393-
for-in "^1.0.1"
7394-
73957382
foreach@^2.0.5:
73967383
version "2.0.5"
73977384
resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
@@ -10265,7 +10252,7 @@ loader-utils@^0.2.16:
1026510252
json5 "^0.5.0"
1026610253
object-assign "^4.0.1"
1026710254

10268-
loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3:
10255+
loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3:
1026910256
version "1.2.3"
1027010257
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
1027110258
integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==
@@ -10455,11 +10442,6 @@ lodash.sortby@^4.7.0:
1045510442
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
1045610443
integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
1045710444

10458-
lodash.tail@^4.1.1:
10459-
version "4.1.1"
10460-
resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664"
10461-
integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=
10462-
1046310445
lodash.template@^4.0.2, lodash.template@^4.4.0, lodash.template@^4.5.0:
1046410446
version "4.5.0"
1046510447
resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab"
@@ -11112,14 +11094,6 @@ mixin-deep@^1.2.0:
1111211094
for-in "^1.0.2"
1111311095
is-extendable "^1.0.1"
1111411096

11115-
mixin-object@^2.0.1:
11116-
version "2.0.1"
11117-
resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e"
11118-
integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=
11119-
dependencies:
11120-
for-in "^0.1.3"
11121-
is-extendable "^0.1.1"
11122-
1112311097
mkdirp-promise@^5.0.1:
1112411098
version "5.0.1"
1112511099
resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1"
@@ -13243,7 +13217,7 @@ punycode@^2.1.0, punycode@^2.1.1:
1324313217
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
1324413218
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
1324513219

13246-
puppeteer@1.11.0, puppeteer@^1.11.0:
13220+
puppeteer@^1.11.0:
1324713221
version "1.11.0"
1324813222
resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.11.0.tgz#63cdbe12b07275cd6e0b94bce41f3fcb20305770"
1324913223
integrity sha512-iG4iMOHixc2EpzqRV+pv7o3GgmU2dNYEMkvKwSaQO/vMZURakwSOn/EYJ6OIRFYOque1qorzIBvrytPIQB3YzQ==
@@ -13996,17 +13970,16 @@ sane@^4.0.3:
1399613970
minimist "^1.1.1"
1399713971
walker "~1.0.5"
1399813972

13999-
sass-loader@^7.1.0:
14000-
version "7.1.0"
14001-
resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d"
14002-
integrity sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==
13973+
sass-loader@^8.0.0:
13974+
version "8.0.0"
13975+
resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.0.tgz#e7b07a3e357f965e6b03dd45b016b0a9746af797"
13976+
integrity sha512-+qeMu563PN7rPdit2+n5uuYVR0SSVwm0JsOUsaJXzgYcClWSlmX0iHDnmeOobPkf5kUglVot3QS6SyLyaQoJ4w==
1400313977
dependencies:
14004-
clone-deep "^2.0.1"
14005-
loader-utils "^1.0.1"
14006-
lodash.tail "^4.1.1"
14007-
neo-async "^2.5.0"
14008-
pify "^3.0.0"
14009-
semver "^5.5.0"
13978+
clone-deep "^4.0.1"
13979+
loader-utils "^1.2.3"
13980+
neo-async "^2.6.1"
13981+
schema-utils "^2.1.0"
13982+
semver "^6.3.0"
1401013983

1401113984
sass@^1.19.0:
1401213985
version "1.22.9"
@@ -14049,6 +14022,14 @@ schema-utils@^2.0.0:
1404914022
ajv "^6.1.0"
1405014023
ajv-keywords "^3.1.0"
1405114024

14025+
schema-utils@^2.1.0:
14026+
version "2.2.0"
14027+
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.2.0.tgz#48a065ce219e0cacf4631473159037b2c1ae82da"
14028+
integrity sha512-5EwsCNhfFTZvUreQhx/4vVQpJ/lnCAkgoIHLhSpp4ZirE+4hzFvdJi0FMub6hxbFVBJYSpeVVmon+2e7uEGRrA==
14029+
dependencies:
14030+
ajv "^6.10.2"
14031+
ajv-keywords "^3.4.1"
14032+
1405214033
scrollparent@^2.0.1:
1405314034
version "2.0.1"
1405414035
resolved "https://registry.yarnpkg.com/scrollparent/-/scrollparent-2.0.1.tgz#715d5b9cc57760fb22bdccc3befb5bfe06b1a317"
@@ -14118,7 +14099,7 @@ semver@5.5.0:
1411814099
resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
1411914100
integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==
1412014101

14121-
semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.2.0:
14102+
semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.2.0, semver@^6.3.0:
1412214103
version "6.3.0"
1412314104
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
1412414105
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
@@ -14232,14 +14213,12 @@ sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8:
1423214213
inherits "^2.0.1"
1423314214
safe-buffer "^5.0.1"
1423414215

14235-
shallow-clone@^1.0.0:
14236-
version "1.0.0"
14237-
resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571"
14238-
integrity sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==
14216+
shallow-clone@^3.0.0:
14217+
version "3.0.1"
14218+
resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
14219+
integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
1423914220
dependencies:
14240-
is-extendable "^0.1.1"
14241-
kind-of "^5.0.0"
14242-
mixin-object "^2.0.1"
14221+
kind-of "^6.0.2"
1424314222

1424414223
shebang-command@^1.2.0:
1424514224
version "1.2.0"

0 commit comments

Comments
 (0)