Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

开启treeshake后Vuetify主题色被替换了 #7

Closed
azhu003 opened this issue Aug 11, 2021 · 33 comments
Closed

开启treeshake后Vuetify主题色被替换了 #7

azhu003 opened this issue Aug 11, 2021 · 33 comments

Comments

@azhu003
Copy link

azhu003 commented Aug 11, 2021

this.$message.success('asdadsdad')primary颜色正常,调用之后被修改为蓝色

plugins

import Vue from 'vue'
import message from 'vuetify-message-snackbar'
import Vuetify, {VSnackbar, VIcon, VBtn} from 'vuetify/lib'

Vue.use(Vuetify)
Vue.component('v-snackbar', VSnackbar)
Vue.component('v-btn', VBtn)
Vue.component('v-icon', VIcon)

const MessageOption = {
  app: true,
  top: true,
  right: true,
  vertical: true,
}
Vue.use(message, MessageOption)

nuxt.config.js

vuetify: {
    treeShake: true,
    customVariables: [
      '~/assets/styles/variables.scss',
    ],
    theme: {
      dark: false,
      options: {customProperties: true},
      themes: {
        dark: {
          primary: {
            base: '#E2088A',
            darken1: '#DF028E',
            darken2: '#FF4E4E',
          },
        },
        light: {
          // 主色调
          primary: {
            base: '#E2088A',
            darken1: '#DF028E',
            darken2: '#FF4E4E',
          },
        },
      },
    },
  },
@thinkupp
Copy link
Owner

方便具体描述一下?
受影响的是所有vuetify组件的primary影响了还是指?
方便的话可以前后截个对比图

@azhu003 azhu003 changed the title 在Nuxtjs中Vauetify主题色被替换了 在Nuxtjs中Vuetify主题色被替换了 Aug 12, 2021
@azhu003
Copy link
Author

azhu003 commented Aug 12, 2021

所有使用了color="primary"属性的组件

<v-btn color="primary" depressed outlined :ripple="false" v-text="btn"
             @click="$message.success('asdadsdad')" />

调用前
image

调用后 会恢复成vuetify默认的主色
image

@thinkupp
Copy link
Owner

thinkupp commented Aug 12, 2021

好的,我在web下没有复现,空下来了搭个Nuxt工程排查一下
这个库并不会侵入css,理论上不应该影响样式上的表现,建议你这边审查一下元素,前后对比一下看看区别是什么,定位下问题
或者你方便的话把你的项目模板放到git上我拉一下

@azhu003
Copy link
Author

azhu003 commented Aug 12, 2021

啊... 是因为设置了 treeShake: true 的原因 https://github.com/azhu003/nuxtjs-vuetify-snackbar-example

@thinkupp
Copy link
Owner

还需要帮你看这个问题吗

@azhu003
Copy link
Author

azhu003 commented Aug 12, 2021

CSS覆盖不了,大佬有什么更好的解决办法吗,不想全量引入,只用了一部分的组件

@skadiD
Copy link

skadiD commented Aug 14, 2021

我也是使用treeshake之后自定义主题色被替换了,而且不是nuxt

@skadiD
Copy link

skadiD commented Aug 14, 2021

会不会是因为使用treeshake后导致css的优先度不同

@azhu003
Copy link
Author

azhu003 commented Aug 14, 2021

我也是使用treeshake之后自定义主题色被替换了,而且不是nuxt

就是因为treeshake这个

@azhu003 azhu003 changed the title 在Nuxtjs中Vuetify主题色被替换了 开启treeshake后Vuetify主题色被替换了 Aug 14, 2021
@skadiD
Copy link

skadiD commented Aug 14, 2021

有什么解决的方案吗,我尝试存储颜色配置在localstorge也不行

@skadiD skadiD mentioned this issue Aug 19, 2021
@skadiD
Copy link

skadiD commented Aug 19, 2021

@thinkupp 我pr了一个临时的解决方案,或许是个思路 #8
既然插件中重新new了一个vuetify,为什么不能传递已有的vuetify对象呢
但是奇怪的是解决了主题覆盖问题,消息条现在是在v-main顶部显示 可能还需要优化
1

@thinkupp
Copy link
Owner

不好意思,前段时间有点忙没顾上
追了下源码,在开启treeShake以后,nuxt会在setupBuild的时候引入vuetify-loadervuetify的入口也会变成"vuetify/lib",但是呢,vuetify-message-snackbar这个库里的vuetify入口还是"vuetify",也就是指向dist目录下的完整文件,所以我觉得用了这个库以后你开不开这个选项应该没区别了,我没试,这点你们可以打个包验证下
这个问题不算是主题覆盖,是每次初始化vuetify都会把依赖的style重写掉。
在初始化的时候会根据传参和一个默认参数进行合并,这里可能是vuetify的bug,合并处理参数深拷贝的时候有点问题导致默认参数的值被改变了,所以之后插件实例化vuetify时没传参数就算主题色也没变。
所以不开treeShake就没问题,就是因为插件和项目里引用的vuetify入口是一个,引用的默认参数也是一个,开了treeShake以后入口不同

@thinkupp
Copy link
Owner

@skadiD 我有点纳闷的是你不是nuxt环境为什么会用到treeShake,我看vuetify的README里这个属性是针对nuxt环境的吧,能发个demo看下代码吗

