# CDN
你可以通过执行`npm run preview -- --report`来分析`webpack`打包之后的结果,观察各个静态资源的大小。你可以发现占用空间最多的是第三方依赖。如`vue`、`element-ui`、`ECharts`等。
你可以使用`CDN`外链的方式引入这些第三方库,这样能大大增加构建的速度(通过 CDN 引入的资源不会经 webpack 打包)。如果你的项目没有自己的`CDN`服务的话,使用一些第三方的`CDN`服务,如[unpkg](https://unpkg.com/)等是一个很好的选择,它提供过了免费的资源加速,同时提供了缓存优化,由于你的第三方资源是在`html`中通过`script`引入的,它的缓存更新策略都是你自己手动来控制的,省去了你需要优化缓存策略功夫。
> ## TIP
>
> 很多文章说使用`CDN`引入的方式能大大减小代码的体积,这是不可能的。虽然打包完的`bundle`小了,但那部分代码只是被你拆出去,用`CDN`的方式引入罢了。你想减小体积,最高效的方案是启用`GZIP`。
## [#](https://panjiachen.github.io/vue-element-admin-site/zh/guide/advanced/cdn.html#%E6%88%91%E4%B8%AA%E4%BA%BA%E6%9A%82%E6%97%B6%E4%B8%8D%E4%BD%BF%E7%94%A8cdn%E5%BC%95%E5%85%A5%E7%AC%AC%E4%B8%89%E6%96%B9%E4%BE%9D%E8%B5%96%E7%9A%84%E5%8E%9F%E5%9B%A0%EF%BC%9A)我个人暂时不使用`CDN`引入第三方依赖的原因:
暂时构建速度还没有遇到什么瓶颈,所有没有必要单独剥离部分第三方依赖。使用`CDN`引入的方式等于一些第三方依赖的版本你是通过`package.json`来控制的,一些依赖则需要手动维护,增加了一些维护成本。目前基于 webpack 的`optimization.splitChunks`已经做了资源的缓存优化,静态资源的缓存已经做得很好了。并且目前所有的静态资源都会上传到自己的`CDN`服务,没有必要使用第三方的`CDN`服务。
**当然所有的优化都是需要结合自己的具体业务来调整的!**之后可能会采用这种引入方式,或者使用`webpack dll`的方式进行优化。如果你觉得`CDN`引入对于的项目有益处,你可以遵循如下方法进行修改:
## [#](https://panjiachen.github.io/vue-element-admin-site/zh/guide/advanced/cdn.html#%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F)使用方式
先找到`vue.config.js`, 添加`externals`让`webpack`不打包`vue`和`element`
~~~
externals: {
vue: 'Vue',
'element-ui':'ELEMENT'
}
~~~
然后配置那些第三方资源的`CDN`,请注意先后顺序。
~~~
const cdn = {
css: [
// element-ui css
'https://unpkg.com/element-ui/lib/theme-chalk/index.css'
],
js: [
// vue must at first!
'https://unpkg.com/vue/dist/vue.js',
// element-ui js
'https://unpkg.com/element-ui/lib/index.js'
]
}
~~~
之后通过`html-webpack-plugin`注入到`index.html`之中:
~~~
config.plugin('html').tap(args => {
args[0].cdn = cdn
return args
})
~~~
找到`public/index.html`。通过你配置的`CND Config`依次注入 css 和 js。
~~~
<head>
<!-- 引入样式 -->
<% for(var css of htmlWebpackPlugin.options.cdn.css) { %>
<link rel="stylesheet" href="<%=css%>">
<% } %>
</head>
<!-- 引入JS -->
<% for(var js of htmlWebpackPlugin.options.cdn.js) { %>
<script src="<%=js%>"></script>
<% } %>
~~~
之后还有一个小细节是如果你用了全局对象方式引入 vue,就不需要 手动 Vue.use(Vuex) ,它会自动挂载,具体见[issue](https://github.com/vuejs/vuex/issues/731)
完整的[代码修改](https://github.com/PanJiaChen/vue-admin-template/commit/eaaa3c1ddadd114451a1a83e042f1fc56a9809a1)
最终你可以使用`npm run preview -- --report`查看效果 如图:
![](https://camo.githubusercontent.com/0c5bdc47aeaecc340b9a5a88325b49885538bf90/68747470733a2f2f70616e6a69616368656e2e6769746875622e696f2f696d616765732f656c656d656e742d63646e2e706e67)
> ## TIP
>
> 同理,其它第三方依赖都可以使用相同的方式处理(比如`vuex`、`vue-router`等)。当然你也可以选择使用[DLLPlugin](https://webpack.docschina.org/plugins/dll-plugin/)的方式来处理第三方依赖,从而来优化构建。