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

前言

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

package.json 如下:

原因

build:test 打包结果:


build:prod 打包结果:

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

  • 测试环境 (build:test) 没有 static/css 文件,观察 index.html,CSS 是直接内联方式加载的。
  • 生产环境 (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 环境启用了 cssnano 的 mergeRules 规则,导致 :root{} 合并方式发生变化。

解决方式

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

javascript 复制代码
module.exports = {
  css: {
    extract: process.env.NODE_ENV !== 'development'
  }
};

再次执行 npm run build:test

二、手动将多个:root合并

css 复制代码
:root {
  --color-primary: #409eff;
  --color-secondary: #f56c6c;
}

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

手动合并为

css 复制代码
:root {
  --color-primary: #409eff;
  --color-secondary: #f56c6c;
  --color-success: #67c23a;
  --color-warning: #e6a23c;
}

三、手动禁用 cssnano 相关优化

javascript 复制代码
module.exports = {
  css: {
    extract: true, // 确保生产环境也提取 CSS
    loaderOptions: {
      postcss: {
        plugins: [
          require('cssnano')({
            preset: ['default', { mergeRules: false, mergeLonghand: false }]
          })
        ]
      }
    }
  }
};
相关推荐
子兮曰4 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰4 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万4 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝4 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
A黄俊辉A4 天前
uniapp webview中实现 app和内嵌的H5双向通信
vue.js·json
三十而立洋4 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁4 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
honkun64 天前
vue 表格组件 vxe-table 配置 ajax 请求自动加载数据与表单查询
vue.js·vxe-table
kybs19914 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
汉堡大王95274 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端