1. result: {
    2. code: string,
    3. dependencies: Array<string>
    4. } = svelte.preprocess(
    5. source: string,
    6. preprocessors: Array<{
    7. markup?: (input: { source: string, filename: string }) => Promise<{
    8. code: string,
    9. dependencies?: Array<string>
    10. }>,
    11. script?: (input: { source: string, attributes: Record<string, string>, filename: string }) => Promise<{
    12. code: string,
    13. dependencies?: Array<string>
    14. }>,
    15. style?: (input: { source: string, attributes: Record<string, string>, filename: string }) => Promise<{
    16. code: string,
    17. dependencies?: Array<string>
    18. }>
    19. }>,
    20. options?: {
    21. filename?: string
    22. }
    23. )

    preprocess 函数提供了一个方便的钩子用于任意地转换组件源代码。比如,你可以用它来把 <style lang="sass"> 里的内容转换为 Vanilla CSS。

    1. const svelte = require('svelte/compiler');
    2. const { code } = svelte.preprocess(source, {
    3. markup: ({ content, filename }) => {
    4. return {
    5. code: content.replace(/foo/g, 'bar')
    6. };
    7. }
    8. }, {
    9. filename: 'App.svelte'
    10. });

    函数的第一个参数是组件源代码。第二个参数是一个由预处理器(preprocessor)组成的数组(如果你只有一个预处理器,直接传入一个预处理器也可以)。预处理器是一个对象,包含三个可选的方法,分别是 markupscript 以及 style

    markupscriptstyle 函数必须返回一个对象(或者是一个 Promise,resolve 时传入这个对象),这个对象必须有 code 属性和一个可选的 dependencies 属性,其中 code 属性代表了被转换后的源代码。

    markup 方法接收整个组件源文本(component source text)和组件的 filename(如果在 在 preprocess 第三个参数 options 中有被指定 filename )。

    预处理器函数可以额外返回一个名为 map 的对象,包含两个属性 codedependencies,它代表了转换过程的 sourcemap。在现有的 Svelte 版本里它会被忽略,但是在未来的版本中它会被考虑到。

    1. const svelte = require('svelte/compiler');
    2. const sass = require('node-sass');
    3. const { dirname } = require('path');
    4. const { code, dependencies } = svelte.preprocess(source, {
    5. style: async ({ content, attributes, filename }) => {
    6. // only process <style lang="sass">
    7. if (attributes.lang !== 'sass') return;
    8. const { css, stats } = await new Promise((resolve, reject) => sass.render({
    9. file: filename,
    10. data: content,
    11. includePaths: [
    12. dirname(filename),
    13. ],
    14. }, (err, result) => {
    15. if (err) reject(err);
    16. else resolve(result);
    17. }));
    18. return {
    19. code: css.toString(),
    20. dependencies: stats.includedFiles
    21. };
    22. }
    23. }, {
    24. filename: 'App.svelte'
    25. });

    scriptstyle 函数分别接收了 <script><style> 元素里面的内容。除了 filename 之外,它们还会有一个包含元素属性的对象。

    如果 dependencies 数组被返回,那么它会被包含在结果对象中。这个是给像 rollup-plugin-svelte 这样的包用来监视文件变动的,例如像是在你的 <style> 里有一个 @import 的情况。

    1. const svelte = require('svelte/compiler');
    2. const { code } = svelte.preprocess(source, [
    3. {
    4. markup: () => {
    5. console.log('this runs first');
    6. },
    7. script: () => {
    8. console.log('this runs third');
    9. },
    10. style: () => {
    11. console.log('this runs fifth');
    12. }
    13. },
    14. {
    15. markup: () => {
    16. console.log('this runs second');
    17. },
    18. script: () => {
    19. console.log('this runs fourth');
    20. },
    21. style: () => {
    22. console.log('this runs sixth');
    23. }
    24. }
    25. ], {
    26. filename: 'App.svelte'
    27. });

    多个预处理器可以被一起使用。第一个预处理器的输出将会变成第二个的输入。markup 函数最先执行,接着是 scriptstyle