Postcss 8 插件:如何避免循环进入声明函数?
Postcss 8 plugin: How to avoid loop into Declaration function?
您好 postcss 专家!
我正在将旧插件更新到 postCSS 8 API,但我遇到了一些问题。
这个简单的 postCSS 插件陷入无限循环:
module.exports = (options = {}) => {
return {
postcssPlugin: 'postcss-failing-plugin',
Declaration(decl) {
if (decl.prop.startsWith('--')) {
decl.prop = decl.prop.replace(/^--/, `--prefix-`);
}
},
};
};
module.exports.postcss = true;
文档中提到了这种行为:
Plugins will re-visit all nodes, which you changed or added. If you will change any children, plugin will re-visit parent as well. Only Once
and OnceExit
will not be called again.
writing a plugin
但没有什么可以避免的。
如何在不无限循环的情况下编辑 Declaration
中的值?
您可能会重复向自定义 属性 声明中添加前缀,而这些声明已经有前缀,导致声明访问者无限地 运行。
您可以使用 negative lookahead assertion (?!)
来匹配 不 以特定开头的自定义属性自定义 属性 前缀,即 ^--(?!prefix-)
.
const matcher = /^--(?!prefix-)/
const replacement = '--prefix-'
const ensure = value => value.replace(matcher, replacement)
// these _should not_ receive a new prefix
ensure('foo') // "foo"
ensure('prefix-foo') // "prefix-foo"
ensure('--prefix-foo') // "--prefix-foo"
// these _should_ receive a new prefixed
ensure('--foo') // "--prefix-foo"
ensure('--prefixable-foo') // "--prefix-prefixable-foo"
应用于您的示例
module.exports = (options = {}) => {
return {
postcssPlugin: 'postcss-failing-plugin',
Declaration(decl) {
/** Matches a `--` property not beginning with `--prefix-`. */
const match = /^--(?!prefix-)/
if (match.test(decl.prop)) {
decl.prop = decl.prop.replace(match, `--prefix-`);
}
},
};
};
module.exports.postcss = true;
您好 postcss 专家!
我正在将旧插件更新到 postCSS 8 API,但我遇到了一些问题。
这个简单的 postCSS 插件陷入无限循环:
module.exports = (options = {}) => {
return {
postcssPlugin: 'postcss-failing-plugin',
Declaration(decl) {
if (decl.prop.startsWith('--')) {
decl.prop = decl.prop.replace(/^--/, `--prefix-`);
}
},
};
};
module.exports.postcss = true;
文档中提到了这种行为:
Plugins will re-visit all nodes, which you changed or added. If you will change any children, plugin will re-visit parent as well. Only
Once
andOnceExit
will not be called again. writing a plugin
但没有什么可以避免的。
如何在不无限循环的情况下编辑 Declaration
中的值?
您可能会重复向自定义 属性 声明中添加前缀,而这些声明已经有前缀,导致声明访问者无限地 运行。
您可以使用 negative lookahead assertion (?!)
来匹配 不 以特定开头的自定义属性自定义 属性 前缀,即 ^--(?!prefix-)
.
const matcher = /^--(?!prefix-)/
const replacement = '--prefix-'
const ensure = value => value.replace(matcher, replacement)
// these _should not_ receive a new prefix
ensure('foo') // "foo"
ensure('prefix-foo') // "prefix-foo"
ensure('--prefix-foo') // "--prefix-foo"
// these _should_ receive a new prefixed
ensure('--foo') // "--prefix-foo"
ensure('--prefixable-foo') // "--prefix-prefixable-foo"
应用于您的示例
module.exports = (options = {}) => {
return {
postcssPlugin: 'postcss-failing-plugin',
Declaration(decl) {
/** Matches a `--` property not beginning with `--prefix-`. */
const match = /^--(?!prefix-)/
if (match.test(decl.prop)) {
decl.prop = decl.prop.replace(match, `--prefix-`);
}
},
};
};
module.exports.postcss = true;