preprocessor - 更改 Svelte / Sapper 中预处理器的顺序
问题描述
我的工兵应用程序遇到了很大的问题。我正在使用带有svelte-preprocess插件的汇总将我的scss转换为css:
const preprocess = sveltePreprocess({
scss: {
data: `@import '${join(process.cwd(), "src/styles/main.scss")}';`,
includePaths: ["node_modules", "src"],
},
postcss: {
plugins: [...],
},
});
之后,我想运行另一个预处理器svelte-image来优化我的图像。这里的问题是,根据预处理器的设计,影响标记的那些总是首先运行。这将导致我的图像预处理器失败,因为他会遇到scss文件并且无法通过它们。
对我来说最好的解决方案是编写我自己的预处理器,它会进行样式设置,然后调用图像库。文档中有一些示例,但我并不真正理解它们。如果我尝试这个例子:
const svelte = require('svelte/compiler');
const { code } = await svelte.preprocess(source, [
{
markup: () => myPreprocess()
style: () => imagePreprocess()
}
], {
filename: 'App.svelte' // Which file would that be for sapper?
});
我收到一个来源未知的错误。那么任何人都可以指出我正确的方向如何正确和调用那个特定的预处理器吗?或者也许是更好的解决方案;-)
解决方案
tl;博士
我解释了如何做到这一点,并意识到它会成为一个有用的实用程序。我创建了一个包来处理这个问题:svelte-sequential-preprocessor。
// rollup.config.js
import svelte from 'rollup-plugin-svelte';
import seqPreprocessor from 'svelte-sequential-preprocessor'
import autoPreprocess from 'svelte-preprocess'
import image from 'svelte-image'
export default {
...,
plugins: [
svelte({
preprocess: seqPreprocessor([ autoPreprocess(), image() ])
})
]
}
解释
文档中的预处理使用示例用于将预处理器功能用作独立实用程序。要使用带有汇总的自定义预处理器,您可以执行以下操作:
export default {
...,
plugins: [
svelte({
preprocess: {
markup: ({ content, filename }) => myPreprocess(content)
}
})
]
}
注意:传递给的内容markup()
将是一个完整的 svelte 文件,表示为一个字符串。
但是,即使考虑到这一点,您的提案也不会像您描述的那样奏效。问题是样式预处理器只获取样式作为内容。 svelte-image
需要完整的 Svelte 组件markup()
。
如果您进行最后一次调整,则可以使其发挥作用。您可以强制每个预处理器在调用下一个阶段之前运行所有阶段,而不是尝试在不同阶段调用预处理器,方法是使用上面引用的库中的 preprocess 函数。可以在此处找到完整的示例,但这里是逻辑的基本概述。
export default {
...,
plugins: [
svelte({
preprocess: {
markup: async ({ content, filename }) => {
const processed = await svelte.preprocess(content, autoPreprocess({ options }), { filename });
// Handle return value and repeat for other preprocessors
return {
code: ...,
dependencies: ...
};
}
})
]
}
推荐阅读
- html - 通过 innerHTML 输入时 span 不应用 css 样式
- visual-studio-2017 - VS 2017 深色主题更改
- kernel - yocto 上的 ADV7513 - 内核 4.14
- vue.js - 用于动态数组推送的 vue 数组反应性
- javascript - 子域上的 PWA - 一起安装
- elasticsearch - ElasticSearch - 带截止的普通查询,只有当所有低频词都匹配时才对高频词进行评分
- c# - 如何编写一个程序,给一个班级的学生打 3 分,然后返回所有三个分数的平均值
- node.js - 如何在 Node.js 中实现 PDF 下载功能?
- c - 埃拉托色尼筛 - C 语言实现
- angular - 禁用 Chrome 自动填充(再次)70.0.3538.67