check-wxss-escapes.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536
  1. /**
  2. * 检查微信小程序生成的 app.wxss 中是否包含 WXSS 不兼容的 CSS 选择器转义。
  3. * Tailwind 的小数点类(h-1.5)、分数类(w-1/2)、伪类变体(last:)等
  4. * 会生成带反斜杠转义的选择器,微信 WXSS 解析会报错。
  5. */
  6. const fs = require('fs')
  7. const path = require('path')
  8. const wxssPath = path.resolve(__dirname, '../dist/build/mp-weixin/app.wxss')
  9. if (!fs.existsSync(wxssPath)) {
  10. console.error(`[check-wxss] 未找到 ${wxssPath},请先执行构建`)
  11. process.exit(1)
  12. }
  13. const content = fs.readFileSync(wxssPath, 'utf-8')
  14. // 匹配以 . 开头、类名中包含反斜杠转义的选择器
  15. // 例如 .h-1\.5、.w-1\/2、.last\:border-b-0
  16. const escapedClassSelector = /\.[a-zA-Z0-9_-]*\\[.:]/g
  17. const matches = content.match(escapedClassSelector) || []
  18. // 排除常见的 base64/inline 数据中的反斜杠(它们通常不在选择器位置)
  19. const suspicious = matches.filter((m) => !m.startsWith('.data:') && !m.includes('\\/\\/'))
  20. if (suspicious.length > 0) {
  21. console.error('[check-wxss] 发现 WXSS 不兼容的转义选择器:')
  22. suspicious.slice(0, 20).forEach((m) => console.error(' -', m))
  23. if (suspicious.length > 20) {
  24. console.error(` ... 还有 ${suspicious.length - 20} 处`)
  25. }
  26. console.error('[check-wxss] 请检查源码中是否使用了小数点类、分数类或 last:/hover: 等变体。')
  27. process.exit(1)
  28. }
  29. console.log('[check-wxss] app.wxss 未发现 WXSS 不兼容的转义选择器')