Skip to content

Commit 7d06f09

Browse files
committed
feat: allow configuring css-loader options via css.loaderOptions.css
close #1484 BREAKING CHANGE: css.localIdentName has been deprecated. Use css.loaderOptions.css.localIdentName instead.
1 parent f87d918 commit 7d06f09

File tree

4 files changed

+35
-11
lines changed

4 files changed

+35
-11
lines changed

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

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ const findRule = (config, lang, index = 3) => {
2727
return rule.test.test(`.${lang}`)
2828
})
2929
// all CSS rules have 4 oneOf rules:
30-
// - <style lang="module"> in Vue files
31-
// - <style> in Vue files
32-
// - *.modules.css imports from JS
33-
// - *.css imports from JS
30+
// 0 - <style lang="module"> in Vue files
31+
// 1 - <style> in Vue files
32+
// 2 - *.modules.css imports from JS
33+
// 3 - *.css imports from JS
3434
return baseRule.oneOf[index]
3535
}
3636

@@ -132,17 +132,28 @@ test('css.sourceMap', () => {
132132
})
133133
})
134134

135-
test('css.localIdentName', () => {
135+
test('css-loader options', () => {
136136
const localIdentName = '[name]__[local]--[hash:base64:5]'
137137
const config = genConfig({
138138
vue: {
139139
css: {
140-
localIdentName: localIdentName
140+
loaderOptions: {
141+
css: {
142+
localIdentName,
143+
camelCase: 'only'
144+
}
145+
}
141146
}
142147
}
143148
})
144149
LANGS.forEach(lang => {
145-
expect(findOptions(config, lang, 'css', 0).localIdentName).toBe(localIdentName)
150+
const vueOptions = findOptions(config, lang, 'css', 0)
151+
expect(vueOptions.localIdentName).toBe(localIdentName)
152+
expect(vueOptions.camelCase).toBe('only')
153+
154+
const extOptions = findOptions(config, lang, 'css', 2)
155+
expect(extOptions.localIdentName).toBe(localIdentName)
156+
expect(extOptions.camelCase).toBe('only')
146157
})
147158
})
148159

packages/@vue/cli-service/lib/Service.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,15 @@ module.exports = class Service {
269269
ensureSlash(resolved, 'baseUrl')
270270
removeSlash(resolved, 'outputDir')
271271

272+
// deprecation warning
273+
// TODO remove in final release
274+
if (resolved.css && resolved.css.localIdentName) {
275+
warn(
276+
`css.localIdentName has been deprecated. ` +
277+
`All css-loader options (except "modules") are now supported via css.loaderOptions.css.`
278+
)
279+
}
280+
272281
// validate options
273282
validate(resolved, msg => {
274283
error(

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ module.exports = (api, options) => {
1717
modules = false,
1818
extract = true,
1919
sourceMap = false,
20-
localIdentName = '[name]_[local]_[hash:base64:5]',
2120
loaderOptions = {}
2221
} = options.css || {}
2322

@@ -79,21 +78,26 @@ module.exports = (api, options) => {
7978
})
8079
}
8180

82-
const cssLoaderOptions = {
81+
const cssLoaderOptions = Object.assign({
8382
minimize: isProd,
8483
sourceMap,
8584
importLoaders: (
8685
1 + // stylePostLoader injected by vue-loader
8786
hasPostCSSConfig +
8887
!!loader
8988
)
90-
}
89+
}, loaderOptions.css)
90+
9191
if (modules) {
92+
const {
93+
localIdentName = '[name]_[local]_[hash:base64:5]'
94+
} = loaderOptions.css || {}
9295
Object.assign(cssLoaderOptions, {
9396
modules,
9497
localIdentName
9598
})
9699
}
100+
97101
rule
98102
.use('css-loader')
99103
.loader('css-loader')

packages/@vue/cli-service/lib/options.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ const schema = createSchema(joi => joi.object({
1414
// css
1515
css: joi.object({
1616
modules: joi.boolean(),
17-
localIdentName: joi.string(),
1817
extract: joi.alternatives().try(joi.boolean(), joi.object()),
1918
sourceMap: joi.boolean(),
2019
loaderOptions: joi.object({
20+
css: joi.object(),
2121
sass: joi.object(),
2222
less: joi.object(),
2323
stylus: joi.object(),

0 commit comments

Comments
 (0)