stylelint-polaris media-query-allowed-list 插件:用 Polaris 断点别名统一媒体查询规范
前端UI组件【免费下载链接】polaris-react-archiveShopifys Polaris Design System - React implementation (Deprecated)项目地址https://gitcode.com/gh_mirrors/po/polaris-react-archive点击查看免费下载导读media-query-allowed-list是 Shopify Polaris 设计系统仓库中stylelint-polaris包提供的一个 Stylelint 自定义插件用于强制样式代码只使用 Polaris 官方断点别名如$p-breakpoints-sm-up与受支持的媒体类型禁止手写min-width、max-width等原始媒体条件。阅读本文后你将掌握该插件的完整配置方法、三个核心选项的语义与取值、其底层源码实现原理以及如何把它接入pnpm lint/pnpm stylelint工作流让你的 SCSS 媒体查询与 Polaris 设计令牌体系保持严格一致。插件定位为什么需要约束媒体查询在 Polaris 设计体系中响应式断点是由设计令牌design tokens统一管理的。仓库中的 breakpoints.ts 定义了全部断点别名像素值xs0pxsm490pxmd768pxlg1040pxxl1440px从 stylelint-polaris/plugins/media-query-allowed-list/README.md 的说明可以看出该插件的目的是确保代码遵循 Polaris 既定的断点约定只使用由 Polaris 令牌生成的断点别名。一旦允许开发者随意手写断点数值就会出现大量与设计令牌脱节的魔数样式系统将失去单一事实来源。从stylelint-polaris包的描述看它是 Polaris Design System Stylelint tooling该插件在包的media-queries覆盖率coverage分类中扮演核心角色与禁用旧版breakpoint/layout-width函数、禁用一批历史断点 mixin 的规则协同工作共同推动样式代码迁移到令牌体系。强制规则Enforced Rules插件强制执行两条核心约定媒体查询必须使用 Polarisbreakpoints别名定义例如media #{$p-breakpoints-sm-up} {}以及/或者使用受支持的媒体类型例如print、screen、forced-colors等。媒体查询中不得包含min-、max-、width或height条件。也就是说(min-width: 0px)、(max-width: 767px)、(height: 100px)这类写法都会被判定为非法。这两条规则共同保证所有断点语义都由$p-breakpoints-*别名最终由 Polaris tokens 编译成具体像素值承载而不是散落在各组件样式文件里的裸数值。Options 参数详解根据 README.md 中的 TypeScript 接口定义插件主选项primary options包含三个字段interface PrimaryOptions { /** * A list of RegExps or string literals to match against media types. */ allowedMediaTypes: (string | RegExp)[]; /** * A list of RegExps or string literals to match against media feature names. * * Note: This is passed directly to the built-in media-feature-name-allowed-list rule. */ allowedMediaFeatureNames: (string | RegExp)[]; /** * A list of RegExps or string literals to match against SCSS interpolation expressions in media queries. */ allowedScssInterpolations: (string | RegExp)[]; }三个字段的含义与用途如下allowedMediaTypes允许出现在媒体查询中的媒体类型media type白名单如print、screen。匹配的是media print {}中print这样的裸类型名。未列入白名单的类型如screen会被报告为非法。allowedMediaFeatureNames允许使用的媒体特性media feature名称白名单如forced-colors、reduced-motion、-ms-high-contrast。需要特别注意该数组会原样透传给 Stylelint 内置的media-feature-name-allowed-list规则由内置规则负责对(forced-colors: active)这类特性条件做检查。allowedScssInterpolations允许出现在媒体查询中的 SCSS 插值表达式白名单如$p-breakpoints-sm-up。插件从#{$p-breakpoints-sm-up}中提取插值内部表达式即$p-breakpoints-sm-up再与白名单做字符串或正则匹配。此外从 index.js 源码的 JSDoc 与运行时逻辑看主选项还支持第四个可选字段disabled布尔值。当disabled: true时插件会直接跳过全部检查见index.js第 76-78 行该能力也在 index.test.js 中有独立测试用例覆盖——设置disabled: true后即使代码写了media (width: 0px) {}也不会被报告。PrimaryOptions的三个数组都标记为optional: true允许只配置其中一部分matchesStringOrRegExp匹配逻辑位于 utils/index.js同时支持字符串字面量与正则表达式正则可写在字符串形式的/pattern/中或直接传入RegExp对象。如何配置最基础的单规则配置如下取自 README.mdconst stylelintConfig { rules: { polaris/media-query-allowed-list: { allowedMediaTypes: [print], allowedMediaFeatureNames: [forced-colors, reduced-motion], allowedScssInterpolations: [ $p-breakpoints-sm-up, $p-breakpoints-md-up, ], }, }, };不过仓库实际推荐的做法是通过stylelint-polaris提供的覆盖率规则统一配置。在 stylelint-polaris/index.js 的media-queries分类中可以看到项目的生产级配置第 239-256 行polaris/media-query-allowed-list: { // Allowed media types and media conditions allowedMediaTypes: [print, screen], allowedMediaFeatureNames: [ forced-colors, -ms-high-contrast, prefers-reduced-motion, ], allowedScssInterpolations: [ matchNameRegExp( String.raw\$p-breakpoints-(xs|sm|md|lg|xl)-(up|down|only), ), ], },这里使用了正则\$p-breakpoints-(xs|sm|md|lg|xl)-(up|down|only)一次性覆盖全部五个断点别名xs/sm/md/lg/xl与三种方向后缀up/down/only并借助matchNameRegExp包装见同一文件第 473-477 行支持可选的 Sass 命名空间前缀例如common.$p-breakpoints-sm-up也能通过校验。测试文件 index.test.js 第 14-18 行使用了同样的正则写法。启用该插件需要确保stylelint-polaris包被加载为 Stylelint 插件在 stylelint-polaris/index.js 第 465 行插件通过./plugins/media-query-allowed-list被注册直接使用单规则时则在 stylelint 配置的plugins数组中指向该插件目录即可测试中通过plugins: [__dirname]加载。运行环境要求根据 stylelint-polaris/package.json该插件所在的shopify/stylelint-polaris包要求 Node20.10.0peerDependencies 为stylelint ^14.15.0 || ^15.0.0并依赖postcss-media-query-parser、postcss-scss、shopify/polaris-tokens等仓库根目录 package.json 中使用的 stylelint 版本为^14.15.0。源码实现原理插件的核心实现位于 index.js规则全名为polaris/media-query-allowed-list第 14 行报告消息为Unexpected media query ${invalidMedia}第 16-21 行。其检查流程可以拆解为三层第一层媒体特性名称检查交给内置规则allowedMediaFeatureNames不会在插件内自行实现匹配而是通过stylelint.utils.checkAgainstRule将配置原样交给内置的media-feature-name-allowed-list规则执行第 82-109 行。插件对内置规则做了唯一一处特判当白名单中包含-ms-high-contrast且内置规则的告警文本命中该名称时直接放行第 89-96 行因为内置规则无法正确处理这个带前缀的特性名——这正是 index.test.js 中media (-ms-high-contrast: active) {}被接受的原因。第二层SCSS 插值检查插件遍历每个media规则root.walkAtRules(media, ...)第 111 行先判断媒体查询参数中是否包含 SCSS 插值hasScssInterpolation匹配#\{.?\}定义于 utils/index.js 第 1-11 行。若包含则用全局匹配提取所有插值通过scssInterpolationExpression剥离#{与}外壳得到内部表达式再与allowedScssInterpolations白名单匹配第 114-133 行。任一插值匹配白名单即视为通过否则报告整条媒体查询。这保证#{$p-breakpoints-sm-up}和#{common.$p-breakpoints-sm-up}这类带命名空间的写法都被正确解析。第三层媒体类型检查使用postcss-media-query-parser将媒体查询参数解析为 AST遍历其中的media-type节点第 135-153 行。对于 SCSS 插值构成的类型已被上一层处理以及命中allowedMediaTypes白名单的类型直接放行其余一律报告。因此media print {}合法而media screen {}当screen不在白名单时会被拒绝。三个层次的检查按特性名称 → SCSS 插值 → 媒体类型的顺序组织任何一层出现未匹配项都会产生一条以polaris/media-query-allowed-list为规则名的告警。如何运行运行全部 lint仓库根目录 package.json 中lint脚本为turbo run lint会依次执行各包 lintpnpm lint或者只运行 stylelint 并传入文件通配符pnpm stylelint file-glob校验全部 SCSS 文件pnpm stylelint **/*.scss校验单个文件以 README.md 中的示例为例该文件路径在仓库当前版本中已不存在仅作命令用法演示pnpm stylelint src/components/typography/textContainer/TextContainer.scss输出示例src/components/typography/textContainer/TextContainer.scss 4:3 ✖ Invalid media query [(min-width: 0px)]. polaris/media-query-allowed-list 6:5 ✖ Invalid media query [print and (min-width: 0px)]. polaris/media-query-allowed-list可以看到第一处直接写了(min-width: 0px)原始条件被拒绝第二处即使组合了受支持的媒体类型print只要混入了min-width条件同样被拒绝——这与媒体查询不得包含min-/max-/width/height条件的强制规则完全一致。告警输出包含文件路径、行列号如4:3以及被拒绝的完整媒体查询原文便于开发者快速定位并改写为media #{$p-breakpoints-*-up} {}形式。测试用例行为边界一览stylelint-polaris/plugins/media-query-allowed-list/index.test.js 使用jest-preset-stylelint与postcss-scss自定义语法给出了插件行为的完整边界。可通过的写法accept包括media #{$p-breakpoints-sm-up} {}—— 使用被允许的 Polaris 断点别名media #{common.$p-breakpoints-sm-up} {}—— 带命名空间的断点别名media print {}—— 使用被允许的媒体类型media not print and #{$p-breakpoints-sm-up} {}—— 媒体类型与断点别名组合media #{$p-breakpoints-sm-up} and #{$p-breakpoints-md-down} {}—— 多个断点别名组合media (forced-colors: active) {}—— 使用被允许的媒体特性名称media (-ms-high-contrast: active) {}—— 使用被允许的带前缀特性名称会被拒绝的写法reject包括media (width: 0px) {}/(min-width: 0px)/(max-width: 0px)media (height: 0px) {}/(min-height: 0px)/(max-height: 0px)media (min-width: 0px) and #{$p-breakpoints-sm-up} {}—— 合法别名与非法条件混用整体拒绝media #{$p-breakpoints-sm-up} and (min-width: 0px) {}—— 顺序互换同样拒绝media not print and (min-width: 0px) {}—— 合法媒体类型与非法条件混用media screen {}—— 未纳入白名单的媒体类型media (-ms-high-contrast: active) and (min-width: 0px) {}—— 合法特性与非法条件混用这些用例清晰地表明插件的检查是逐段校验的任何一段媒体查询类型、特性、插值不在白名单内都会导致整条查询被拒绝从而杜绝部分令牌化、部分手写裸值的中间态。在 stylelint-polaris 整体规范中的位置从 stylelint-polaris/index.js 第 239-301 行可以看到media-query-allowed-list是media-queries覆盖率分类的检查主力其周边规则还包括禁用旧版断点函数function-disallowed-list拒绝breakpoint、layout-width等历史函数禁用历史断点 mixinpolaris/at-rule-disallowed-list拒绝breakpoint-before、breakpoint-after、page-content-breakpoint-*、when-typography-condensed、print-hidden等 30 余个旧版 mixin分类消息为Please use a Polaris breakpoint token。也就是说该插件只是完整断点迁移规范中的一环——它负责新代码只能写什么而配套规则负责旧代码禁止写什么。二者结合让 Polaris 的响应式样式最终收敛到media #{$p-breakpoints-*-up} {}这一统一写法上。总结polaris/media-query-allowed-list是 Polaris 设计系统在样式工程化上用规则保障令牌一致性的典型实践通过allowedMediaTypes、allowedMediaFeatureNames、allowedScssInterpolations三个白名单外加可选的disabled开关把媒体查询的写法收敛到设计令牌生成的断点别名与受支持的媒体特性上。理解其透传内置规则 插值提取 AST 遍历的三层实现后你既能在自己的 Stylelint 配置中独立复用它也能借鉴这种白名单 逐段校验的思路为其他设计系统建立类似的样式约束。赞分享前端UI组件【免费下载链接】polaris-react-archiveShopifys Polaris Design System - React implementation (Deprecated)项目地址https://gitcode.com/gh_mirrors/po/polaris-react-archive点击查看免费下载相关推荐stylelint media-feature-name-allowed-list 规则详解用白名单约束媒体特性名称stylelint media feature name allowed list 规则详解用白名单约束媒体特性名称 media feature name a代码质量静态分析前端stylelint 规则详解media-feature-name-value-allowed-list 媒体特性值白名单校验stylelint 规则详解media feature name value allowed list 媒体特性值白名单校验 本篇指南围绕 stylelint代码质量静态分析前端stylelint 的 media-query-no-invalid 规则按 Media Queries Level 5 语法校验媒体查询stylelint 的 media query no invalid 规则按 Media Queries Level 5 语法校验媒体查询 media que代码质量静态分析前端上一篇Gaggiuino终极指南2024年智能咖啡机改造完全手册下一篇VectorBT量化交易框架深度解析掌握金融数据分析的强大工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

