Skip to content

分离第三方库

分离第三方库的目的是减小公共文件的大小,提高加载速度。

这里自己可以选择引入CDN库;也可以把相关的第三方代码下载保存到 /web/public/ 目录下做项目内部引入。

下面用 vuevue-routerpiniaelement-plusqsaxios举例。

一、安装 rollup-plugin-external-globals

pnpm add rollup-plugin-external-globals -D
1

/web/vite.config.ts 中配置:





 





























 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 








/* eslint-disable node/no-unpublished-import */
import { resolve } from 'path';
import { defineConfig, Plugin, UserConfigExport } from 'vite';
import vue from '@vitejs/plugin-vue';
import externalGlobals from 'rollup-plugin-external-globals';
import analyzer from 'rollup-plugin-analyzer';

// 是否是客户端构建
const isClientBuild = process.env.npm_lifecycle_event === 'build:web:client';

// https://vitejs.dev/config/
export default defineConfig((/* { mode, command } */) => {
  /* 插件 S */
  const plugins: (Plugin | Plugin[])[] = [
    vue(),
    analyzer({ summaryOnly: true }),
   
  ];

  /* 公共配置 S */
  const config: UserConfigExport = {
    root: 'web',
    resolve: {
      alias: {
        '~': resolve(__dirname, '../'),
        '@': resolve(__dirname, './'),
      },
    },    
    plugins,
  };

  /* 不同端配置 S */
  if (true === isClientBuild) {
    // 一、客户端构建
    config.build = {
      rollupOptions: {
        //  告诉打包工具 在external配置的 都是外部依赖项  不需要打包
        external: [
          'vue',
          'vue-router',
          'vue-demi', // VueDemi这个是pinia用来判断是vue2还是vue3所需要的
          'pinia',
          'element-plus',
          'qs',
          'axios',
        ],
        plugins: [
          // 避免打包和生产模式运行出错 在这里声明公共模块
          externalGlobals({
            //  "在项目中引入的变量名称" :"CDN包导出的名称,一般在CDN包中都是可见的"
            vue: 'Vue',
            'vue-router': 'VueRouter',
            'vue-demi': 'VueDemi',
            pinia: 'Pinia',
            'element-plus': 'ElementPlus',
            qs: 'Qs',
            axios: 'axios',
          }),
        ],
      },
    };
  } else {
    // 二、否则服务端构建
  }

  return config;
});

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68

二、 修改 index.html

/web/index.html 中引入:













 
 
 
 
 
 
 
 
 
 
 













<!DOCTYPE html>
<html lang="en" class="theme-bg-0">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0" >
  <title><!--app-title--></title>
  <meta name="keywords" content="!--app-keywords--">
  <meta name="description" content="!--app-description--">

  <link rel="icon" href="/favicon.ico" />


  <!-- Import style -->
  <link rel="stylesheet" href="/js/element-plus/2.4.3/index.min.css">

  <!-- Import JS -->
  <script src="/js/vue/3.3.8/vue.global.min.js"></script>
  <script src="/js/vue-router/4.2.5/vue-router.global.min.js"></script>
  <script src="/js/vue-demi/0.14.6/lib/index.iife.min.js"></script>
  <script src="/js/pinia/2.1.7/pinia.iife.min.js"></script>
  <script src="/js/element-plus/2.4.3/index.full.min.js"></script>
  <script src="/js/qs/6.11.2/qs.min.js"></script>
  <script src="/js/axios/1.6.2/axios.min.js"></script>


  <!--preload-links-->
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/entry-client.ts"></script>
<script>
  window.__INITIAL_DATA__ = "<!--app--vue-state-->";
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

三、隐藏代码

/web/assets/css/element-variables.scss 中代码全部隐藏。

Released under the MIT License.