使用 Nuxt 重构 Vue-cli 项目,我悟了

简介: 使用 Nuxt 重构 Vue-cli 项目


稿SEO使(prerender-spa-pluginvue-meta-infoSEO线

  • SEOSEO
  • SEO

  • Q

===vue+vueSSRSSR

 

640 (5).png


640 (6).png

使createSSRApp


  • ViteSSR使Vue-cli
  • QuasarMaterialDesignSEO
  • Nuxtvue使

~


  • 使Swiper

Nuxt.js

640 (7).png

vue【手动狗头】

  • nuxt(nuxt.jsbuildoutput)nuxt
  • assetsless,sassjavascript
  • componentsvue,asyncData
  • layouts
  • middleware
  • pagesNuxt.js.vue
  • pluginsvue.jsJavascript
  • staticwebpack
  • storevuex
  • .envprocess.env.
  • .gitignoregit
  • nuxt.config.jsNuxt.js便
  • package.jsonnpm
  • pageage.lock.jsonnpm

nuxt:

  • 使<Nuxt/><router-view/>
  • nuxt使<nuxt-link></nuxt-link><router-link></router-link>

nuxt

Nuxt.jspages_nuxtvue-router

pages/ 
  --| user/
  -----| index.vue
  -----| one.vue
  --| index.vue

_nuxt/router.js

router: {
  routes: [
    {
      name: 'index',
      path: '/',
      component: 'pages/index.vue'
    },
    {
      name: 'user',
      path: '/user',
      component: 'pages/user/index.vue'
    },
    {
      name: 'user-one',
      path: '/user/one',
      component: 'pages/user/one.vue'
    }
  ]
}

线

pages/
--| _slug/
-----| comments.vue
-----| index.vue
--| _users/
-----| _id.vue
--| index.vue

_nuxt/router.js

router: {
  routes: [
    {
      name: 'index',
      path: '/',
      component: 'pages/index.vue'
    },
    {
      name: 'users-id',
      path: '/:users/:id?',
      component: 'pages/users/_id.vue'
    },
    {
      name: 'slug',
      path: '/:slug',
      component: 'pages/_slug/index.vue'
    },
    {
      name: 'slug-comments',
      path: '/:slug/comments',
      component: 'pages/_slug/comments.vue'
    }
  ]
}

()

Tipsnuxt_nuxt访?

//该【手动狗头】

nuxt

// nuxt-ssr 为项目名,自定义
npx create-nuxt-app nuxt-ssr

VueCLI


VueCLInuxt

640 (8).png

nuxt

src/viewspages

src/componentscomponents

staticstaticJSCSSassets

nuxt.config.jsJS/CSS

export default {
  css: [
    <span data-raw-text="" "="" data-textnode-index-1656827066221="314" data-index-1656827066221="3064" class="character" style="margin: 0px; padding: 0px;">"element-ui/lib/theme-chalk/index.css<span data-raw-text="" "="" data-textnode-index-1656827066221="314" data-index-1656827066221="3101" class="character" style="margin: 0px; padding: 0px;">",
    <span data-raw-text="" "="" data-textnode-index-1656827066221="317" data-index-1656827066221="3107" class="character" style="margin: 0px; padding: 0px;">"~/assets/scss/global.scss<span data-raw-text="" "="" data-textnode-index-1656827066221="317" data-index-1656827066221="3133" class="character" style="margin: 0px; padding: 0px;">",
  ]
}

src/nuxt

nuxtpages

src/routerindex.jsnuxtrouter.js

@/nuxt/router

npm i @nuxtjs/router

nuxt.config.js@nuxtjs/router

export default {
  modules: [
      <span data-raw-text="" "="" data-textnode-index-1656827066221="344" data-index-1656827066221="3391" class="character" style="margin: 0px; padding: 0px;">"@nuxtjs/router<span data-raw-text="" "="" data-textnode-index-1656827066221="344" data-index-1656827066221="3406" class="character" style="margin: 0px; padding: 0px;">",
    ],
}

nuxtjs

const router = new VueRouter({
  mode: <span data-raw-text="" "="" data-textnode-index-1656827066221="359" data-index-1656827066221="3491" class="character" style="margin: 0px; padding: 0px;">"history<span data-raw-text="" "="" data-textnode-index-1656827066221="359" data-index-1656827066221="3499" class="character" style="margin: 0px; padding: 0px;">",
  routes,
});
router.beforeEach((to, form, next) => {
  // do somming
});
export default router;

export function createRouter() {
  const router = new VueRouter({
    mode: <span data-raw-text="" "="" data-textnode-index-1656827066221="390" data-index-1656827066221="3670" class="character" style="margin: 0px; padding: 0px;">"history<span data-raw-text="" "="" data-textnode-index-1656827066221="390" data-index-1656827066221="3678" class="character" style="margin: 0px; padding: 0px;">",
    routes,
  });
  router.beforeEach((to, form, next) => {
    if (to.query.nav_id) {
      getPrevNav(to.query.nav_id);
    }
    // console.log(mutations);
    next();
    process.client && window.scrollTo(0, 0);
  });
  return router;
}

使Failedtomountcomponent:templateorrenderfunctionnotdefinednuxt

// 懒加载修改成这样即可
path: <span data-raw-text="" "="" data-textnode-index-1656827066221="431" data-index-1656827066221="4058" class="character" style="margin: 0px; padding: 0px;">"/about<span data-raw-text="" "="" data-textnode-index-1656827066221="431" data-index-1656827066221="4065" class="character" style="margin: 0px; padding: 0px;">",
  name: <span data-raw-text="" "="" data-textnode-index-1656827066221="436" data-index-1656827066221="4075" class="character" style="margin: 0px; padding: 0px;">"About<span data-raw-text="" "="" data-textnode-index-1656827066221="436" data-index-1656827066221="4081" class="character" style="margin: 0px; padding: 0px;">",
  component: () =>
    import(<span data-raw-text="" "="" data-textnode-index-1656827066221="444" data-index-1656827066221="4112" class="character" style="margin: 0px; padding: 0px;">"~/pages/about/index.vue<span data-raw-text="" "="" data-textnode-index-1656827066221="444" data-index-1656827066221="4136" class="character" style="margin: 0px; padding: 0px;">").then((com) => com.default || com),
},

