如何在Monaco中实现支持styled-components无选择器CSS的SCSS编辑器?
让Monaco支持styled-components中无选择器的顶级CSS语法提示
我开发了一个组件,允许用户编写自定义样式并直接注入到styled-components容器中,代码示例如下:
const Component = styled.div` ${({ containerStyle = "" }) => containerStyle} `
当前Monaco编辑器对这种无选择器的顶级CSS属性不提供代码提示——输入时没有任何语法补全,但如果将CSS包裹在选择器(比如&)中,就能正常触发代码提示。
解决方法
1. 使用社区专用扩展
直接用monaco-styled-components插件,它专门针对styled-components优化了Monaco的语法支持,能自动识别模板字符串中的无选择器CSS属性并提供补全。
安装后配置:
import { setupStyledComponentsMonaco } from 'monaco-styled-components'; setupStyledComponentsMonaco(monaco);
2. 修改Monaco CSS语言配置
通过调整Monaco的CSS默认配置,禁用对顶级属性的错误校验,同时让补全服务识别这类语法:
import * as monaco from 'monaco-editor'; const defaultCSSConfig = monaco.languages.css.cssDefaults.configuration; monaco.languages.css.cssDefaults.setConfiguration({ ...defaultCSSConfig, validate: { ...defaultCSSConfig.validate, unknownProperties: 'ignore', // 可选:禁用其他不必要的校验规则 } });
3. 自定义补全提供者
如果上述方法不满足需求,可以手动注册补全提供者,针对性处理styled-components模板中的无选择器场景:
import * as monaco from 'monaco-editor'; monaco.languages.registerCompletionItemProvider('javascript', { triggerCharacters: ['-', 'a', 'b', 'c'], // CSS属性常见起始字符 provideCompletionItems(model, position) { // 简单判断是否处于styled-components模板的注入位置 const lineContent = model.getLineContent(position.lineNumber); const fileContent = model.getValue(); if (fileContent.includes('styled.div`') && lineContent.includes('${')) { return { suggestions: [ { label: 'background', kind: monaco.languages.CompletionItemKind.Property, insertText: 'background: ${1:#fff};', insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet }, { label: 'color', kind: monaco.languages.CompletionItemKind.Property, insertText: 'color: ${1:#000};', insertTextRules: monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet } // 可扩展更多CSS属性 ] }; } return null; } });
内容的提问来源于stack exchange,提问作者Muhammed
相关产品推荐
相关产品推荐

