不出意外core-js也能夠改爲CDNjavascript
配合靜態資源的CDN加速,目前首頁的速度大概是700ms,除了圖片外加載的速度大概是200ms左右css
測試連接html
CDN 優化是在 webpack 中實現的,主要分爲環境切換,webpack 打包技巧和 html-webpack-plugin
配置三個部分。vue
這部分的代碼能夠點擊這個連接java
經過process.env.NODE_ENV
來切換環境,由於在 dev 環境的時候,最好仍是使用本地包,方便 debug 等,在生產環境的時候才須要添加 CDN.webpack
本項目的vue.config.js
中就是這樣安排的,這樣就能夠在不一樣環境對 webpack 進行配置,相似於vue-cli2
的配置類型:ios
# cli 2 webpack.dev.js webpack.prod.js 複製代碼
本項目中;git
if (process.env.NODE_ENV === 'production') { webpackConfig['chainWebpack'] = config => { config.plugin('html').tap(args => { args[0].cdn = cdn; return args; }); }; webpackConfig['configureWebpack'] = config => { config['externals'] = { vue: 'Vue', vuex: 'Vuex', 'vue-router': 'VueRouter', axios: 'axios', }; config['plugins'].push(new BundleAnalyzerPlugin()); }; } module.exports = webpackConfig; 複製代碼
具體操做涉及vue/cli3+
的配置,具體能夠看這裏; 對於configureWebpack
, 有配置式和函數式,當使用函數式的時候,添加插件的方法能夠看上面的片斷,這是官方文檔裏面沒有的。github
那麼該怎麼設置 cdn 呢?web
這裏須要兩個 webpack 的配置項:
webpack.externals
webpack.plugins.html-webpack-plugin
具體也能夠看代碼,主要的思路就是在區分環境的基礎上,在生產環境將須要 cdn 的包放在webpack.externals
裏面:webpackConfig['configureWebpack'] = config => { config['externals'] = { vue: 'Vue', vuex: 'Vuex', 'vue-router': 'VueRouter', axios: 'axios', }; }; 複製代碼
接着就是操做 plugin,這裏選擇鏈式操做,將須要填入的 cdn 鏈接的內容傳給index.html
模板:
let cdn = { js: [ // 能夠寫成動態版本號 '//cdn.bootcss.com/vue/2.6.10/vue.runtime.min.js', '//cdn.bootcss.com/vue-router/3.1.3/vue-router.min.js', '//cdn.bootcss.com/vuex/3.1.2/vuex.min.js', '//cdn.bootcss.com/axios/0.19.0/axios.min.js', ], }; webpackConfig['chainWebpack'] = config => { config.plugin('html').tap(args => { args[0].cdn = cdn; return args; }); }; 複製代碼
上述的配置完成以後,須要在public/inedx.html
中修改一下:
<div id="app"></div> <% if(process.env.NODE_ENV==='production'){htmlWebpackPlugin.options.cdn.js.forEach(function(item){ if(item){ %> <script type="text/javascript" src="<%= item %>"></script> <% }})} %> <!-- built files will be auto injected --> 複製代碼
這個的目的就是當是生產環境的時候,遍歷生成 CDN 的元素。這是一個模板語法,能夠看看html-webpack-plugin
這裏主要是根據官方文檔的實踐: 結合 Vue 的異步組件和 Webpack 的代碼分割功能,輕鬆實現路由組件的懶加載。
// src/router/index.js // 路由懶加載 博客分塊 const Blog = () => import(/* webpackChunkName: "group-blog" */ '../views/Blog/Blog.vue'); const ContentPage = () => import(/* webpackChunkName: "group-blog" */ '../views/Blog/ContentPage.vue'); 複製代碼
爲了美化加載的過程,自定義一個Loading插件,主要參考了這些文章
選擇了一個蠻炫酷的動效
功能:
但願你們能夠多多關注個人abandon.work,一個nest.js+mongoDB+Vue.js
的小站。