@skadiD
Copy link

skadiD commented Aug 23, 2021

我看即使vuetify-message-snackbar库中vuetify没有指向vuetify/lib,打包后的大小也没有增加

@skadiD
Copy link

skadiD commented Aug 23, 2021

@skadiD 我有点纳闷的是你不是nuxt环境为什么会用到treeShake,我看vuetify的README里这个属性是针对nuxt环境的吧,能发个demo看下代码吗

使用treeShake后运行时环境可以精简很多的treeShake
要不是vuetify3还没做好,使用vite应该比treeShake效果更好

@thinkupp
Copy link
Owner

@skadiD 我有点纳闷的是你不是nuxt环境为什么会用到treeShake,我看vuetify的README里这个属性是针对nuxt环境的吧,能发个demo看下代码吗

使用treeShake后运行时环境可以精简很多的treeShake
要不是vuetify3还没做好,使用vite应该比treeShake效果更好

这还真不清楚,我全局搜了下代码里只有nuxt下有treeShake相关的代码

@thinkupp
Copy link
Owner

@thinkupp 我pr了一个临时的解决方案,或许是个思路 #8
既然插件中重新new了一个vuetify,为什么不能传递已有的vuetify对象呢
但是奇怪的是解决了主题覆盖问题,消息条现在是在v-main顶部显示 可能还需要优化
1

感谢PR,现在解决办法最好的应该就是通过传参解决了

@skadiD
Copy link

skadiD commented Aug 23, 2021

传参确实是个不错的方法,但是会导致dark的覆盖。
在传递dark参数值时候并不是动态传入的,目前我还没有想出比较优美的解决方法,只能手动修改ts文件在new vuetify时候从localstorge读取现在是否是dark模式

不是很懂ts,或许可以传参一个匿名函数进去?

@thinkupp
Copy link
Owner

尚不明确问题发生的原因,Nuxt环境我用楼主的demo能复现,web下我本地试了试没法复现这个问题,你能提供一份可复现的代码么

@skadiD
Copy link

skadiD commented Aug 23, 2021

正在跑个精简版的demo,我猜测是主体vuetify对象监听dark参数的变化,但是并没有一个回调函数将dark的变化传递到vuetify-message-snackbar中的vuetify对象里

@skadiD
Copy link

skadiD commented Aug 23, 2021

demo 确实是这样,动态修改dark值,只会引起全局vuetify对象的变化,而变化后参数中的dark值没有办法更新/再次传递到vuetify-message-snackbar中的vuetify对象

@thinkupp
Copy link
Owner

我看了demo,还是没明白痛点是什么,是想动态改变snackbar的dark属性吗?

@skadiD
Copy link

skadiD commented Aug 23, 2021

就是动态改变了全局的dark属性,再使用snackbar会覆盖成最初传入的dark/light所对应的theme

举个例子 最初dark属性设定为false,全局使用light模板,传参使用的snackbar可以正常使用,但是动态修改dark属性为true,true值无法提交到snackbar中,导致snackbar在new vuetify()仍然是false,继而将light模式下的颜色覆盖到全局中

@thinkupp
Copy link
Owner

可以这样试试:
this.$message.dark(this.$vuetify.theme.dark).success("dark");

@thinkupp
Copy link
Owner

还有一个解决方法,在初始化插件的时候把实例传进来,初始化参数那里的配置项改成实例好了,一会我加一下

@skadiD
Copy link

skadiD commented Aug 23, 2021

嗯这个确实可以

我怎么就没注意到还有个dark

@skadiD
Copy link

skadiD commented Aug 23, 2021

还有一个解决方法,在初始化插件的时候把实例传进来,初始化参数那里的配置项改成实例好了,一会我加一下

嗯我现在就是这么做的

@thinkupp
Copy link
Owner

看下README,基本上所有snackbar的属性都可以动态修改

@thinkupp
Copy link
Owner

@azhu003 楼主更新版本试试,看下README的用法,有点简陋晚点补充详细,希望你还没放弃这个插件
@skadiD
https://github.com/thinkupp/vuetify-message-snackbar#%E6%A0%B7%E5%BC%8F%E8%A1%A8%E7%8E%B0%E4%B8%8D%E4%B8%80%E8%87%B4%E7%9A%84%E9%97%AE%E9%A2%98

@azhu003
Copy link
Author

azhu003 commented Aug 30, 2021

👍

@cgc2109748
Copy link

@azhu003 楼主更新版本试试,看下README的用法,有点简陋晚点补充详细,希望你还没放弃这个插件 @skadiD https://github.com/thinkupp/vuetify-message-snackbar#%E6%A0%B7%E5%BC%8F%E8%A1%A8%E7%8E%B0%E4%B8%8D%E4%B8%80%E8%87%B4%E7%9A%84%E9%97%AE%E9%A2%98

可以具体解释一下”Nuxt项目传入配置项或者在created时动态设置“这是如何配置吗?我尝试了很久都没找到方法

@skadiD
Copy link

skadiD commented Nov 3, 2021

传递实例化的vuetify对象

@cgc2109748
Copy link

传递实例化的vuetify对象

在nuxt里只能通过nuxt.config.js去做配置。没法在实例化的时候做干预啊。。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants