vue3.2+vite+elementPlus,build引入CDN依赖包,提升打包速率,vite-plugin-cdn-import

news2024/11/19 19:22:17

一.概述

  1. 使用CDN的好处
  2. 缓解服务器的压力,将首屏加载时的请求分摊给其它的服务器
  3. 优化打包后verdor.js过大问题
  4. 加快首屏加载速度
  5. 加快打包速度
  6. 尤其是Vue3新的Tree-Shaking技术,只打包需加载的模块module,搭配CDN后如虎添翼!

二.CDN网站分享

根据需要自行切换相关CDN
依赖引用并非全部可用,有的js会不兼容, 自行尝试通过可用后在进行引用操作!

  1. 国内
    BootCdn网站 https://www.bootcdn.cn/
    七牛云 http://staticfile.org/

  2. 国外
    unpkg网站 https://unpkg.com
    cdnjs网站 https://cdnjs.com/
    jsdelivr网站 https://www.jsdelivr.com/

vite-plugin-cdn-import:cdn的引入插件

npm i vite-plugin-cdn-import
or
pnpm i vite-plugin-cdn-import

vite.config.js

// import { autoComplete, Plugin as importToCDN } from 'vite-plugin-cdn-import'// 引入cdn
import { Plugin as importToCDN } from 'vite-plugin-cdn-import'

plugins: [
  vue(),
  eslint({
    // 配置项
    // include: ['src/**/*.js', 'src/**/*.vue', 'src/**/*.jsx', 'src/**/*.ts'],
    // exclude: ['./node_modules/**'],
    cache: false // 禁用eslint缓存
  }),
  // 自动导入 element-plus
  // AutoImport({
  //   resolvers: [ElementPlusResolver()]
  // }),
  // Components({
  //   resolvers: [ElementPlusResolver()]
  // }),
  // build生成分析工具
  visualizer({
    emitFile: true, // 打包后的分析文件会出现在打包好的文件包下
    filename: 'state.html', // 分析图生成的文件名
    open: true // 如果存在本地服务端口,将在打包后自动展示
    // sourcemap: true// 使用sourcemap计算大小
  }),
  // 第三方库CDN引入
  importToCDN({
    prodUrl: 'https://unpkg.com/{name}@{path}',
    modules: [
      // autoComplete('vue'),
      // autoComplete('axios'),
      // {
      //   name: 'vue',
      //   var: 'Vue',
      //   path: 'https://unpkg.com/vue@3.3.4'
      // },
      {
        name: 'vue',
        var: 'Vue',
        path: '3.3.4'
      },
      {
        name: 'vue-demi', // vue版本选好 不然会报错
        var: 'VueDemi',
        path: '0.14.5'
      },
      {
        name: 'vue-router',
        var: 'VueRouter',
        path: '4.2.2'
      },
      {
        name: 'element-plus',
        var: 'ElementPlus',
        path: '2.3.6',
        css: '2.3.6/dist/index.css'
      },
      {
        name: '@element-plus/icons-vue',
        var: 'ElementPlusIconsVue', // 根据main.js中定义的来
        path: '2.1.0'
      },
      {
        name: 'pinia',
        var: 'Pinia',
        path: '2.1.3'
      }
    ]
  })
],

使用cdn 引入 element-plus 一定也要用cdn 引入 vue、vue-demi 并且引入顺序不能出错,

  1. 如果不引入vue-demi,可以理解为vue和vue-demi 是互相引用的关系
    在这里插入图片描述

  2. 注意使用vite-plugin-cdn-import插件 不能按需引入element、直接在main.ts中使用全局引入的方式,打包后会自动按照cdn引入

main.ts

// import { App, createApp } from 'vue'
import { createApp } from 'vue'
// import "./style.css";
import AppData from './App.vue'
// routes
import router from './router/index'
import { createPinia } from 'pinia'
// 样式重置
import 'normalize.css'
import '@/assets/styles/index.scss'

import ElementPlus from 'element-plus'
// import * as icons from '@element-plus/icons'
// import 'element-plus/dist/index.css'//cdn 自动载入

import * as ElementPlusIconsVue from '@element-plus/icons-vue'

const pinia = createPinia()
const app = createApp(AppData)
app.use(router)
app.use(ElementPlus)
app.use(pinia)
app.mount('#app')

for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
  app.component(key, component)
}

最终打包展示

在这里插入图片描述

完整代码