.then((com)=>com.default||com)comres.then((res)=>res.default||res)

Tipsnuxt.config.js

使@nuxtjs/axiosnode_modules/axios

// 安装:@nuxtjs/axios 和 @nuxtjs/proxy
npm i @nuxtjs/axios @nuxtjs/proxy

nuxt.config.js@nuxtjs/axios

export default {
  modules: [
      <span data-raw-text="" "="" data-textnode-index-1656827066221="476" data-index-1656827066221="4508" class="character" style="margin: 0px; padding: 0px;">"@nuxtjs/router<span data-raw-text="" "="" data-textnode-index-1656827066221="476" data-index-1656827066221="4523" class="character" style="margin: 0px; padding: 0px;">",
      <span data-raw-text="" "="" data-textnode-index-1656827066221="479" data-index-1656827066221="4531" class="character" style="margin: 0px; padding: 0px;">"@nuxtjs/axios<span data-raw-text="" "="" data-textnode-index-1656827066221="479" data-index-1656827066221="4545" class="character" style="margin: 0px; padding: 0px;">",
      <span data-raw-text="" "="" data-textnode-index-1656827066221="482" data-index-1656827066221="4553" class="character" style="margin: 0px; padding: 0px;">"@nuxtjs/proxy<span data-raw-text="" "="" data-textnode-index-1656827066221="482" data-index-1656827066221="4567" class="character" style="margin: 0px; padding: 0px;">",
    ],
  // 配置代理
  proxy: {
    <span data-raw-text="" "="" data-textnode-index-1656827066221="491" data-index-1656827066221="4598" class="character" style="margin: 0px; padding: 0px;">"/api<span data-raw-text="" "="" data-textnode-index-1656827066221="491" data-index-1656827066221="4603" class="character" style="margin: 0px; padding: 0px;">": {
      target: 'http:xxx.xxxx',
      changeOrigin: true,
    },
  },
}


@nuxtjs/axios

1pluginsjsaxios.js

export default function ({ $axios }) {
  // 请求拦截器
  $axios.onRequest((config) => {
    (config) => {
      return config;
    },
  });
  // 响应拦截器
  $axios.onResponse((res) => {
     return res;
  });
  // 请求失败(服务器报错),做一些事情
  $axios.onError((err) => {
    return Promise.reject(err);
  });
}

nuxt.config.jsaxios.js

export default {
  plugins: [
    // 方式一:服务端客户端都用
     <span data-raw-text="" "="" data-textnode-index-1656827066221="569" data-index-1656827066221="5113" class="character" style="margin: 0px; padding: 0px;">"~/plugins/axios<span data-raw-text="" "="" data-textnode-index-1656827066221="569" data-index-1656827066221="5129" class="character" style="margin: 0px; padding: 0px;">",
    // 方式二:仅在客户端使用,不需要 SSR
     { src: <span data-raw-text="" "="" data-textnode-index-1656827066221="576" data-index-1656827066221="5169" class="character" style="margin: 0px; padding: 0px;">"~/plugins/axios<span data-raw-text="" "="" data-textnode-index-1656827066221="576" data-index-1656827066221="5185" class="character" style="margin: 0px; padding: 0px;">", mode: <span data-raw-text="" "="" data-textnode-index-1656827066221="580" data-index-1656827066221="5194" class="character" style="margin: 0px; padding: 0px;">"client<span data-raw-text="" "="" data-textnode-index-1656827066221="580" data-index-1656827066221="5201" class="character" style="margin: 0px; padding: 0px;">" },
    // 方式三:仅在客户端使用,不需要 SSR,和方式二一样
     { src: <span data-raw-text="" "="" data-textnode-index-1656827066221="587" data-index-1656827066221="5250" class="character" style="margin: 0px; padding: 0px;">"~/plugins/axios<span data-raw-text="" "="" data-textnode-index-1656827066221="587" data-index-1656827066221="5266" class="character" style="margin: 0px; padding: 0px;">", ssr: false },
  ]
}

Tips~@

@nuxtjs/axios使

this$axios@nuxtjs/axiosaxios

methods:{
    async getArticleList() {
      const res = await this.$axios.$get('http://xxx.xxx.xxx/list')
      console.log(res)
    }
}

VuexStore

使Vuex

import Vue from <span data-raw-text="" "="" data-textnode-index-1656827066221="643" data-index-1656827066221="5618" class="character" style="margin: 0px; padding: 0px;">"vue<span data-raw-text="" "="" data-textnode-index-1656827066221="643" data-index-1656827066221="5622" class="character" style="margin: 0px; padding: 0px;">";
import Vuex from <span data-raw-text="" "="" data-textnode-index-1656827066221="651" data-index-1656827066221="5641" class="character" style="margin: 0px; padding: 0px;">"vuex<span data-raw-text="" "="" data-textnode-index-1656827066221="651" data-index-1656827066221="5646" class="character" style="margin: 0px; padding: 0px;">";
import Index from <span data-raw-text="" "="" data-textnode-index-1656827066221="659" data-index-1656827066221="5666" class="character" style="margin: 0px; padding: 0px;">"./modules/index<span data-raw-text="" "="" data-textnode-index-1656827066221="659" data-index-1656827066221="5682" class="character" style="margin: 0px; padding: 0px;">";
Vue.use(Vuex);
export default new Vuex.Store({
  state: {},
  mutations: {},
  actions: {},
  modules: {
    Index,
  },
});

nuxt

import Vue from <span data-raw-text="" "="" data-textnode-index-1656827066221="701" data-index-1656827066221="5834" class="character" style="margin: 0px; padding: 0px;">"vue<span data-raw-text="" "="" data-textnode-index-1656827066221="701" data-index-1656827066221="5838" class="character" style="margin: 0px; padding: 0px;">";
import Vuex from <span data-raw-text="" "="" data-textnode-index-1656827066221="709" data-index-1656827066221="5857" class="character" style="margin: 0px; padding: 0px;">"vuex<span data-raw-text="" "="" data-textnode-index-1656827066221="709" data-index-1656827066221="5862" class="character" style="margin: 0px; padding: 0px;">";
import home from <span data-raw-text="" "="" data-textnode-index-1656827066221="715" data-index-1656827066221="5881" class="character" style="margin: 0px; padding: 0px;">"./modules/home<span data-raw-text="" "="" data-textnode-index-1656827066221="715" data-index-1656827066221="5896" class="character" style="margin: 0px; padding: 0px;">";
Vue.use(Vuex);
const store = () => {
  return  new Vuex.Store({
  state: {},
  mutations: {},
  actions: {},
  modules: {
    Index,
  },
});
}
// 因为函数里面就一条返回值,所以也可以写成下面这样
// const store = () => new Vuex.Store({
//   state: {},
//   mutations: {},
//   actions: {},
//   modules: {
//     Index,
//   },
// });
export default store

nuxt

import Vue from <span data-raw-text="" "="" data-textnode-index-1656827066221="774" data-index-1656827066221="6239" class="character" style="margin: 0px; padding: 0px;">"vue<span data-raw-text="" "="" data-textnode-index-1656827066221="774" data-index-1656827066221="6243" class="character" style="margin: 0px; padding: 0px;">";
import Vuex from <span data-raw-text="" "="" data-textnode-index-1656827066221="782" data-index-1656827066221="6262" class="character" style="margin: 0px; padding: 0px;">"vuex<span data-raw-text="" "="" data-textnode-index-1656827066221="782" data-index-1656827066221="6267" class="character" style="margin: 0px; padding: 0px;">";
// 在 modules 文件中新建一个index.js文件,将 模块导入进去
//再导出为一个变量,防止影响 store/index.js 可读性
import modulesGroup from <span data-raw-text="" "="" data-textnode-index-1656827066221="790" data-index-1656827066221="6367" class="character" style="margin: 0px; padding: 0px;">"./modules/index<span data-raw-text="" "="" data-textnode-index-1656827066221="790" data-index-1656827066221="6383" class="character" style="margin: 0px; padding: 0px;">";
Vue.use(Vuex);
// state
export const state = () => ({});
// mutations
export const mutations = {};
// actions
export const actions = {};
// modules
export const modules = {
  modules: modulesGroup,
};
// 不需要使用 export default 全部导出,因为 nuxt 会自动生成和 vuex 一样的结构

@nuxtjs/axiosvuex使

api使Vuexactionsnuxtvuex

