nuxt3在引入第三方库naive ui时刷新出现样式加载缓慢问题

解决方法一

plugin/naive-ui.ts
import { setup } from "@css-render/vue3-ssr";
import { defineNuxtPlugin } from "#app";
import fs from 'fs';
export default defineNuxtPlugin(nuxtApp => {
	if (process.server) {
		const { collect } = setup(nuxtApp.vueApp);
		const originalRenderMeta = nuxtApp.ssrContext?.renderMeta;
		nuxtApp.ssrContext = (nuxtApp.ssrContext as any) || {};
        //解决样式加载缓慢问题
        nuxtApp.ssrContext?.head.hooks.hook('tags:resolve', (ctx) => {
        const styles = collect();
        const regex = /<style[^>]*>([\s\S]*?)<\/style>/g;
        let matches;
        const extractedStyles = [];
        while ((matches = regex.exec(styles)) !== null) {
          extractedStyles.push(matches[1].trim());
        }
        const concatenatedStyles = extractedStyles.join('\n');
        console.log('s',concatenatedStyles)
        fs.writeFile('assets/css/naive.css', concatenatedStyles, (err) => {
          if (err) {
            console.error('Error writing CSS file:', err);
          }
        });
      })

		nuxtApp.ssrContext!.renderMeta = () => {
			if (!originalRenderMeta) {
				return {
					headTags: collect()
				};
			}
			const originalMeta = originalRenderMeta();
			if ("then" in originalMeta) {
				return originalMeta.then((resolvedOriginalMeta:any) => {
					return {
						...resolvedOriginalMeta,
						headTags: resolvedOriginalMeta.headTags + collect()
					};
				});
			} else {
				return {
					...originalMeta,
					headTags: originalMeta.headTags + collect()
				};
			}
		};
  
    }
});
nuxt.config.ts
要有assets/css这个目录
css: ["~/assets/css/naive.css"]

第二种方法

plugin/naive-ui.ts
export default defineNuxtPlugin({
  name: 'naive-ui',
  enforce: 'pre',
  setup(nuxtApp) {
    if (process.server) {
      const { collect } = setup(nuxtApp.vueApp)
      nuxtApp.ssrContext?.head.hooks.hook('tags:resolve', (ctx) => {
        //  insert Style after meta
        const lastMetaIndex = ctx.tags.map(x => x.tag).lastIndexOf('meta')
        const styleTags = collect().split('</style>').filter(Boolean).map(x => {
          const id = x.match(/cssr-id="(.+?)"/)?.[1]
          const style = (x.match(/>(.*)/s)?.[1] || '').trim()
          return {
            tag: 'style',
            props: {'cssr-id': id},
            innerHTML: style
          }
        })
        ctx.tags.splice(lastMetaIndex+1, 0, ...styleTags)
      })
    }
  }
})

我遇到的场景是在用naive的表单组件时,用了上面的方法还是会存在刷新有label-width的宽度会变化,找到的原因是label-width设置为auto,我这里给他设置了一个具体的宽度

 <n-form
    ref="formRef"
    :model="formData"
    :rules="rules"
    label-placement="left"
    :label-width="60"
    :show-require-mark="false"
    size="medium"
    :style="{
      maxWidth: '500px'
    }"
    
  >
    <n-form-item label="账号" path="account">
      <n-input v-model:value="formData.account" placeholder="请输入账号" />
    </n-form-item>
    <n-form-item label="密码" path="password">
      <n-input v-model:value="formData.password" type="password" show-password-on="mousedown" placeholder="请输入密码" />
    </n-form-item>
    <n-form-item label="验证码" path="code">
      <div class="flex justify-between w-100%">
        <n-input v-model:value="formData.code" style="max-width: 50%" placeholder="请输入验证码" />
      <img src="@/assets/images/semiroc-logo.png" alt="" class="w-[120px] h-9 ml-4">
      </div>
    </n-form-item>
  </n-form>

这个问题就解决了。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Nuxt 3中引入wow.js,可以按照以下步骤操作: 1. 安装wow.js和animate.css 可以使用npm或yarn安装wow.js和animate.css: ``` npm install wowjs animate.css ``` 或 ``` yarn add wowjs animate.css ``` 2. 创建一个插件文件 在Nuxt 3中,可以使用插件文件来引入第三方库。创建一个新的文件`wow.js`,并将以下代码添加到文件中: ``` import { createApp } from 'vue' import WOW from 'wowjs' export default function (context, inject) { const app = createApp() app.directive('wow', WOW.wow) inject('wow', WOW) } ``` 在这个插件文件中,我们首先使用`createApp`函数创建一个Vue实例。然后,我们使用Vue的`directive`方法将WOW.js的指令`wow`添加到Vue的指令系统中。最后,我们使用Nuxt 3的`inject`方法将WOW.js注入到Nuxt 3应用程序中。 3. 在nuxt.config.js中引入插件 打开`nuxt.config.js`文件,在`plugins`数组中添加以下代码: ``` { src: '~/plugins/wow.js', mode: 'client' } ``` 这将在客户端模式下引入插件。 4. 在组件中使用WOW.js 现在,您可以在组件中使用WOW.js了。在需要使用WOW.js的组件中,您可以按照以下步骤操作: 首先,使用`this.$wow.init()`方法初始化WOW.js: ``` export default { mounted() { this.$wow.init() } } ``` 然后,您可以在需要使用WOW.js的元素上添加`wow`指令: ``` <template> <div class="wow fadeIn" v-wow> ... </div> </template> ``` 现在,当这个组件被挂载,WOW.js将自动在带有`wow`指令的元素上应用动画效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值