-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpostcssConfig.ts
70 lines (64 loc) · 1.84 KB
/
postcssConfig.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import { cosmiconfigSync } from 'cosmiconfig'
import postcssImport from 'postcss-import'
import postcssPresetEnv from 'postcss-preset-env'
import postcssUrl from 'postcss-url'
import { Compiler } from 'webpack'
import { PostcssConfiguration, SmartCosmiconfigResult } from './types'
export default (compiler: Compiler) => {
const postcssConfig = {
ident: 'postcss',
/**
* 插件
*/
plugins: [
/**
* 处理css模块导入
*/
postcssImport(),
/**
* 处理cssurl转换
*/
postcssUrl(),
/**
* 目标构建环境
*/
postcssPresetEnv()
]
}
/**
* 用户的postcss配置
*/
const userPostcssConfig: SmartCosmiconfigResult<PostcssConfiguration> = cosmiconfigSync(
'postcss'
).search()
if (userPostcssConfig) {
const { plugins }: PostcssConfiguration = userPostcssConfig.config
if (plugins) {
let errors = []
let userPlugins = []
if (Array.isArray(plugins)) {
userPlugins = plugins
} else if (typeof plugins === 'function') {
userPlugins = plugins()
} else if (typeof plugins === 'object') {
userPlugins = Object.keys(plugins)
.map(name => {
try {
const postcssModule = require(name)
return postcssModule(plugins[name])
} catch (error) {
errors.push(error.toString())
}
})
.filter(item => !!item)
} else {
errors.push('Postcss plugins configuration error, Type should be Array, Function, Object')
}
postcssConfig.plugins = [...postcssConfig.plugins, ...userPlugins]
compiler.hooks.emit.tap('StylesWebpackPlugin', compilation => {
errors.length > 0 && Array.prototype.push.apply(compilation.errors, errors)
})
}
}
return postcssConfig
}