BFE AI 访问日志可观测字段升级实战:`bfe-access-pb` 协议对齐与 `ai_*` 新字段采集改造

BFE AI 访问日志可观测字段升级实战:`bfe-access-pb` 协议对齐与 `ai_*` 新字段采集改造

后端网络/通信云原生 【免费下载链接】bfe A modern layer 7 load balancer from baidu 项目地址: https://gitcode.com/gh_mirrors/bf/bfe 点击查看 免费下载 本文以 BFE 开源仓库(Go 语言实现的七层负载均衡器)中 AI 网关能力为背景&#…

2026/10/10 5:34:36 阅读更多 →
内存涨价周期下,为什么32GB反而成了装机标配?

内存涨价周期下,为什么32GB反而成了装机标配?

1. 内存涨价周期里,装机单上的容量数字为什么反而越写越大这两年但凡自己动手装过机、或者帮朋友写过配置单的人,应该都有一个很直观的感受:内存条的价格是真的不便宜了。前两年还能用相对轻松的价格拿下一套大容量套条,现在再去询…

2026/10/10 5:33:35 阅读更多 →
AI写SwiftUI总出错?SwiftUI-Agent-Skill:一键让AI编程助手写出专业级代码

AI写SwiftUI总出错?SwiftUI-Agent-Skill:一键让AI编程助手写出专业级代码

