当前位置: 首页 > news >正文

vscode-pretter 插件支持 styled-components 格式化问题

前言

开发React项目使用了styled-component做样式开发,开发工具是vscode,并且安装了vscode 插件vscode-styled-componentsprettier插件作为styled-component的智能提示和格式化工具。据我研究 vscode-styled-coponents插件仅支持了高亮,颜色支持,智能提示。格式化这块是prettier插件支持的。

格式化问题

我封装了media相关tagged函数用于适配不同设备(代码如下)。问题是格式化时无法格式化媒体查询内的样式。

const ConnectButtonWrapper = styled(GradientButton)`
  color: red;
  ${media.phone`
    color: blue;
  `}
  ${media.tablet`
    padding: 1em 1.2em;
    .grandient-border {
      border-width: 1px;
    }
  `}

  ${media.phone`
    padding: 0.15rem 0.33rem;
    .grandient-border {
      border-width: 1px;
    }
  `}
`;

研究prettier

查看prettier src/language-js/embed.js 代码如下 其中函数 isStyledJsx 就是用来判断是否能支持格式化的。看他提供的注释,仅仅支持其中的格式化。想要支持我的media.xxxx格式化的话,就需要再下面增加判断条件。
看如下代码最后几行就是我添加的。

/**
 * Template literal in these contexts:
 * <style jsx>{`div{color:red}`}</style>
 * css``
 * css.global``
 * css.resolve``
 */
function isStyledJsx(path) {
  const node = path.getValue();
  const parent = path.getParentNode();
  const parentParent = path.getParentNode(1);
  return (
    (parentParent &&
      node.quasis &&
      parent.type === "JSXExpressionContainer" &&
      parentParent.type === "JSXElement" &&
      parentParent.openingElement.name.name === "style" &&
      parentParent.openingElement.attributes.some(
        (attribute) => attribute.name.name === "jsx"
      )) ||
    (parent &&
      parent.type === "TaggedTemplateExpression" &&
      parent.tag.type === "Identifier" &&
      parent.tag.name === "css") ||
    (parent &&
      parent.type === "TaggedTemplateExpression" &&
      parent.tag.type === "MemberExpression" &&
      parent.tag.object.name === "css" &&
      (parent.tag.property.name === "global" ||
        parent.tag.property.name === "resolve"))
     //=======================支持 meadia.xxx`` 格式化 =====================
     (parent &&
      parent.type === "TaggedTemplateExpression" &&
      parent.tag.type === "MemberExpression" &&
      parent.tag.object.name === "media")
  );
}

解决问题

打开vscode插件目录 C:\Users\Administrator\.vscode\extensions\esbenp.prettier-vscode-9.8.0,找到node_modules/prettier/index.js并打开在其中搜索function isStyledJsx 找到这个函数,在这个函数中加入对应的条件即可。

如果需要解决团队问题,可以在前端项目写一个脚本放到 postinstall hooks中自动处理。或则fork prettier修改相关代码后自己发布一个插件供团队使用。

其他问题

虽然支持了格式化但是还是不支持智能提示,正在研究中…。

相关文章:

  • 搭建微服务项目框架环境
  • 与MySQL的纠缠(卸载与安装)
  • nodejs+vue+elementui影城选座管理系统python518
  • 机器学习笔记之支持向量机(一)模型构建思路
  • python-(4-3)数据类型的应用(元组、集合)
  • Hbase基本概念
  • cmake是什么,为什么现在都用cmake,cmake编译原理和跨平台示例
  • IDEA中使用JIRA
  • 物联网-物联前端安全加密技术简介
  • 怎样在LaTeX中方便输入带圆圈的数字
  • 如何在 SAP ABAP ALV 报表里以交通灯的方式显示某一列的值
  • 【C++实现】浅聊定时器的实现,最小堆配合map实现定时器
  • Spring五大类注解读取存储Bean对象
  • 数据备份管理中的分类定级:方法、标准与策略
  • 一次日常需求处理带给我的思考
  • [译] 怎样写一个基础的编译器
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • Android交互
  • CSS 提示工具(Tooltip)
  • httpie使用详解
  • Node项目之评分系统(二)- 数据库设计
  • Vue UI框架库开发介绍
  • Vue--数据传输
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端相关框架总和
  • linux 淘宝开源监控工具tsar
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • #单片机(TB6600驱动42步进电机)
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • ${ }的特别功能
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (bean配置类的注解开发)学习Spring的第十三天
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)80c52学习之旅-起始篇
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .Net 8.0 新的变化
  • .NET Framework与.NET Framework SDK有什么不同?
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET连接MongoDB数据库实例教程
  • /etc/fstab和/etc/mtab的区别
  • ??javascript里的变量问题
  • []我的函数库
  • [4.9福建四校联考]
  • [Angular] 笔记 8:list/detail 页面以及@Input
  • [ANT] 项目中应用ANT
  • [ARM]ldr 和 adr 伪指令的区别
  • [C# 网络编程系列]专题六:UDP编程
  • [c]统计数字
  • [CISCN 2023 初赛]go_session
  • [IDF]聪明的小羊
  • [Java] 什么是IoC?什么是DI?它们的区别是什么?
  • [JavaScript]_[初级]_[不使用JQuery原生Ajax提交表单文件并监听进度]
  • [JavaWeb]—Spring入门
  • [luoguP2401] 不等数列