前言
CDN(内容分发网络)指请求资源的方式,即通过script头去请求对应的脚本资源的一种方式,项目里配置之后不需要通过npm 包管理工具去下载配置的包。 目的:将引用的外部js、css 文件剥离开来,不编译到vendor.js 中,而是用资源的形式引用,这样浏览器可以使用多个线程异步将vendor.js 、外部的js等加载下来,达到加速首开的目的。
1. 在vue.config.js进行配置
本人对vue 、vuex 、vue-router 、axios 、element-ui 、echarts 进行了cdn引用。(请求element-ui 、echarts 的cdn较慢)
const IS_PRODUCTION = process.env.NODE_ENV === 'production'
const cdn = {
css: [
'https://unpkg.com/element-ui@2.13.2/lib/theme-chalk/index.css'
],
js: [
'https://cdn.jsdelivr.net/npm/vue@2.6.10/dist/vue.min.js',
'https://cdn.jsdelivr.net/npm/vue-router@3.0.2/dist/vue-router.min.js',
'https://cdn.jsdelivr.net/npm/vuex@3.1.0/dist/vuex.min.js',
'https://cdn.jsdelivr.net/npm/axios@0.18.1/dist/axios.min.js',
'https://unpkg.com/element-ui@2.13.2/lib/index.js',
'https://cdn.staticfile.org/echarts/5.0.1/echarts.min.js'
]
}
const externals = {
vue: 'Vue',
'vue-router': 'VueRouter',
vuex: 'Vuex',
axios: 'axios',
'element-ui': 'ELEMENT',
'echarts': 'echarts'
}
chainWebpack(config) {
if (IS_PRODUCTION) {
config.plugin('html').tap(args => {
args[0].cdn = cdn
return args
})
config.externals(externals)
}
}
2.在public/index.html文件配置
使用 webpack 中自带的插件 html插件进行配置,在 index.html 中增加判断,是否使用 CDN, htmlWebpackPlugin.options 使用的是vue.config 中的config.plugin('html') 的插件属性。
<!-- 使用CDN的CSS文件 -->
<% for (var i in
htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.css) { %>
<link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="preload" as="style" />
<link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="stylesheet" />
<% } %>
<!-- 使用CDN加速的JS文件,配置在vue.config.js下 -->
<% for (var i in
htmlWebpackPlugin.options.cdn&&htmlWebpackPlugin.options.cdn.js) { %>
<script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
<% } %>
3.易出错点
- Router is not defined
解决方案: 将Router 改为 ‘VueRouter’ - Uncaught TypeError: Illegal constructor
解决方案:修改externals 中‘'element-ui’的value
const externals = {
'element-ui': 'ELEMENT',
}
|