打包优化之vite构建(视图分析、CDN引入、依赖分包、gzip压缩)

Vite -构建优化 - 分包策略 + 打包压缩 Vite 构建的优化配置 : 分包策略 + 打包压缩 阅读详情


前言

之前开发项目后,每次构建的时候都会经历较长时间的等待,且打包后文件加载速度慢的情况,结合最近vite+vue3项目构建优化,总结下构建优化方案,如有更好方案,欢迎各位大佬分享。

一、视图分析

工欲善其事必先利其器,构建优化也是,需要先知道项目代码的整体情况
Rollup 插件可视化工具rollup-plugin-visualizer,构建后可视化并分析你的 Rollup 包,看看哪些模块占用了空间。使用方法如下:

  • 依赖安装
npm i rollup-plugin-visualizer -D
  • 依赖引入并使用
import { visualizer } from 'rollup-plugin-visualizer';
export default defineConfig({
  plugins: [vue(), visualizer({
     emitFile: false,
     filename: 'analysis-chart.html', // 分析图生成的文件名
     open:true // 如果存在本地服务端口,将在打包后自动展示
   })],
})
  • 构建后会显示具体项目资源情况
    当前项目构建后可看到element-plus和Echarts最大,可使用CDN引入方式优化
    分析视图

二、CDN引入(减少构建时间,加快加载速度)

CDN 是构建在数据网络上的一种分布式的内容分发网。
CDN的作用是采用流媒体服务器集群技术,克服单机系统输出带宽及并发能力不足的缺点,可极大提升系统支持的并发流数目,减少或避免单点失效带来的不良影响。

Tips :有以下两种配置方式,可根据个人习惯使用对应配置,不过需要注意如果CDN的资源出现错误,那么所引入的项目也会出现错误,建议把资源都Down到本地,然后在引入本地的链接,保证不会被所引入资源报错影响
开发环境不走CDN,只有构建后走

常见cdn网站

  • UNPKG:https://unpkg.com
  • jsDelivr :https://www.jsdelivr.com

具体怎样查找库cdn包的路径呢,以 为例element-plus: @2.2.32

直接按照此格式访问 https://unpkg.com/element-plus@2.2.32链接得到 https://unpkg.com/element-plus@2.3.4/dist/index.full.js即是对应的cdn包路径了

jsDelivr 的格式为https://cdn.jsdelivr.net/npm/package@version
即https://cdn.jsdelivr.net/npm/element-plus@2.2.32

①通过vite-plugin-cdn-import

  • 依赖安装
npm i vite-plugin-cdn-import -D
  • 使用方法及引入
    如果需要引入自动配置 需引入autoComplete使用,具体可自动配置可看源码(ctrl+左键点击查看)了解

以最近项目为例,具体配置如下
vite.config.ts文件

import { fileURLToPath, URL } from 'node:url'
import { resolve } from 'path'
import { defineConfig, loadEnv, splitVendorChunkPlugin, type PluginOption } from 'vite'

// import importToCDN from 'vite-plugin-cdn-import'
import { autoComplete, Plugin as importToCDN } from 'vite-plugin-cdn-import';
export default defineConfig(({ command, mode }) => {
  const env = loadEnv(mode, `${process.cwd()}/env`, '')
  return {
    base: '/',
    plugins: [
      vue(),
      ...
      // Tips:如果出现 CDN 配置的资源无法访问需修改配置或者可先不使用 importToCDN 
      importToCDN({
		// prodUrl:可选,默认指向 https://cdn.jsdelivr.net/npm/{name}@{version}/{path}
        // 可使用这种格式 https://cdn.jsdelivr.net/npm/element-plus@2.2.32 查看是否存在 例如打开浏览器访问得到  https://cdn.jsdelivr.net/npm/element-plus@2.2.32/dist/index.full.js
        // 也可指向 'https://unpkg.com/{name}@{version}/{path}'、本地根目录、获取自己的服务器 等
        // prodUrl: '/{path}', // 根目录 需要格外注意配置路径是否正确,且需要把资源先down下来
        // prodUrl: 'https://xxx.com/{name}@{version}/{path}', // 自己的服务器上
        prodUrl: 'https://unpkg.com/{name}@{version}/{path}', // https://unpkg.com/
        modules: [
          autoComplete('vue'),
          autoComplete('axios'),
          autoComplete('lodash'),
          {
            name: 'element-plus',
            // ElementPlus 为什么不是同下面第二种配置的elementPlus是因为这个配置同CDN资源一致,而下面的配置同需同main.ts的引入名称一致
            var: 'ElementPlus', // 外部化的依赖提供一个全局变量 同rollupOptions配置中的globals的值
            // https://unpkg.com/element-plus@2.2.32/dist/index.full.js 或者 dist/index.full.js
            path: 'dist/index.full.js',
            // 可选
            css: 'dist/index.css'
          },
          {
            name: 'vue-i18n',
            var: 'VueI18n',
            path: 'dist/vue-i18n.global.prod.js',
          },
          {
            name: 'vue-router',
            var: 'VueRouter',
            path: 'dist/vue-router.global.js'
          },
          // VueDemi这个是pinia用来判断是vue2还是vue3所需要的,要额外引入一下
          {
            name: 'vue-demi',
            var: 'VueDemi',
            path: 'https://unpkg.com/vue-demi@0.13.1/lib/index.iife.js'
          },
          {
            name: 'pinia',
            var: 'Pinia',
            path: 'dist/pinia.iife.js'
          },
          // echarts,只有配置全局的时候有效,不然构建的时候还是会打包执行。也可以把echarts处理成按需引入
          {
            name: 'echarts',
            var: 'echarts',
            path: 'dist/echarts.js'
          },
          // echarts 内使用了
          {
            name: 'zrender',
            var: 'zrender ',
            path: 'dist/zrender.js'
          },
        ],
      }),
    ],
    ...
  }
})

Tips:可能在构建后有时候会报以下错误,具体需要看上面代码的var是否为CDN全局定义字段,下面截图是本人在首次配置期间遇到的
需要考虑依赖之间支付存在关联,如果有,需要同时配置
且需要考虑配置的Var是否合理
在这里插入图片描述
在这里插入图片描述

②通过rollup-plugin-external-globals插件

这种方式需要单独在index.html中引入cdn资源

配置期间遇到的问题
  • 先说下本人配置期间遇到的问题,找了很久终于发现的问题所在,下面是问题描述

为啥老是提示这个错误???
多次构建验证发现externalGlobals得配置的值需要和CDN引入的全局定义一致,不然就会报错(例如Vue、VueRouter等)
caught TypeError: Failed to resolve module specifier "vue". Relative references must start with either "/", "./", or "../".
在这里插入图片描述

caught TypeError: Failed to resolve module specifier "vue". Relative references must start with either "/", "./", or "../".

例如配置Vue CDN: https://unpkg.com/vue@3.2.45/dist/vue.global.prod.js,则需要配置为"Vue",如图

在这里插入图片描述

具体配置

需要安装个 rollup-plugin-external-globals插件

npm i rollup-plugin-external-globals -D

废话不多说直接上代码,即rollupOptions部分