AI写SwiftUI总出错?SwiftUI-Agent-Skill:一键让AI编程助手写出专业级代码 【免费下载链接】SwiftUI-Agent-Skill SwiftUI agent skill for Claude Code, Codex, and other AI tools. 项目地址: https://gitcode.com/GitHub_Trending/swi/SwiftUI-Agent…

2026/10/10 5:33:35 阅读更多 →

最新新闻

Neovim在Windows上的轻量级配置指南:从Vim迁移到现代编辑器

Neovim在Windows上的轻量级配置指南:从Vim迁移到现代编辑器

说实话,在Windows上认真折腾Vim这件事,我以前是拒绝的。绝大多数人对Windows版Vim的印象还停留在"命令行里那个古老的文本编辑器",启动慢、配置繁琐、剪贴板不通、中文乱码,随便一条都够劝退的。直到Neovim出现&#xf…

2026/10/10 6:45:03 阅读更多 →
PE结构对齐机制详解:文件对齐、内存对齐与RVA/FOA转换

PE结构对齐机制详解:文件对齐、内存对齐与RVA/FOA转换

1. PE结构学习路上,绕不开的“对齐”概念接触PE结构有一段时间的兄弟应该都有体会:头两三天看DOS头、NT头、节表还挺顺利,一到“对齐”这个概念就开始犯迷糊。文件对齐、磁盘对齐、内存对齐、FileAlignment、SectionAlignment……一堆名词砸过…

