资讯专栏INFORMATION COLUMN

[新手坑] 02.Vue开发环境和生产环境样式不一致的问题

RdouTyping / 3986人阅读

摘要:新手坑开发环境和生产环境样式不一致的问题上次提到作用域问题导致样是不生效这次讲的是我之前遇到的一个小坑稍不留神就完蛋前阵子做的一个小项目引入了的库外加自己写的很多样式在开发环境下测试完美直接就出来上正式环境发现竟然有多处样式未生效的问题还好

[新手坑] 02.Vue开发环境和生产环境样式不一致的问题
上次提到作用域问题, 导致样是不生效, 这次讲的是我之前遇到的一个小坑, 稍不留神就完蛋.

前阵子做的一个小项目, 引入了Vant的UI库, 外加自己写的很多样式, 在开发环境下测试完美, 直接就build出来上正式环境, 发现竟然有多处样式未生效的问题! 还好是新项目, 尚未推广, 因此除了内部同事测试发现, 没有造成恶劣影响, 不过以后还是要注意下, 开发环境看着没问题, 但是生产环境一定还是要再过一遍.

那么为什么会出现这个问题呢? 我下面来做些小的测试观察一下.

问题现象

在开发环境下, 每个不同块的style都会被多带带提取插入到页面的head区域, 而生产出来的的文件是会被合并成一个文件, 在开发环境下, 这些style块的顺序又和生产环境编译出来的css文件内的顺序有差别, 导致我们在开发环境中, 使用了相同的优先级, 覆盖原Vant的UI样式看起来正常, 而在生产后, 顺序错误导致失效了!

为了更加方便测试, 我在vue-cli-mobile-study项目创建了一个分支02-build-css-order, 有兴趣可以看看~

本来想在不同块的css中添加注释以便于更明显的观察顺序变化, 结果发现生产环境中的注释被自动忽略了, 尝试去掉cssnano插件执行, 发现还是有部分注释没有展示出来, 因为不是很重要, 所以没有去纠结这块.

开发环境中的head区域有效的style有5个. 分别是

index.html中的css样式

vant的base.css内容

路径为./vue-cli-mobile-study/src/assets/styles/_uireset.css内容

App.vue的css内容

HelloWorld.vue的css内容

而生产出来的却和这个不同, 因为被合并为1个css文件了, 因此我们观察单个css文件的上面4块的顺序

index.html中的css样式

App.vue的css内容

HelloWorld.vue的css内容

vant的base.css内容

路径为./vue-cli-mobile-study/src/assets/styles/_uireset.css内容

当然, 其实在有作用域的组件中所包含的样式顺序对项目是没有影响的, 所以我们需要关注的是全局引入的样式顺序, 从上面的现象中可以看出, 除了核心文件index.html, 开发环境下, Vant样式默认在最前面(Vant实际上是Babel那边导入了), 而其他样式则似乎根据main.js入口的顺序, 以及渲染顺序来添加到html头部的; 而生产环境下, 相对诡异.

2018年4月21日补充
今天因为考虑到Vant的中部分reset样式并没有较好的对页面进行样式统一, 因此引入normalize.css, 于是基于上面的测试, 现在拥有6style. 而normalize.css在两种环境下的区别还是有的~

我将normalize.css直接写入main.js的顶部进行import, 发现可以很好的将normalize.css内的样式放在除了不可控制index.html内样式之后的首位. 这样就很棒棒了, 通常我们会将normalize.cssreset.css优先加载.

问题原因

我有在GitHub查阅过相关Issues, 也找过StackOverflow相关内容, 不过没有什么收获, 外加Webpack的高级配置方面也不是很熟悉, 因此也就没有研究出来, 如果有大神能指点一二欢迎留言.

解决方案

在需要覆盖第三方组件的默认样式是, 尽量使用高于第三方组件优先级的css样式, 以免出现开发环境和生产环境效果不同的情况.

在自己的组件样式编写中, 除了有公共的组件在不同页面的样式控制下可能需要全局样式外, 尽量写上作用域! 并且一定不要在自己写的组件内使用全局样式, 很容易出现顺序问题导致开发和生产结果不一致的情况!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/113108.html

相关文章

  • [新手] 01.Vue模板内引入组件样式覆盖失效

    摘要:新手坑模板内引入的组件样式覆盖失效作为一名刚接触的菜鸟开发过程中遇到一些小坑又很难搜索的到还是记录下来分享给有遇到过类似问题的人项目中假设用到这个库具体引入组件啥的我就不详细说了直接看代码以上代码的写法不仔细看的话通过页面来看组 [新手坑] 01.Vue模板内引入的组件样式覆盖失效 作为一名刚接触Vue的菜鸟, 开发过程中遇到一些小坑又很难搜索的到, 还是记录下来. 分享给有遇到过类似...

    Pines_Cheng 评论0 收藏0
  • JavaScript 踩心得— 为了高速(上)

    摘要:集装箱化集装箱化集装箱化以下是部分原因集装箱化会迫使你遵从应用开发大原则。通过集装箱化,可以实现开发阶段测试以及生产环境的对等。实现环境集装箱化的理由还有很多很多,一旦掌握了基本知识,集装箱化就不难实现。 一.前言 很多情况下,产品的设计与开发人员一直想打造一套高品质的解决方案,从而快速、平稳地适应产品迭代。速度是衡量产品适应性的真正且唯一的标准,而且,这并不是笔者的一家之言。 「速度...

    魏宪会 评论0 收藏0
  • 前端相关大杂烩

    摘要:希望帮助更多的前端爱好者学习。前端开发者指南作者科迪林黎,由前端大师倾情赞助。翻译最佳实践译者张捷沪江前端开发工程师当你问起有关与时,老司机们首先就会告诉你其实是个没有网络请求功能的库。 前端基础面试题(JS部分) 前端基础面试题(JS部分) 学习 React.js 比你想象的要简单 原文地址:Learning React.js is easier than you think 原文作...

    fuyi501 评论0 收藏0
  • vue项目打包后怎样优雅解决跨域

    摘要:结语因为公司的前后端项目通常都放在同一台服务器,或者不在同一台服务器的时候跨域也是靠后端的同志们去解决的,所以很少在生产环境中靠前端解决跨域的这项需求。 前言 在使用vue.js开发前端项目时,再结合webpack搞起各种依赖、各种插件进行开发,无疑给前端开发带来了很多便捷,就在解决跨域这个问题上,相信众多用vue.js的前端同僚们同我一样尝到了甜头,开发环境全靠proxyTable一...

    nanchen2251 评论0 收藏0
  • 移动端布局与适配

    摘要:实战之微信钱包腾讯服务界面网格布局是让开发人员设计一个网格并将内容放在这些网格内。对于移动端适配,不同的公司不同的团队有不同的解决方案。栅格系统用于处理页面多终端适配的问题。 grid实战之微信钱包 腾讯服务界面 CSS3网格布局是让开发人员设计一个网格并将内容放在这些网格内。而不是使用浮动制作一个网格,实际上是你将一个元素声明为一个网格容器,并把元素内容置于网格中。 移动端页面适配—...

    Clect 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<