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

vue-cli工具build测试与生产包对css处理的不同

前言

项目上线遇到了css样式问题,经过排查发现是 main.css 中声明了两个 :root{},导致后一个覆盖了前一个。然而测试环境并未出现这个问题,样式效果为两个 :root {} 合并。

package.json 如下:
在这里插入图片描述

原因

build:test 打包结果:

在这里插入图片描述
build:prod 打包结果:
在这里插入图片描述

dist/index.html 观察到的不同点:

  • 测试环境 (build:test) 没有 static/css 文件,观察 index.htmlCSS 是直接内联方式加载的。
  • 生产环境 (build:prod) 生成了 static/css,即 CSS 被单独提取到了 CSS 文件中。

原因如下:

  1. CSS 代码优化策略
    • Vue CLI 默认在 production 环境使用 cssnano 进行 CSS 代码优化(压缩、合并、去重)。
    • cssnano 优化了 :root{} 变量,它的策略是 合并相同的变量,如果变量相同会合并,如果有不同值,后面的会覆盖前面的。
  2. CSS 提取方式不同
    • 测试环境可能是 inline 或通过 JS 注入 style,在合并多个 :root{} 时,浏览器会自动合并。
    • 生产环境中 CSS 被单独提取到 static/css,并可能经过 cssnano 的优化,导致 :root{} 选择器的行为不同。
  3. PostCSS 处理机制
    • Vue CLI 使用 postcss 处理 CSS,它可能在 production 环境启用了 cssnanomergeRules 规则,导致 :root{} 合并方式发生变化。

解决方式

一、测试环境开启CSS提取确保与生产环境一致

module.exports = {
  css: {
    extract: process.env.NODE_ENV !== 'development'
  }
};

再次执行 npm run build:test
在这里插入图片描述

二、手动将多个:root合并

:root {
  --color-primary: #409eff;
  --color-secondary: #f56c6c;
}

:root {
  --color-success: #67c23a;
  --color-warning: #e6a23c;
}

手动合并为

:root {
  --color-primary: #409eff;
  --color-secondary: #f56c6c;
  --color-success: #67c23a;
  --color-warning: #e6a23c;
}

三、手动禁用 cssnano 相关优化

module.exports = {
  css: {
    extract: true, // 确保生产环境也提取 CSS
    loaderOptions: {
      postcss: {
        plugins: [
          require('cssnano')({
            preset: ['default', { mergeRules: false, mergeLonghand: false }]
          })
        ]
      }
    }
  }
};

相关文章:

  • PDF 文本提取为何如此困难?– 原因和解决方案
  • 如何破解软件自动化测试框架的维护难题
  • 跨境电商生死存亡:AI反检测技术是否能为卖家保驾护航?
  • Ubuntu桌面环境下网络设置选项缺失问题解决
  • 在Java中集成DeepSeek的详细步骤
  • ADAS智能驾驶功能
  • 前端 VSCODE 插件开发总结 (后续将出专栏详细讲解开发的细节...)
  • 【性能优化点滴】odygrd/quill 中将 MacroMetadata 变量声明为 constexpr
  • 蓝桥杯 双子数
  • Go 语言标准库中Channels,Goroutines详细功能介绍与示例
  • 2025AWE观察:“无AI不家电”,但“AI”还是“AL”仍是个问题
  • OpenCV图像拼接(10)用于实现图像拼接过程中的时间流逝(timelapse)效果的一个类cv::detail::Timelapser
  • 【产品小白】产品视角的RAG
  • 进程状态:Linux的幕后指挥管理,穿越操作系统进程的静与动
  • 自然语言处理|高效法律助手:AI如何解析合同条款?
  • ChatBI的流程图
  • 深入探究成都国际数字影像产业园的运营模式
  • 一周掌握Flutter开发--9. 与原生交互(上)
  • Spring-boot引入nacos但未生效
  • 如何使用RK平台的spi驱动 spidev