`vite.config.ts`文件配置如下
```ts
import externalGlobals from 'rollup-plugin-external-globals';
...
build: {
	minify: "terser", // 必须开启:使用 terserOptions 才有效果
	terserOptions: {
	  compress: {
	    drop_console: process.env.NODE_ENV === 'production' ? true : false,
	    drop_debugger: process.env.NODE_ENV === 'production' ? true : false,
	  },
	},
	rollupOptions: {
	  // 确保外部化处理那些你不想打包进库的依赖
	  external: [
	    'vue',
        'vue-i18n',
        'vue-router',
        'element-plus',
        // VueDemi这个是pinia用来判断是vue2还是vue3所需要的,要额外引入一下
        'vue-demi',
        'pinia',
	  ],
	  plugins: [
	    // vue: 'Vue' --- vue为依赖包名  Vue为项目构建后的全局变量
	    // 同上,给外部化的依赖提供一个全局变量,即配置在external得值
	    externalGlobals({
	      vue: 'Vue',
	      'vue-i18n': 'VueI18n',
	      'vue-router': 'VueRouter',
	      elementPlus: 'element-plus',
	      // VueDemi这个是pinia用来判断是vue2还是vue3所需要的,要额外引入一下
	      'vue-demi': 'VueDemi',
	      pinia: 'createPinia',
	    })
	  ],
  },
},

这种配置需要再在inde.html文件手动引入对应CDN文件资源

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <script src="https://unpkg.com/vue@3.2.45/dist/vue.global.prod.js"></script>
    <script src="https://unpkg.com/axios@1.3.3/dist/axios.min.js"></script>
    <script src="https://unpkg.com/vue-i18n@9.3.0-beta.16/dist/vue-i18n.global.prod.js"></script>
    <script src="https://unpkg.com/vue-router@4.1.6/dist/vue-router.global.prod.js"></script>
    <script src="https://unpkg.com/element-plus@2.2.32/dist/index.full.js"></script>
    <script src="https://unpkg.com/vue-demi@0.13.1/lib/index.iife.js"></script>
    <script src="https://unpkg.com/pinia@2.0.28/dist/pinia.iife.js"></script>
    <!-- <script src="https://unpkg.com/echarts@5.4.1/dist/echarts.js"></script> -->
    <link rel="icon" href="/src/assets/favicon.ico">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>SIS</title>
  </head>
  <body>
    <div id="app"></div>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>

构建后的资源如图
在这里插入图片描述

三、依赖分包

当未配置构建工具的分包功能,构建的后的资源将会较大且是独立的一个js and css 文件,这样就会存在本地加载文件的压力
vite底层集成了rollup的功能,我们可以直接配置即可,具体可去官网查看更详细配置

build: {
      minify: "terser", // 必须开启:使用 terserOptions 才有效果
      terserOptions: {
        compress: {
          drop_console: process.env.NODE_ENV === 'production' ? true : false,
          drop_debugger: process.env.NODE_ENV === 'production' ? true : false,
        },
      },
      rollupOptions: {
        // 静态资源分类打包
        output: {
          // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量
          globals: {},
          chunkFileNames: 'static/js/[name]-[hash].js',
          entryFileNames: 'static/js/[name]-[hash].js',
          assetFileNames: 'static/[ext]/[name]-[hash].[ext]',
          manualChunks(id) { // 静态资源分拆打包
            if (id.includes('node_modules')) {
              return id.toString().split('node_modules/')[1].split('/')[0].toString();
            }
          }
        }
      },
    },

配置拆包后构建文件如下:
在这里插入图片描述

四、开启gzip压缩

gzip是现今Internet 上使用非常普遍的一种数据压缩格式(一种文件格式)。

HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指www服务器中安装的一个功能,当有人来访问这个服务器中的网站时,服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来.一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来.当然这也会增加服务器的负载.
一般服务器中都安装有这个功能模块的。

如上描述,gzip不只是我们需要在打包的时候生成,还得在服务器开

那么我们先处理打包的时候进入gzip压缩

  • 安装插件
npm i vite-plugin-compression -D
  • 引用方式

Tips:配置过程中有个小插曲插件源码上备注说明如下,由于英文水平有限,Whether to enable compression,使用翻译软件为是否启用压缩,可实际配置之后发现应该是是否禁用压缩的意思

	...
    /**
     * Whether to enable compression
     * @default: false
     */
    disable?: boolean;
    ...

在vite.config.ts文件引入如下:

...
import viteCompression from 'vite-plugin-compression';
...
export default defineConfig(({ command, mode }) => {
  const env = loadEnv(mode, `${process.cwd()}/env`, '')
  return {
    mode,
    // env配置文件变量前缀
    envPrefix: 'SIS_',
    // env配置文件夹位置
    envDir: 'env',
    // 构建后文件引用 相对路径
    // base: env.SIS_PUBLIC_PATH, // 同webpack assetsPublicPath
    base: '/',
    plugins: [
      vue(),
      ...
      // 构建压缩文件
      viteCompression({
        // 记录压缩文件及其压缩率。默认true
        verbose: true,
        // 是否启用压缩,默认false
        disable: false,
        // 需要使用压缩前的最小文件大小,单位字节(byte) b,1b(字节)=8bit(比特), 1KB=1024B
        threshold: 10240, // 即10kb以上即会压缩
        // 压缩算法 可选 'gzip' | 'brotliCompress' | 'deflate' | 'deflateRaw'
        algorithm: 'gzip',
        // 压缩后的文件格式
        ext: '.gz',
      }),
      ...
	]
  }
})
  • 服务器开启gzip

这里使用nginx来做服务器
具体需要在location /位置配置gzip_static on; ,配置如下

		location / {
            try_files $uri $uri/ @router;#需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
            index index.html index.htm;

            gzip_static on;
        }
        #对应上面的@router,主要原因是路由的路径资源并不是一个真实的路径,所以无法找到具体的文件
        #因此需要rewrite到index.html中,然后交给路由在处理请求资源
        location @router {
            rewrite ^.*$ /index.html last;
        }
  • 配置后访问页面显示
    如果页面资源请求头有Content-Encoding: gzip和响应头有Accept-Encoding: gzip, deflate, br,且可以看到文件大小使用压缩后小了很多即配置成功

在这里插入图片描述
压缩前为 99.2kb
在这里插入图片描述
压缩前为 14.4kb
在这里插入图片描述

五、最终配置

根据上述四个步骤最终配置如下,话不多说,直接上完整vite.config.ts配置

import { fileURLToPath, URL } from 'node:url'
import { resolve } from 'path'
import { defineConfig, loadEnv, splitVendorChunkPlugin, type PluginOption } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueJsx from '@vitejs/plugin-vue-jsx'
const getProxyConfig = require('./build/proxy');
import viteCompression from 'vite-plugin-compression';
import htmlPlugin from "vite-plugin-html-config";
import { visualizer } from 'rollup-plugin-visualizer';
// import importToCDN from 'vite-plugin-cdn-import'
import { autoComplete, Plugin as importToCDN } from 'vite-plugin-cdn-import';
import externalGlobals from 'rollup-plugin-external-globals';
// https://vitejs.dev/config/
export default defineConfig(({ command, mode }) => {
  const env = loadEnv(mode, `${process.cwd()}/env`, '')
  Object.assign(process.env, env, { NODE_ENV: mode })
  return {
    mode,
    // env配置文件变量前缀
    envPrefix: 'SIS_',
    // env配置文件夹位置
    envDir: 'env',
    // 构建后文件引用 相对路径
    // base: env.SIS_PUBLIC_PATH, // 同webpack assetsPublicPath
    base: '/',
    plugins: [
      vue(),
      vueJsx(),
      // splitVendorChunkPlugin(),
      // 构建压缩文件
      viteCompression({
        // 记录压缩文件及其压缩率。默认true
        verbose: true,
        // 是否启用压缩,默认false
        disable: false,
        // 需要使用压缩前的最小文件大小,单位字节(byte) b,1b(字节)=8bit(比特), 1KB=1024B
        threshold: 10240, // 即10kb以上即会压缩
        // 压缩算法 可选 'gzip' | 'brotliCompress' | 'deflate' | 'deflateRaw'
        algorithm: 'gzip',
        // 压缩后的文件格式
        ext: '.gz',
      }),
      // 构建时间
      htmlPlugin({
        metas:[
          {
            name: "builtTime",
            content: new Date().toLocaleString(),
          }
        ]
      }),
      visualizer({
        emitFile: false,
        filename: 'analysis-chart.html', // 分析图生成的文件名
        open:true // 如果存在本地服务端口,将在打包后自动展示
      }) as PluginOption,
      // Tips:如果出现 CDN 配置的资源无法访问需修改配置或者可先不使用 importToCDN 
      importToCDN({
        // 可选 配置期间可用来查看需要处理的依赖是否存在 例如  https://unpkg.com/element-plus@2.2.32
        prodUrl: 'https://unpkg.com/{name}@{version}/{path}',
        modules: [
          autoComplete('vue'),
          autoComplete('axios'),
          autoComplete('lodash'),
          {
            name: 'element-plus',
            var: 'ElementPlus', // 外部化的依赖提供一个全局变量 同rollupOptions配置中的external的值
            // https://unpkg.com/element-plus@2.2.32/dist/index.full.js 或者 dist/index.full.js
            path: 'dist/index.full.js',
            // 可选
            css: 'dist/index.css'
          },
          {
            name: 'vue-i18n',
            var: 'VueI18n',
            path: 'dist/vue-i18n.global.prod.js',
          },
          {
            name: 'vue-router',
            var: 'VueRouter',
            path: 'dist/vue-router.global.js'
          },
          // VueDemi这个是pinia用来判断是vue2还是vue3所需要的,要额外引入一下
          {
            name: 'vue-demi',
            var: 'VueDemi',
            path: 'https://unpkg.com/vue-demi@0.13.1/lib/index.iife.js'
          },
          {
            name: 'pinia',
            var: 'Pinia',
            path: 'dist/pinia.iife.js'
          },
          // {
          //   name: 'echarts',
          //   var: 'Echarts',
          //   path: 'dist/echarts.js'
          // },
          // {
          //   name: 'zrender',
          //   var: 'zrender ',
          //   path: 'dist/zrender.js'
          // },
        ],
      }),
    ],
    resolve: {
      alias: {
        '@': fileURLToPath(new URL('./src', import.meta.url))
      }
    },
    server: {
      // host设置为true才可以使用network的形式,以ip访问项目
      host: true,
      port: 8082,
      open: false,
      hmr: {
        overlay: false
      },
      // 跨域设置允许
      cors: false,
      // 如果端口已占用直接退出
      strictPort: false,
      proxy: getProxyConfig()
    },
    // css全局配置
    css: {
      preprocessorOptions: {
        // less: {
        //     javascriptEnabled: true,
        //     additionalData:  `@import "${resolve(__dirname, 'src/assets/styles/base.less')}";`
        // }
        less: {
          modifyVars: {
            hack: `true; @import (reference) "${resolve('src/assets/styles/variables.less')}";`,
          },
          javascriptEnabled: true
        }
      }
    },
    build: {
      minify: "terser", // 必须开启:使用 terserOptions 才有效果
      terserOptions: {
        compress: {
          drop_console: process.env.NODE_ENV === 'production' ? true : false,
          drop_debugger: process.env.NODE_ENV === 'production' ? true : false,
        },
      },
      chunkSizeWarningLimit: 1024, // 文件最大报警阈值设置
      rollupOptions: {
        // 静态资源分类打包
        output: {
          // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量
          globals: {},
          chunkFileNames: 'assets/js/[name]-[hash].js',
          entryFileNames: 'assets/js/[name]-[hash].js',
          assetFileNames: 'assets/[ext]/[name]-[hash].[ext]',
          manualChunks(id) { // 静态资源分拆打包
            if (id.includes('node_modules')) {
              return id.toString().split('node_modules/')[1].split('/')[0].toString();
            }
          }
        }
      },
    },
  }
})

–

总结

1、视图分析可帮助我们在构建后清晰的了解项目资源情况(rollup-plugin-visualizer插件的引入)
2、CDN引入资源,上述配置实际有三种配置方法,其中两种需要引入插件实现

  • 直接使用vite-plugin-cdn-import插件引入,根据配置自动引入所需资源
  • 使用rollup-plugin-external-globals插件,结合rollupOptions的external配置资源变量,还得手动在 Index.html引入所需资源
  • 结合rollupOptions的external与output直接配置所需资源变量,无需手动引入资源及安装其他依赖

3、依赖分包直接在rollupOptions根据官网说明配置即可
4、使用vite-plugin-compression插件开启gzip压缩,且服务器配置开始压缩格式(本文使用了nginx的配置)

vue3+vite优化 通过vite配置external实现对打包代码中第三方包进行优化。1 在 Vite 中,external 配置项用于指定哪些外部库或模块不需要被 Vite 打包,而是应该通过 <script> 标签在 HTML 文件中直接引入。这通常用于那些体积较大或者已经被广泛缓存的库,以减少最终打包文件的大小和加载时间。2 另外我么还要考虑到浏览器下并发请求的限制,如果我们在开发过程中组件没有使用异步组件,而且在打包分割时,分包又太多,这样就会造成并发请求(谷歌浏览器并发请求限制个数为6个)。 阅读详情

相关推荐

vite打包优化分片打包依赖包

上述拆分方式是自动将所有的包都单独拆分出来,优点就是不用手动配置,但是也有缺点,就是有的第三方包体积很小,会拆分出大量文件,反而降低请求效率。当项目使用pnpm进行管理包的时候再进行打包就会打出一个非常大的.pnpm包,这就不符合我们的预期了,我们要的就是小一点的包来进行本地缓存。assetFileNames 资源文件名,统一放到assets/js(jpg/png/ttf/css等)/目录下。还不知道怎么解决,目前就是不使用pnpm就恢复正常了,如果有大神知道怎么解决希望能留一下言。

Mr__proto__的博客 4994

vite配置cdn优化打包体积

大家都知道前端性能优化的方法,cdn外部引入的方法可以使项目打包后体积大大缩小,所以是前端性能优化方面非常推荐的方法之一。本文关于项目如何cdn引入做一个简单教程,我们可以通过两种方式引入配置cdn。由于vite的核心基于rollup和webpack不同,所以cdn引入方式也不同具体rollup配置项可以阅读vite官网。rolluppluginsexternalvite这次带来了两种方法打包Element plus ,同样的只要有cdn链接,我们就可以用这两种方式进行引入。

m0_68324632的博客 1万+

Vue3之Vite打包优化

1. 安装:2. 配置在vite.config.js中引入 rollup-plugin-visualizer插件3. 查看:包文件目录生成stats.html文件,打开stats.html文件,生成可视化代码分析报告。对于一些较大的第三方库,如 Element UI或 Ant Design,可以考虑按需引入组件或样式,而不是全部引入。按需引入组件或样式可以参考这些第三方库的官方文档,在里面有介绍如何按需引入组件或样式。

njkl2166的博客 2505

Vite打包性能优化之开启Gzip压缩

在使用 vite 进行项目打包时,默认已经帮我们做了一些优化工作,比如代码的压缩,分包等等。除此之外,我们还有一些可选的优化策略,比如使用 CDN ,开启 Gzip 压缩等。本文会介绍在 vite 中使用插件来开启 Gzip 压缩。

昆吾kw的博客 2万+

vite3+vue3 项目打包优化

现在很多小伙伴都已经使用 Vite + Vue3 开发项目了,如果你是 “前端架构师” 或者是 “团队核心” 的话,不得不可考虑的一个问题就是性能优化。本篇文章主要讲述的是生产环境下 Vite + Vue3 打包优化。

前端知识分享喵 2963

手把手教你用Simulink搭建DSOGI-PLL模型(附完整代码下载)

本文详细介绍了在Simulink中搭建高鲁棒性DSOGI-PLL模型的完整工程实践指南。针对传统锁相环在非理想电网下的不足,文章深入剖析了双二阶广义积分器锁相环(DSOGI-PLL)的核心原理与优势,并提供了从模块构建、系统组装到参数整定与测试验证的全流程手把手教程,附有完整代码下载,助力工程师应对谐波、电压跌落等复杂电网工况。

weixin_29223603的博客 388

vite3+vue3 项目打包优化实战之-视图分析(rollup-plugin-visualizer)、CDN引入、依赖分包、gzip压缩、history404问题

vue项目在线下环境开发完成后,我们就需要项目的打包上线了,除了要知道打包命令之外,我们还要知道项目整体文件依赖情况,web访问加载速度等概念,包括首屏优化方案。我通过一次实战把最基本可以优化的步骤走一下。build 视图分析依赖文件第三方库CDN引入依赖文件分包gzip压缩文件部署前配置history路由模式的404问题📚vite专栏☃️ 个人简介:一个喜爱技术的人。🌞 励志格言: 脚踏实地,虚心学习。

潜心 1万+

省一蓝桥杯嵌入式-09RTC实时时钟

RTC(Real-Time Clock)实时时钟,是一个独立的定时器RTC模块拥有一组连续的计数的计数器,在响应软件配置下,可提供时钟、日历、闹钟功能RTC能提供年月日时分秒等信息(可设置)在系统复位或从待机模式唤醒后,RTC的设置时间维持不变(这个我没实现,复位后时间也重置了,有能力的可以自己研究一下)持续时间跟踪:在主系统断电后或处于低功耗模式时,RTC仍继续工作,原理是有额外的电池为其供电(蓝桥杯板子没有这个备用电源,该功能无效。

qq_46392331的博客 1729

vite构建打包性能优化

最近在用vite构建重构我的博客,由于项目内容较多,所以遇到了一些性能问题,所以在构建生产环境时做了一些优化,在这里做一个记录,方便大家参考。

富朝阳的博客 1万+

eda、gnm、anm究竟是个啥?

eda:主成分分析 gnm:高斯网络模型 anm:各向异性网络模型

药研猿的博客 1244

爬虫实战:抖音视频搜索数据爬虫开发实战(附完整Python源码)

【代码】抖音视频搜索数据爬虫开发实战(附完整Python源码)

weixin_61226361的博客 3598

vue3+vite3项目打包优化

Vue项目开发完毕后,对项目进行打包发布之前,必不可少的操作就是项目优化,这也是程序猿的加分项。跟随本文的脚步来看看如何对项目进行优化吧!

DZQ1223的博客 3192

Windows下玩转DeepSeek-R1:Ollama+Docker配置RAGFlow的3种网络调试方案

本文详细介绍了在Windows环境下使用Ollama和Docker配置RAGFlow的三种网络调试方案,帮助开发者解决本地部署AI知识库系统时的网络隔离问题。通过host.docker.internal直连、自定义Docker网桥网络和端口映射与反向代理三种方法,实现DeepSeek-R1模型与RAGFlow的高效通信,提升本地AI应用的开发效率。

weixin_28347369的博客 247

Vue打包优化-加快首屏加载速度

在打包前端项目时发现前端打包后的文件包体积过大影响了性能怎么办?

weixin_43852780的博客 1224

告别盲目调参:手把手教你用RKISP2.x Tuner理解AWB、AE、NR等核心模块

本文详细介绍了如何使用RKISP2.x Tuner工具进行ISP调试,重点解析AWB、AE、NR等核心模块的调参技巧。通过RV1126平台的实际操作演示,帮助工程师快速掌握可视化对比实验方法,告别盲目调参,提升图像信号处理效率。

weixin_30300225的博客 393

ANSYS Maxwell:从RMxprt到3D轴向磁通电机的无缝建模指南

本文详细介绍了如何利用ANSYS RMxprt作为高效起点,快速构建3D轴向磁通电机的有限元分析模型。通过RMxprt内置模板输入关键参数并完成磁路法计算后,可一键生成包含几何、材料、绕组及边界条件的即用型Maxwell 3D模型,极大简化了复杂三维结构的建模流程,使工程师能专注于性能优化与仿真分析。

weixin_29281941的博客 556

使用 Webpack Bundle Analyzer 分析 Vue 项目打包体积

摘要 Webpack Bundle Analyzer 是优化 Vue 项目打包体积的利器,它能生成可视化报告展示各模块体积占比。安装后通过简单配置即可在生产环境运行分析,识别大型模块、重复依赖等问题。优化策略包括按需引入第三方库、CDN 加载、代码分割和路由懒加载等。建议定期进行打包分析并建立持续监控机制,确保项目性能始终处于最佳状态。该工具能显著减少打包体积,提升应用加载速度和用户体验。

1500

独家开源|RK3588 平台 YOLOv5 Android 源码级解析:NPU 量化、多线程与目标跟踪实战

本文将带你完成一个完整的AI视觉项目:在搭载RK3588芯片的Android开发板上运行实时目标检测与跟踪应用。实战目标:成功运行官方YOLOV5摄像头实时检测案例技术深度:深入理解RKNN开发框架和源码实现核心技能:掌握NPU推理、多线程并发、目标跟踪等关键技术。

m0_71589036的博客 193

Vue-Pure-Admin精简版核心功能解析:如何实现2.3MB极致压缩

Vue-Pure-Admin精简版是一个基于Vue3、TypeScript和Element Plus构建的现代化管理后台框架,它通过精心的架构设计和优化策略,在保留核心功能的前提下实现了惊人的2.3MB打包大小。这个极简版本不仅适合实际项目开发,还提供了完整的权限管理、路由配置和UI组件系统,是追求性能和开发效率的团队理想选择。 ## 🔥 极致压缩的三大核心技术 ### 1. 智能依赖预构建

gitblog_00070的博客 347

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Vue3首屏加载从10秒到1秒的完整优化实践

前端性能优化是工程实践中永恒的核心话题,尤其在Vue3单页应用中,首屏加载速度直接决定用户体验与业务转化。其背后涉及构建策略、代码执行效率、网络请求时机与缓存利用等多层技术原理。通过路由懒加载、组件拆包、CDN外置等手段可显著削减首屏JS体积;合理使用响应式API、优化计算属性与列表渲染则能降低运行时开销;将数据请求前置与接口去重、配合强缓存与KeepAlive,可让二次访问近乎秒开。这些方法适用于中后台系统、电商页面、数据可视化大屏等常见场景。当遇到白屏时间长、加载缓慢的Vue3项目时,从量化性能指标出发

weixin_33937499的博客 357

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

EventCalendar部署与发布完整流程:从开发到上线的每一步

EventCalendar是一款功能强大的拖放式JavaScript事件日历,支持资源视图和时间线视图,广泛应用于各类Web应用中。本文将详细介绍从开发环境搭建到最终上线的完整部署与发布流程,帮助开发者快速掌握每一个关键步骤。 ## 📋 准备工作:环境搭建与项目克隆 在开始部署之前,确保你的开发环境满足以下要求: - Node.js(推荐v14+版本) - npm或yarn包管理器 - Gi

gitblog_00379的博客 369

vue-vben-admin构建产物分析:rollup-plugin-visualizer使用

在前端项目开发中,随着业务功能的不断迭代,构建产物的体积往往会逐渐增大,这不仅会影响应用的加载速度,还可能导致用户体验下降。为了解决这个问题,我们需要对构建产物进行深入分析,找出体积过大的原因并进行优化。本文将介绍如何在vue-vben-admin项目中使用rollup-plugin-visualizer插件进行构建产物分析。 ## 插件配置分析 rollup-plugin-visualize...

gitblog_00585的博客 554

三步搭好 Vue3 后台项目:vue-pure-admin 动态路由与多环境配置实操

vue-pure-admin 是一套采用全 ESM 规范编写的 Vue3 后台管理系统模板,登录页、菜单渲染、动态权限路由、多标签页、主题切换这些企业后台的"标配能力"都已经内置,你拿过来改改配色和接口就能直接开工,特别适合刚接触中后台开发、想快速跑起一个完整管理系统的同学。 [![vue-pure-admin 后台管理系统登录页背景图](https://raw.gitcode.com/GitH

gitblog_00791的博客 718

别盯着 dist:Vite 应用的下载与执行成本治理闭环

Vite 构建产物变大不等于性能一定变差。真正需要治理的是:关键路由在真实网络下下载了多少、浏览器为这些资源解析和执行了多久,以及拆包后是否引入新的请求瀑布流与缓存失效。本文给出一套从构建报告、依赖定

tuse101的博客 182

落地首屏与次屏分层优化

webpack 打包后会生成一段运行时代码: 作用是管理模块的加载、解析、异步 chunk 的加载逻辑(比如、异步引入的 jsonp 加载逻辑),默认这段 runtime 代码会打包进主 chunk(main.js)里面。

2302_80473627的博客 345

DeepSeek Harness 破甲插件 dsh-purge 完全指南:从装好到干净回退

dsh-purge 是装在官方 DeepSeek Harness(DSH)上的红队评测插件:把宿主层的提示词改写、审批门与沙箱策略逐条拆开,让你分清一次拒答来自模型本身还是宿主拦截,并且每一步都能干净回退。本文面向想把它装进本机 DSH、同时确认随时能退出的用户:先核对版本,再给出最小安装命令集,最后落到备份、还原与卸载的源码级机制。 ## 安装之前 ### 只打 0.2 系,版本对不上就跳过

gitblog_00393的博客 132
上一篇: Nginx在Window与Mac环境的使用及配置详情
下一篇: Echarts的使用(优化按需引入)
失眠时间
博客等级 码龄7年 9134粉丝 113原创
评论 30
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值