2026/10/10 6:45:03 阅读更多 →
TLS 1.3 性能优化实战:降低握手延迟与高并发建连开销

TLS 1.3 性能优化实战:降低握手延迟与高并发建连开销

接手过一个让我印象很深的优化任务:线上接口 P95 延迟卡在 800ms 左右,数据库、业务逻辑、序列化都排查了一个遍,最后用抓包工具一看,好家伙,TLS 握手一次就要占掉 200 多毫秒。高并发下连接复用率稍微一波动&#xff…

2026/10/10 6:45:03 阅读更多 →
Web3.0与开源深度融合:COSCon‘25议程背后的创新路径与开发者机遇

Web3.0与开源深度融合:COSCon‘25议程背后的创新路径与开发者机遇

COSCon‘25的Web3.0开源论坛议程正式发布了。看到这份议程的第一眼,我挺意外的——不是因为它阵容有多大,而是因为它把“Web3.0”和“开源”这两个词真正焊在了一起。过去几年,我参加过不少自称“去中心化生态”的会议,要么是通篇…

2026/10/10 6:45:02 阅读更多 →
Claude Code 配置切换工具 CC Switch:自定义模型接入与多档案管理实战

Claude Code 配置切换工具 CC Switch:自定义模型接入与多档案管理实战

1. 为什么我们需要一个配置切换工具1.1 从一次痛苦的配置修改说起如果你日常使用 Claude Code 作为终端里的主力编程助手,大概率遇到过这样的场景:手头同时维护着两三个不同来源的模型服务,一个是官方默认通道,一个是团队内部自建…

2026/10/10 6:45:02 阅读更多 →
AI写作工具赋能工科生:把图表数据自动转化为技术文档

AI写作工具赋能工科生:把图表数据自动转化为技术文档

2. 技术文档写作的痛点,恰恰是工科生的机会点工科生写技术文档,大概是所有写作场景里最“反人性”的一种。上学时写实验报告、课程设计说明书,工作后写项目方案、测试报告、专利交底书、论文初稿,每一类都需要把实验数据、仿真曲线…

2026/10/10 6:44:02 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →