Skip to content
On this page

优化

配置externals

防止将某些 import 的包(package)打包到 bundle 中,而是在运行时(runtime)再去从外部获取这些扩展依赖

项目中的使用

一般性vue项目,我们都会把一些框架包,给抽离出来。例如:

  • Vue
  • ELEMENT
  • VueRouter
  • Vuex
  • axios

1 引入框架

我们把一些外包引用的包,提取出来,放在public中

2 编辑 externals

我们在vue.config.

javascript
module.exports = {

   configureWebpack: config => {

       config.externals = {
         'vue': 'Vue',
         'element-ui': 'ELEMENT',
         'vue-router': 'VueRouter',
         'vuex': 'Vuex',
         'axios': 'axios'
       }

   }
1
2
3
4
5
6
7
8
9
10
11
12
13

3 引入cdn

那么这时候我们需要在  public/index.html

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="format-detection" content="telephone=no">
    <meta http-equiv="X-UA-Compatible" content="chrome=1" />
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <link rel="stylesheet" href="<%= BASE_URL %>cdn/element-ui/2.5.4/theme-chalk/index.css">
    <link rel="stylesheet" href="<%= BASE_URL %>cdn/animate/3.5.2/animate.css">
    <link rel="stylesheet" href="<%= BASE_URL %>cdn/iconfont/1.0.0/index.css">
    <link rel="stylesheet" href="<%= BASE_URL %>cdn/iconfont/1.0.0/iconfont.css">
    <link rel="stylesheet" href="<%= BASE_URL %>cdn/iconfont/1.0.0/index.css">
    <title>vue-demo</title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but vue-demo doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
    <script src="<%= BASE_URL %>cdn/vue/2.5.2/vue.min.js" charset="utf-8"></script>
    <script src="<%= BASE_URL %>cdn/vuex/2.4.1/vuex.min.js" charset="utf-8"></script>
    <script src="<%= BASE_URL %>cdn/vue-router/3.0.1/vue-router.min.js" charset="utf-8"></script>
    <script src="<%= BASE_URL %>cdn/axios/1.0.0/axios.min.js" charset="utf-8"></script>
    <script src="<%= BASE_URL %>cdn/element-ui/2.5.4/index.js" charset="utf-8"></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

开启Gzip 压缩

1 介绍

vue cli 3.0相比2.0有不少的改动,最明显的就是 build文件夹不见了,改为根目录的vue.config.js 在此记录一下Gzip配置的过程

shell
npm i -D compression-webpack-plugin
1

2 修改vue.config.js

javascript
const CompressionPlugin = require("compression-webpack-plugin")

module.exports = {
	configureWebpack:config=>{
        if(process.env.NODE_ENV === 'production'){
            return{
                plugins: [
                    new CompressionPlugin({
                        test:/\.js$|\.html$|.\css/, //匹配文件名
                        threshold: 10240,//对超过10k的数据压缩
                        deleteOriginalAssets: false //不删除源文件
                    })
                ]
            }
        }
    },
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

3 nginx配置gzip

javascript
gzip  on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 6;
gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
gzip_disable "MSIE [1-6]\.";
gzip_vary on;
1
2
3
4
5
6
7
8

第1行:开启Gzip

第2行:不压缩临界值,大于1K的才压缩,一般不用改

第3行:buffer,就是,嗯,算了不解释了,不用改

第4行:用了反向代理的话,末端通信是HTTP/1.0,有需求的应该也不用看我这科普文了;有这句的话注释了就行了,默认是HTTP/1.1

第5行:压缩级别,1-10,数字越大压缩的越好,时间也越长,看心情随便改吧

第6行:进行压缩的文件类型,缺啥补啥就行了,JavaScript有两种写法,最好都写上吧,总有人抱怨js文件没有压缩,其实多写一种格式就行了

第7行:跟Squid等缓存服务有关,on的话会在Header里增加"Vary: Accept-Encoding",我不需要这玩意,自己对照情况看着办吧

第8行:IE6对Gzip不怎么友好,不给它Gzip了

首屏加载

html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <meta name="format-detection" content="telephone=no">
    <meta http-equiv="X-UA-Compatible" content="chrome=1" />
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <link rel="stylesheet" href="<%= BASE_URL %>cdn/element-ui/2.5.4/theme-chalk/index.css">
    <link rel="stylesheet" href="<%= BASE_URL %>cdn/animate/3.5.2/animate.css">
    <link rel="stylesheet" href="<%= BASE_URL %>cdn/iconfont/1.0.0/index.css">
    <link rel="stylesheet" href="<%= BASE_URL %>cdn/iconfont/1.0.0/iconfont.css">
    <link rel="stylesheet" href="<%= BASE_URL %>cdn/iconfont/1.0.0/index.css">
    <title>vue-demo</title>
    
   <style>
     html,
     body,
     #app {
       height: 100%;
       margin: 0px;
       padding: 0px;
     }

     .chromeframe {
       margin: 0.2em 0;
       background: #ccc;
       color: #000;
       padding: 0.2em 0;
     }

     #loader-wrapper {
       position: fixed;
       top: 0;
       left: 0;
       width: 100%;
       height: 100%;
       z-index: 999999;
     }

     #loader {
       display: block;
       position: relative;
       left: 50%;
       top: 50%;
       width: 150px;
       height: 150px;
       margin: -75px 0 0 -75px;
       border-radius: 50%;
       border: 3px solid transparent;
       /* COLOR 1 */
       border-top-color: #FFF;
       -webkit-animation: spin 2s linear infinite;
       /* Chrome, Opera 15+, Safari 5+ */
       -ms-animation: spin 2s linear infinite;
       /* Chrome, Opera 15+, Safari 5+ */
       -moz-animation: spin 2s linear infinite;
       /* Chrome, Opera 15+, Safari 5+ */
       -o-animation: spin 2s linear infinite;
       /* Chrome, Opera 15+, Safari 5+ */
       animation: spin 2s linear infinite;
       /* Chrome, Firefox 16+, IE 10+, Opera */
       z-index: 1001;
     }

     #loader:before {
       content: "";
       position: absolute;
       top: 5px;
       left: 5px;
       right: 5px;
       bottom: 5px;
       border-radius: 50%;
       border: 3px solid transparent;
       /* COLOR 2 */
       border-top-color: #FFF;
       -webkit-animation: spin 3s linear infinite;
       /* Chrome, Opera 15+, Safari 5+ */
       -moz-animation: spin 3s linear infinite;
       /* Chrome, Opera 15+, Safari 5+ */
       -o-animation: spin 3s linear infinite;
       /* Chrome, Opera 15+, Safari 5+ */
       -ms-animation: spin 3s linear infinite;
       /* Chrome, Opera 15+, Safari 5+ */
       animation: spin 3s linear infinite;
       /* Chrome, Firefox 16+, IE 10+, Opera */
     }

     #loader:after {
       content: "";
       position: absolute;
       top: 15px;
       left: 15px;
       right: 15px;
       bottom: 15px;
       border-radius: 50%;
       border: 3px solid transparent;
       border-top-color: #FFF;
       /* COLOR 3 */
       -moz-animation: spin 1.5s linear infinite;
       /* Chrome, Opera 15+, Safari 5+ */
       -o-animation: spin 1.5s linear infinite;
       /* Chrome, Opera 15+, Safari 5+ */
       -ms-animation: spin 1.5s linear infinite;
       /* Chrome, Opera 15+, Safari 5+ */
       -webkit-animation: spin 1.5s linear infinite;
       /* Chrome, Opera 15+, Safari 5+ */
       animation: spin 1.5s linear infinite;
       /* Chrome, Firefox 16+, IE 10+, Opera */
     }

     @-webkit-keyframes spin {
       0% {
         -webkit-transform: rotate(0deg);
         /* Chrome, Opera 15+, Safari 3.1+ */
         -ms-transform: rotate(0deg);
         /* IE 9 */
         transform: rotate(0deg);
         /* Firefox 16+, IE 10+, Opera */
       }

       100% {
         -webkit-transform: rotate(360deg);
         /* Chrome, Opera 15+, Safari 3.1+ */
         -ms-transform: rotate(360deg);
         /* IE 9 */
         transform: rotate(360deg);
         /* Firefox 16+, IE 10+, Opera */
       }
     }

     @keyframes spin {
       0% {
         -webkit-transform: rotate(0deg);
         /* Chrome, Opera 15+, Safari 3.1+ */
         -ms-transform: rotate(0deg);
         /* IE 9 */
         transform: rotate(0deg);
         /* Firefox 16+, IE 10+, Opera */
       }

       100% {
         -webkit-transform: rotate(360deg);
         /* Chrome, Opera 15+, Safari 3.1+ */
         -ms-transform: rotate(360deg);
         /* IE 9 */
         transform: rotate(360deg);
         /* Firefox 16+, IE 10+, Opera */
       }
     }

     #loader-wrapper .loader-section {
       position: fixed;
       top: 0;
       width: 51%;
       height: 100%;
       background: #7171C6;
       /* Old browsers */
       z-index: 1000;
       -webkit-transform: translateX(0);
       /* Chrome, Opera 15+, Safari 3.1+ */
       -ms-transform: translateX(0);
       /* IE 9 */
       transform: translateX(0);
       /* Firefox 16+, IE 10+, Opera */
     }

     #loader-wrapper .loader-section.section-left {
       left: 0;
     }

     #loader-wrapper .loader-section.section-right {
       right: 0;
     }

     /* Loaded */
     .loaded #loader-wrapper .loader-section.section-left {
       -webkit-transform: translateX(-100%);
       /* Chrome, Opera 15+, Safari 3.1+ */
       -ms-transform: translateX(-100%);
       /* IE 9 */
       transform: translateX(-100%);
       /* Firefox 16+, IE 10+, Opera */
       -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
       transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
     }

     .loaded #loader-wrapper .loader-section.section-right {
       -webkit-transform: translateX(100%);
       /* Chrome, Opera 15+, Safari 3.1+ */
       -ms-transform: translateX(100%);
       /* IE 9 */
       transform: translateX(100%);
       /* Firefox 16+, IE 10+, Opera */
       -webkit-transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
       transition: all 0.7s 0.3s cubic-bezier(0.645, 0.045, 0.355, 1.000);
     }

     .loaded #loader {
       opacity: 0;
       -webkit-transition: all 0.3s ease-out;
       transition: all 0.3s ease-out;
     }

     .loaded #loader-wrapper {
       visibility: hidden;
       -webkit-transform: translateY(-100%);
       /* Chrome, Opera 15+, Safari 3.1+ */
       -ms-transform: translateY(-100%);
       /* IE 9 */
       transform: translateY(-100%);
       /* Firefox 16+, IE 10+, Opera */
       -webkit-transition: all 0.3s 1s ease-out;
       transition: all 0.3s 1s ease-out;
     }

     /* JavaScript Turned Off */
     .no-js #loader-wrapper {
       display: none;
     }

     .no-js h1 {
       color: #222222;
     }

     #loader-wrapper .load_title {
       font-family: 'Open Sans';
       color: #FFF;
       font-size: 19px;
       width: 100%;
       text-align: center;
       z-index: 9999999999999;
       position: absolute;
       top: 60%;
       opacity: 1;
       line-height: 30px;
     }

     #loader-wrapper .load_title span {
       font-weight: normal;
       font-style: italic;
       font-size: 13px;
       color: #FFF;
       opacity: 0.5;
     }
   </style>
    
  </head>
  <body>
    <noscript>
      <strong>We're sorry but vue-demo doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    
    <div id="app">
      <div id="loader-wrapper">
        <div id="loader"></div>
        <div class="loader-section section-left"></div>
        <div class="loader-section section-right"></div>
        <div class="load_title">正在加载 vue,请耐心等待
          <br>
          <span>V1.3</span>
        </div>
      </div>
    </div>

    <!-- built files will be auto injected -->
    <script src="<%= BASE_URL %>cdn/vue/2.5.2/vue.min.js" charset="utf-8"></script>
    <script src="<%= BASE_URL %>cdn/vuex/2.4.1/vuex.min.js" charset="utf-8"></script>
    <script src="<%= BASE_URL %>cdn/vue-router/3.0.1/vue-router.min.js" charset="utf-8"></script>
    <script src="<%= BASE_URL %>cdn/axios/1.0.0/axios.min.js" charset="utf-8"></script>
    <script src="<%= BASE_URL %>cdn/element-ui/2.5.4/index.js" charset="utf-8"></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
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
沪ICP备20006251号-1