// API 文件夹下的home.js
// 自己封装的 http 请求
import http from <span data-raw-text="" "="" data-textnode-index-1656827066221="838" data-index-1656827066221="6759" class="character" style="margin: 0px; padding: 0px;">"@/lib/http<span data-raw-text="" "="" data-textnode-index-1656827066221="838" data-index-1656827066221="6770" class="character" style="margin: 0px; padding: 0px;">";
const LISTURL = <span data-raw-text="" "="" data-textnode-index-1656827066221="844" data-index-1656827066221="6788" class="character" style="margin: 0px; padding: 0px;">"/getList<span data-raw-text="" "="" data-textnode-index-1656827066221="844" data-index-1656827066221="6797" class="character" style="margin: 0px; padding: 0px;">";
const API = {
  getArticleList({ dispatch }, data) {
    return new Promise((resolve, reject) => {
      http
        .post(LISTURL, data)
        .then((res) => {
          resolve(res);
        })
        .catch((error) => {
        // 错误收集
          // dispatch('ERROR', error) 
          reject(error);
        });
    });
  },
export default API;
// 在 store/modules/home.js 文件中引入定义好的api,并导出
import Actions from <span data-raw-text="" "="" data-textnode-index-1656827066221="899" data-index-1656827066221="7198" class="character" style="margin: 0px; padding: 0px;">"@/api/home<span data-raw-text="" "="" data-textnode-index-1656827066221="899" data-index-1656827066221="7209" class="character" style="margin: 0px; padding: 0px;">";
export default {
  namespaced: true,
  state: {},
  getters: {},
  mutations: {},
  actions: {
    ...Actions,
  },
};

APIhome.jshttphttp.postthis.$axios.post

thisthis.$axios

const LISTURL = <span data-raw-text="" "="" data-textnode-index-1656827066221="939" data-index-1656827066221="7442" class="character" style="margin: 0px; padding: 0px;">"/getList<span data-raw-text="" "="" data-textnode-index-1656827066221="939" data-index-1656827066221="7451" class="character" style="margin: 0px; padding: 0px;">";
const API = {
  getArticleList({ dispatch }, data) {
    return new Promise((resolve, reject) => {
      this.$axios
        .$post(LISTURL, data)
        .then((res) => {
          resolve(res);
        })
        .catch((error) => {
        // 错误收集
          // dispatch('ERROR', error) 
          reject(error);
        });
    });
  },
export default API;

store/modules/home.js

// 在 store/modules/home 文件中引入定义好的api,并导出
import Actions from <span data-raw-text="" "="" data-textnode-index-1656827066221="995" data-index-1656827066221="7884" class="character" style="margin: 0px; padding: 0px;">"@/api/index<span data-raw-text="" "="" data-textnode-index-1656827066221="995" data-index-1656827066221="7896" class="character" style="margin: 0px; padding: 0px;">";
// actions
const actions = {
  ...Actions,
};
export default {
  namespaced: true,
  actions,
};

使

// index.vue
import { mapActions } from <span data-raw-text="" "="" data-textnode-index-1656827066221="1021" data-index-1656827066221="8029" class="character" style="margin: 0px; padding: 0px;">"vuex<span data-raw-text="" "="" data-textnode-index-1656827066221="1021" data-index-1656827066221="8034" class="character" style="margin: 0px; padding: 0px;">";
created(){
  this.getArticleList()
},
methods: {
  ...mapActions(<span data-raw-text="" "="" data-textnode-index-1656827066221="1036" data-index-1656827066221="8097" class="character" style="margin: 0px; padding: 0px;">"modules/home<span data-raw-text="" "="" data-textnode-index-1656827066221="1036" data-index-1656827066221="8110" class="character" style="margin: 0px; padding: 0px;">", [<span data-raw-text="" "="" data-textnode-index-1656827066221="1038" data-index-1656827066221="8114" class="character" style="margin: 0px; padding: 0px;">"getArticleList<span data-raw-text="" "="" data-textnode-index-1656827066221="1038" data-index-1656827066221="8129" class="character" style="margin: 0px; padding: 0px;">"]),
}

Vuexvuexmodules使

...mapActions(<span data-raw-text="" "="" data-textnode-index-1656827066221="1046" data-index-1656827066221="8201" class="character" style="margin: 0px; padding: 0px;">"home<span data-raw-text="" "="" data-textnode-index-1656827066221="1046" data-index-1656827066221="8206" class="character" style="margin: 0px; padding: 0px;">", [<span data-raw-text="" "="" data-textnode-index-1656827066221="1048" data-index-1656827066221="8210" class="character" style="margin: 0px; padding: 0px;">"getArticleList<span data-raw-text="" "="" data-textnode-index-1656827066221="1048" data-index-1656827066221="8225" class="character" style="margin: 0px; padding: 0px;">"]),

nuxtmodules

mapActions(<span data-raw-text="" "="" data-textnode-index-1656827066221="1053" data-index-1656827066221="8262" class="character" style="margin: 0px; padding: 0px;">"modules/home<span data-raw-text="" "="" data-textnode-index-1656827066221="1053" data-index-1656827066221="8275" class="character" style="margin: 0px; padding: 0px;">", [<span data-raw-text="" "="" data-textnode-index-1656827066221="1055" data-index-1656827066221="8279" class="character" style="margin: 0px; padding: 0px;">"getArticleList<span data-raw-text="" "="" data-textnode-index-1656827066221="1055" data-index-1656827066221="8294" class="character" style="margin: 0px; padding: 0px;">"]),

SSR

nuxtheadvuedata

export defaul {
  data() {
      return {
        desc_seo_content: '描述',
        keywords_seo_content: '关键词',
        list:[]
      }
    }
  head() {
      return {
        title: this.title,
        meta: [
          {
            hid: 'description',
            name: 'description',
            content: this.desc_seo_content
          },
          {
            hid: 'keywords',
            name: 'keywords',
            content: this.keywords_seo_content
          }
        ]
      }
    }
}

使nuxtasyncDatacreated

asyncDatathisSEOasyncData

// 由于无法使用 this,所以 vuex 的辅助函数导出来的函数不能使用
// 但是 asyncData 会有一个 store 参数,所以我们可以直接使用 store.dispatch 来调用 actions
async asyncData({app, store, route, params, query, env, isDev,isHMR, redirect, error}) {
  // asyncData 有 10 个参数供我们使用
  try{
    // 因为我们的 SEO 依赖于 data 中的属性,所以需要定义和 data 一样的属性并 return 出去
    let list = [], desc_seo_content, keywords_seo_content
    const res = await store.dispatch(<span data-raw-text="" "="" data-textnode-index-1656827066221="1165" data-index-1656827066221="9349" class="character" style="margin: 0px; padding: 0px;">"modules/home/getArticleList<span data-raw-text="" "="" data-textnode-index-1656827066221="1165" data-index-1656827066221="9377" class="character" style="margin: 0px; padding: 0px;">");
    list = res.data
    desc_seo_content = res.desc_seo_content
    keywords_seo_content = res.keywords_seo_content
    return {list,desc_seo_content,keywords_seo_content}
  }catch(err) {
    console.log(err)
  }
}

SEOv-for=iteminlistli

metahidmetavue-meta

WindowDocument

WindowDocumentprocess.client

// 项目里封装的全屏滚动组件
mounted() {
  if (process.client) {
      let scrollObj = document.querySelector(<span data-raw-text="" "="" data-textnode-index-1656827066221="1206" data-index-1656827066221="9926" class="character" style="margin: 0px; padding: 0px;">"#my-swiper-contanier<span data-raw-text="" "="" data-textnode-index-1656827066221="1206" data-index-1656827066221="9947" class="character" style="margin: 0px; padding: 0px;">");
  }
}

使WindowDocument

pluginsnuxt.config.js

plugins: [
   {
     src:  <span data-raw-text="" "="" data-textnode-index-1656827066221="1221" data-index-1656827066221="10075" class="character" style="margin: 0px; padding: 0px;">"~/plugins/viewer<span data-raw-text="" "="" data-textnode-index-1656827066221="1221" data-index-1656827066221="10092" class="character" style="margin: 0px; padding: 0px;">",
     ssr: false
   }
  ],

prerender-spa-pluginhttps://www.npmjs.com/package/prerender-spa-plugin

vue-meta-infohttps://www.npmjs.com/package/vue-meta-info

vue-routerhttps://router.vuejs.org/zh/

https://jingyan.baidu.com/article/636f38bb5d49e797b84610a1.html

Nuxt.jshttps://www.nuxtjs.cn/

axioshttp://www.axios-js.com/

vue-metahttps://vue-meta.nuxtjs.org/api/#tagidkeyname

Nuxthttps://blog.csdn.net/weixin_40287511/article/details/123123802


0 (1).png

相关文章
|
19天前
|
JavaScript 数据可视化
vue-cli学习一:vue脚手架的 vue-cli2和vue-cli3版本 创建vue项目,vue的初始化详解
这篇文章介绍了如何使用vue-cli 2和3版本来创建Vue项目,并详细说明了两者之间的主要区别。
67 5
vue-cli学习一:vue脚手架的 vue-cli2和vue-cli3版本 创建vue项目,vue的初始化详解
|
12天前
|
JavaScript 容器
乾坤qiankun框架搭建 主应用为vue3的项目。
乾坤qiankun框架搭建 主应用为vue3的项目。
96 2
|
22天前
|
JavaScript
Vue CLi脚手架创建第一个VUE项目
Vue CLi脚手架创建第一个VUE项目
32 3
|
2天前
|
数据采集 监控 JavaScript
在 Vue 项目中使用预渲染技术
【10月更文挑战第23天】在 Vue 项目中使用预渲染技术是提升 SEO 效果的有效途径之一。通过选择合适的预渲染工具,正确配置和运行预渲染操作,结合其他 SEO 策略,可以实现更好的搜索引擎优化效果。同时,需要不断地监控和优化预渲染效果,以适应不断变化的搜索引擎环境和用户需求。
|
19天前
|
JavaScript 数据可视化
vue-cli学习二:vue-cli3版本 创建vue项目后,Runtime-Compiler和Runtime-only两个模式详解;vue项目管理器;配置文件的配置在哪,以及如何配置
这篇文章详细介绍了Vue CLI 3版本创建项目时的Runtime-Compiler和Runtime-only两种模式的区别、Vue程序的运行过程、render函数的使用、eslint的关闭方法,以及Vue CLI 2和3版本配置文件的不同和脚手架3版本创建项目的配置文件配置方法。
27 3
vue-cli学习二:vue-cli3版本 创建vue项目后,Runtime-Compiler和Runtime-only两个模式详解;vue项目管理器;配置文件的配置在哪,以及如何配置
|
6天前
|
JavaScript
如何在 Vue 项目中选择合适的模块格式
【10月更文挑战第20天】选择合适的模块格式需要综合考虑多个因素,没有一种绝对正确的选择。需要根据项目的具体情况进行权衡和分析。在实际选择过程中,要保持灵活性,根据项目的发展和变化适时调整模块格式。
15 7
|
1天前
Vue3 项目的 setup 函数
【10月更文挑战第23天】setup` 函数是 Vue3 中非常重要的一个概念,掌握它的使用方法对于开发高效、灵活的 Vue3 组件至关重要。通过不断的实践和探索,你将能够更好地利用 `setup` 函数来构建优秀的 Vue3 项目。
|
6天前
|
JavaScript 前端开发 编译器
在 Vue 项目中使用 ES 模块格式的优点
【10月更文挑战第20天】在 Vue 项目中使用 ES 模块格式具有众多优点,这些优点共同作用,使得项目能够更高效、更可靠地开发和运行。当然,在实际应用中,还需要根据项目的具体情况和需求进行合理的选择和配置。
16 6
|
1天前
|
JavaScript 测试技术 UED
解决 Vue 项目中 Tree shaking 无法去除某些模块
【10月更文挑战第23天】解决 Vue 项目中 Tree shaking 无法去除某些模块的问题需要综合考虑多种因素,通过仔细分析、排查和优化,逐步提高 Tree shaking 的效果,为项目带来更好的性能和用户体验。同时,持续关注和学习相关技术的发展,不断探索新的解决方案,以适应不断变化的项目需求。
|
11天前
|
缓存 JavaScript 前端开发
《基础篇第4章:vue2基础》:使用vue脚手架创建项目
《基础篇第4章:vue2基础》:使用vue脚手架创建项目
46 3