feat(compiler-sfc): additionalData
support for css preprocessors (#2126)
close https://github.com/vitejs/vite/issues/520
This commit is contained in:
parent
7449c7626d
commit
066d514d75
@ -337,7 +337,7 @@ describe('SFC style preprocessors', () => {
|
|||||||
])
|
])
|
||||||
})
|
})
|
||||||
|
|
||||||
test('scss respect user-defined options.additionalData', () => {
|
test('scss respect user-defined string options.additionalData', () => {
|
||||||
const res = compileStyle({
|
const res = compileStyle({
|
||||||
preprocessOptions: {
|
preprocessOptions: {
|
||||||
additionalData: `
|
additionalData: `
|
||||||
@ -358,4 +358,32 @@ describe('SFC style preprocessors', () => {
|
|||||||
|
|
||||||
expect(res.errors.length).toBe(0)
|
expect(res.errors.length).toBe(0)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test('scss respect user-defined function options.additionalData', () => {
|
||||||
|
const source = `
|
||||||
|
.square {
|
||||||
|
@include square(100px);
|
||||||
|
}
|
||||||
|
`
|
||||||
|
const filename = path.resolve(__dirname, './fixture/test.scss')
|
||||||
|
const res = compileStyle({
|
||||||
|
preprocessOptions: {
|
||||||
|
additionalData: (s: string, f: string) => {
|
||||||
|
expect(s).toBe(source)
|
||||||
|
expect(f).toBe(filename)
|
||||||
|
return `
|
||||||
|
@mixin square($size) {
|
||||||
|
width: $size;
|
||||||
|
height: $size;
|
||||||
|
}`
|
||||||
|
}
|
||||||
|
},
|
||||||
|
source,
|
||||||
|
filename,
|
||||||
|
id: '',
|
||||||
|
preprocessLang: 'scss'
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(res.errors.length).toBe(0)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
import merge from 'merge-source-map'
|
import merge from 'merge-source-map'
|
||||||
import { RawSourceMap } from 'source-map'
|
import { RawSourceMap } from 'source-map'
|
||||||
import { SFCStyleCompileOptions } from './compileStyle'
|
import { SFCStyleCompileOptions } from './compileStyle'
|
||||||
|
import { isFunction } from '@vue/shared'
|
||||||
|
|
||||||
export type StylePreprocessor = (
|
export type StylePreprocessor = (
|
||||||
source: string,
|
source: string,
|
||||||
map: RawSourceMap | undefined,
|
map: RawSourceMap | undefined,
|
||||||
options: {
|
options: {
|
||||||
[key: string]: any
|
[key: string]: any
|
||||||
|
additionalData?: string | ((source: string, filename: string) => string)
|
||||||
filename: string
|
filename: string
|
||||||
},
|
},
|
||||||
customRequire: SFCStyleCompileOptions['preprocessCustomRequire']
|
customRequire: SFCStyleCompileOptions['preprocessCustomRequire']
|
||||||
@ -24,7 +26,7 @@ const scss: StylePreprocessor = (source, map, options, load = require) => {
|
|||||||
const nodeSass = load('sass')
|
const nodeSass = load('sass')
|
||||||
const finalOptions = {
|
const finalOptions = {
|
||||||
...options,
|
...options,
|
||||||
data: (options.additionalData || '') + source,
|
data: getSource(source, options.filename, options.additionalData),
|
||||||
file: options.filename,
|
file: options.filename,
|
||||||
outFile: options.filename,
|
outFile: options.filename,
|
||||||
sourceMap: !!map
|
sourceMap: !!map
|
||||||
@ -66,7 +68,7 @@ const less: StylePreprocessor = (source, map, options, load = require) => {
|
|||||||
let result: any
|
let result: any
|
||||||
let error: Error | null = null
|
let error: Error | null = null
|
||||||
nodeLess.render(
|
nodeLess.render(
|
||||||
source,
|
getSource(source, options.filename, options.additionalData),
|
||||||
{ ...options, syncImport: true },
|
{ ...options, syncImport: true },
|
||||||
(err: Error | null, output: any) => {
|
(err: Error | null, output: any) => {
|
||||||
error = err
|
error = err
|
||||||
@ -117,6 +119,18 @@ const styl: StylePreprocessor = (source, map, options, load = require) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getSource(
|
||||||
|
source: string,
|
||||||
|
filename: string,
|
||||||
|
additionalData?: string | ((source: string, filename: string) => string)
|
||||||
|
) {
|
||||||
|
if (!additionalData) return source
|
||||||
|
if (isFunction(additionalData)) {
|
||||||
|
return additionalData(source, filename)
|
||||||
|
}
|
||||||
|
return additionalData + source
|
||||||
|
}
|
||||||
|
|
||||||
export type PreprocessLang = 'less' | 'sass' | 'scss' | 'styl' | 'stylus'
|
export type PreprocessLang = 'less' | 'sass' | 'scss' | 'styl' | 'stylus'
|
||||||
|
|
||||||
export const processors: Record<PreprocessLang, StylePreprocessor> = {
|
export const processors: Record<PreprocessLang, StylePreprocessor> = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user