import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
// import AutoImport from 'unplugin-auto-import/vite'
// import Components from 'unplugin-vue-components/vite'
// import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
// import postCssPxToRem from 'postcss-pxtorem'
import eslint from 'vite-plugin-eslint' // 新增

import { resolve } from 'path'
// import path from 'path' // 配置文件路径相关时,需要用到此项  由于node不支持ts,需要安装依赖以便支持 需执行如下命令 npm install @types/node --save-dev
import { visualizer } from 'rollup-plugin-visualizer'// 分析优化
// import { autoComplete, Plugin as importToCDN } from 'vite-plugin-cdn-import'// 引入cdn
import { Plugin as importToCDN } from 'vite-plugin-cdn-import'

// https://vitejs.dev/config/
export default defineConfig(({ command, mode }) => {
  const env = loadEnv(mode, process.cwd()) // 获取.env文件里定义的环境变量
  console.log('command', command, 'mode', mode, 'env', env)
  // ****打包文件名称****
  let fileName = 'dist'
  // 兼容性,以防打包崩溃
  fileName = env.VITE_APP_NAME

  return {
    base: env.VITE_ENV === 'production' ? './' : './', // 静态路径访问地址
    build: {
      outDir: fileName,
      assetsDir: 'static', // 指定生成静态资源的存放路径
      emptyOutDir: true, // 清除输出目录
      // 设置为 false 可以禁用最小化混淆,或是用来指定使用哪种混淆器。默认为 Esbuild,它比 terser 快 20-40 倍,压缩率只差 1%-2%
      // npm add -D terser
      minify: 'terser', // boolean | 'terser' | 'esbuild',混淆:terser,false是否压缩代码
      sourcemap: true, // 构建后是否生成 source map 文件
      target: 'esnext',
      terserOptions: {
        compress: {
          // drop_console: true, // 生产环境去掉控制台 console
          // drop_debugger: true, // 生产环境去掉控制台 debugger 默认就是true
          // dead_code: true // 删除无法访问的代码 默认就是true
        }
      },
      // 文件超过500Kb解决办法
      chunkSizeWarningLimit: 1024 * 50,
      rollupOptions: {
        output: {
          // 最小化拆分包
          manualChunks (id) {
            if (id.includes('node_modules')) {
              return id.toString().split('node_modules/')[1].split('/')[0].toString()
            }
          },
          // dist下面的assets文件下,里面既有js、css等等。因此,可以将不同的文件放在不同的文件下,这样比较好。
          // 拆分js到模块文件夹
          chunkFileNames: (chunkInfo) => {
            const facadeModuleId = chunkInfo.facadeModuleId
              ? chunkInfo.facadeModuleId.split('/')
              : []
            const fileName1 = facadeModuleId[facadeModuleId.length - 2] || '[name]'
            return `js/${fileName1}/[name].[hash].js`
          },
          // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值
          entryFileNames: 'js/[name].[hash].js',
          // 用于输出静态资源的命名,[ext]表示文件扩展名
          assetFileNames: '[ext]/[name].[hash:4].[ext]'
        }
      }
    },
    plugins: [
      vue(),
      eslint({
        // 配置项
        // include: ['src/**/*.js', 'src/**/*.vue', 'src/**/*.jsx', 'src/**/*.ts'],
        // exclude: ['./node_modules/**'],
        cache: false // 禁用eslint缓存
      }),
      // 自动导入 element-plus
      // AutoImport({
      //   resolvers: [ElementPlusResolver()]
      // }),
      // Components({
      //   resolvers: [ElementPlusResolver()]
      // }),
      // build生成分析工具
      visualizer({
        emitFile: true, // 打包后的分析文件会出现在打包好的文件包下
        filename: 'state.html', // 分析图生成的文件名
        open: true // 如果存在本地服务端口,将在打包后自动展示
        // sourcemap: true// 使用sourcemap计算大小
      }),
      // 第三方库CDN引入
      importToCDN({
        prodUrl: 'https://unpkg.com/{name}@{path}',
        modules: [
          // autoComplete('vue'),
          // autoComplete('axios'),
          // {
          //   name: 'vue',
          //   var: 'Vue',
          //   path: 'https://unpkg.com/vue@3.3.4'
          // },
          {
            name: 'vue',
            var: 'Vue',
            path: '3.3.4'
          },
          {
            name: 'vue-demi', // vue版本选好 不然会报错
            var: 'VueDemi',
            path: '0.14.5'
          },
          {
            name: 'vue-router',
            var: 'VueRouter',
            path: '4.2.2'
          },
          {
            name: 'element-plus',
            var: 'ElementPlus',
            path: '2.3.6',
            css: '2.3.6/dist/index.css'
          },
          {
            name: '@element-plus/icons-vue',
            var: 'ElementPlusIconsVue', // 根据main.js中定义的来
            path: '2.1.0'
          },
          {
            name: 'pinia',
            var: 'Pinia',
            path: '2.1.3'
          }
        ]
      })
    ],
    resolve: {
      // 配置路径别名
      alias: {
        '@': resolve(__dirname, './src')
        // '@': path.resolve(__dirname, 'src') // 用 @ 符号替换 src 文件路径
      }
    },
    css: {
      // 此代码为适配移动端px2rem
      // postcss: {
      //   plugins: [
      //     postCssPxToRem({
      //       rootValue: 37.5, // 1rem的大小(控制1rem的大小  点位:px)
      //       propList: ["*"], // 需要转换的属性,这里选择全部都进行转换
      //     }),
      //   ],
      // },
    },
    server: {
      host: '0.0.0.0',
      port: 3001, // 端口号
      open: false, // 是否自动打开浏览器
      // 跨域代理
      proxy: {
        // 字符串简写写法
        '/foo': 'http://localhost:4567',
        // 选项写法
        '/api': {
          target: 'http://jsonplaceholder.typicode.com',
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/api/, '')
        }
        // // 正则表达式写法
        // '^/fallback/.*': {
        //   target: 'http://jsonplaceholder.typicode.com',
        //   changeOrigin: true,
        //   rewrite: (path) => path.replace(/^\/fallback/, '')
        // },
        // // 使用 proxy 实例
        // '/api': {
        //   target: 'http://jsonplaceholder.typicode.com',
        //   changeOrigin: true,
        //   configure: (proxy, options) => {
        //     // proxy 是 'http-proxy' 的实例
        //   }
        // }
      }
    }
  }
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/699532.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【easyswoole代码自动生成crud】我写了一个控制器用来生成增删改查

easyswoole代码自动生成crud 根据表生成模型和控制器根据表生成模型根据表生成控制器控制器模板核心控制器代码curd.php 根据表生成模型和控制器 会在 App/Model目录下生成驼峰方式命名的模型文件 会在App/HttpController/Api 目录下生成驼峰方式命名的控制文件 curl http:lo…

React V6分环境打包

功能背景 例如想要在react也要实现不同环境使用不同的api接口地址这样的想法,那么就需要根据命令自动区分环境了。 代码实现 比如我这又三种环境,那么创建三个文件,如图: 分别是dev:开发环境,formal:UAT环境…

【力扣】DP:1186. 删除一次得到子数组最大和

【力扣】DP:1186. 删除一次得到子数组最大和 文章目录 【力扣】DP:1186. 删除一次得到子数组最大和1. 题目描述2. 题解2.1 不可行2.2 DP 参考 1. 题目描述 给你一个整数数组,返回它的某个非空子数组(连续元素)在执行一…

画一个足球场,尺寸已标注好

画一个有标注的足球场 上面是一个带有标注的足球场俯视图,下面是实现代码。 import matplotlib.pyplot as plt from matplotlib.patches import Arc, Circle, Rectangle# 创建一个灰色背景的子图 fig, ax plt.subplots(facecolorgrey)# 设置x轴和y轴的范围 ax.set…

基于PaddleOCR的工件字符识别

目录 1.工业工件字符识别 1.2 难点 1.3 基于深度学习的OCR技术 2.基于Paddleocr的字符识别 🌟 特性 2.1 PP-OCRv3介绍 3.本文工件字符识别数据集介绍 4.PaddleOCR工件字符 4.1 字符检测 1.工业工件字符识别 在复杂的工业制造环境中,为了更好的追踪…

SAP-MM未清PO调取

SAP未清PO调取 SAP查询open PO(未清采购清单)可以通过ME2M(PO per material),ME2L(PO per vendor),ME2N(PO per document number)进行查询。 未清订单一般指未完成收货或者已收货未完成发票校验的订单,在输入以上任一事务代码之后,在选择参数Selection Parameters…

十二、项目总结

项目总结 B站直达【为尚硅谷点赞】: https://www.bilibili.com/video/BV1Ya411S7aT 本博文以课程相关为主发布,并且融入了自己的一些看法以及对学习过程中遇见的问题给出相关的解决方法。一起学习一起进步!!! 文章目录 项目总结1…

在 Jetpack Compose 中创建 Drawer

Jetpack Compose 是一个现代的构建 Android UI 的工具集,它使得构建 UI 变得更加简单快速。在本篇博客中,我们将讨论如何在 Jetpack Compose 中创建 Drawer,也就是我们常见的侧边抽屉。 什么是 Drawer? Drawer 是一个提供导航选项…

【C++学习】STL容器——string

一、STL简介 1.1 什么是STL STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 1.2 STL的版本 原始版本 Alexander Stepanov、Meng Lee 在惠普实验室…

java的final变量

Java在声明一个变量时,如果声明为final的,那么这个变量只能被赋值一次,赋值以后变量的值不能改变。 如果final变量指向一个对象的引用,对象的状态可以改变,但final变量始终指向同一对象的引用。 这个也规则也适用于数组…

第十八章 MobileViT网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

代码随想录算法训练营第五十一天

第一题、买卖股票的最佳时机含冷冻期 力扣题目链接 class Solution { public:int maxProfit(vector<int>& prices) {if(prices.size() 0) return 0;vector<vector<int>> dp(prices.size(), vector<int>(4, 0));dp[0][0] -prices[0];dp[0][1] d…

JVM GC ROOT分析与垃圾收集器原理分析(四)

目录 一、GC ROOT 1、虚拟机栈中的本地变量 2、static 成员 3、常量引用 4、本地方法栈中的变量 5、类加载器 6、线程 二、回收算法 1、标记和清除 2、复制算法 3、标记整理 三、垃圾收集器 1、新生代-复制算法 2、老年代-标记清除/整理 3、垃圾收集器分类 1、…

频数分析拟合优度卡方检验

一、案例介绍 某医学美容院对某年425位顾客抱怨原因进行了分析&#xff0c;结果见下表&#xff0c;现在想知道这四种抱怨原因的构成比是否有差异&#xff1f; 二、问题分析 本案例的分析目的是研究四种抱怨原因的构成比是否存在差异&#xff0c;抱怨原因为定类数据&#xff0…

Spring Boot 中的 EhCacheCacheManager 是什么,原理,如何使用

Spring Boot 中的 EhCacheCacheManager 是什么&#xff0c;原理&#xff0c;如何使用 前言 在现代化的应用程序中&#xff0c;缓存是提高性能的关键所在。缓存可以降低数据库的负载&#xff0c;提高响应速度&#xff0c;减少资源消耗。Spring Boot提供了多种缓存管理器&#…

结合GPS的SAT图道路识别

文章目录 2019 Leveraging Crowdsourced GPS Data for Road Extraction from Aerial Imagery基本介绍对GPS的使用关于怎么证明GPS信息有效How to render gps to imageGPS信息简介GPS点状特征GPS其他特征挖掘 可借鉴的点 2020 Convolutional Recurrent Network for Road Boundar…

《黑马头条》SpringBoot+SpringCloud+ Nacos等企业级微服务架构项目

环境搭建、SpringCloud微服务(注册发现、服务调用、网关) 1)课程对比 2)项目概述 2.1)能让你收获什么 2.2)项目课程大纲 2.3)项目概述 随着智能手机的普及&#xff0c;人们更加习惯于通过手机来看新闻。由于生活节奏的加快&#xff0c;很多人只能利用碎片时间来获取信息&#x…

红帽认证考试流程详解,让你少走弯路

参加红帽认证考试涉及以下三个流程 账号和证件的准备 1 RHN 账号注册 考试前需要您提前注册红帽帐号(RHN) 注册地址&#xff1a;https://www.redhat.com/wapps/ugc/register.html 注册时以下条目请重点注意&#xff1a; ▸ 账户类型选择 Personal ▸ 红帽账户登录名…

onnx修改模型节点【改变input的shape】

因为转onnx后模型的输入无法转rknn&#xff0c;所以要对onnx进行节点修改成左边 import onnx import onnx.helper as helper from onnx.helper import TensorProto import numpy as npmodel onnx.load(demo.change.onnx) #自己创建新的节点 ###############################…

【LeetCode热题100】打卡第29天:二叉树的层序遍历二叉树的最大深度

文章目录 【LeetCode热题100】打卡第29天&#xff1a;二叉树的层序遍历&二叉树的最大深度⛅前言 二叉树的层序遍历&#x1f512;题目&#x1f511;题解 二叉树的最大深度&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第29天&#xff1a;二叉树的层序遍历&am…