Vue使用CDN引用项目组件,减小项目体积

  Vue项目打包后有的文件动辄几百KB或几M,这对一个前端项目的加载无疑是致命的。当你的服务器部署在阿里云或亚马逊,每秒只有100kb的加载速度时,页面的载入速度绝对让你崩溃。那么有什么办法能够在依旧是100kb/s的加载速度下让咱们的页面快起来呢?CDN算是其中之一的解决办法。css

  首先,咱们要明白为何个人Vue项目在打包后产生的文件会那么大。咱们在最开始使用Vue的时候几乎全部组件、插件的引用都会放到项目主文件中进行即 main.js文件,咱们的引用方式多是这样的:html

import Vue from 'vue'
import App from './App'
import Router from 'vue-router'
import ElementUI from 'element-ui'
import axios from 'axios'
import 'element-ui/lib/theme-chalk/index.css'
import cookies from 'vue-cookies'
import qs from 'qs'
import store from './store'

  项目在打包的时候就会去自动查找依赖,并将依赖文件所有打入到项目中去,正是这些依赖的文件的存在致使了整个项目文件的体积庞大了起来。可是依赖文件又是必须的,总不可能把依赖文件删除了不是。CDN的出现就为上述状况提供了一种解决方案。前端

  CDN全称Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,经过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,下降网络拥塞,提升用户访问响应速度和命中率。vue

  Vue中使用CDN就至关因而将本来本身项目所须要下载的依赖文件交由用户的网络进行下载,Vue中仅仅保持对依赖文件的引用便可。主要须要改动的有两个地方一个是Vue的index.html,以及build目录下的webpack.base.conf.js,废话很少说,上代码:webpack

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>Demo index html</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/element-ui@2.12.0/lib/theme-chalk/index.css">
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.0"></script>
<script src="https://cdn.jsdelivr.net/npm/vue-router@3.1.3"></script>
<script src="https://cdn.jsdelivr.net/npm/js-md5@0.7.3"></script>
<script src="https://cdn.jsdelivr.net/npm/element-ui@2.12.0/lib/index.js"></script>
</body>
</html>

  所引用的资源文件Url分为几部分:ios

  第一部分:https://cdn.jsdelivr.net/npm 指定当前资源下载站点,与之相似的还有UNPKGcdnjs.comBootCDN等。我的比较推荐使用jsdelivr,速度比较稳定web

  第二部分:所要引用的包名,如:vue, vue-route, element-uivue-router

  第三部分:具体引用依赖的版本号或具体文件,如:@2.6.0,@2.12.0/lib/index.js 此部分为可选部分   npm

  css文件也可使用cdn来进行引用element-ui

  上述配置完成后,还须要修改build/webpack.base.conf.js文件:

'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')

function resolve(dir) {
  return path.join(__dirname, '..', dir)
}


module.exports = {
  externals:{ 'vue':'Vue',
    'element-ui':'ELEMENT',
    'vue-router':'VueRouter',
    "moment": "moment",
    "md5": "js-md5" },
  context: path.resolve(__dirname, '../'),
  entry: {
    app: './src/main.js'
  },
  output: {
    path: config.build.assetsRoot,
    filename: '[name].js',
    publicPath: process.env.NODE_ENV === 'production'
      ? config.build.assetsPublicPath
      : config.dev.assetsPublicPath
  },

  若是没有标红部分的代码,请插入。在externals配置中,像Vue、ELEMENT、VueRouter这些都是固定写法,webpack会根据这些字符自动查找相关依赖并引入

 

  在修改完上述文件后,还须要修改main.js中关于这些文件的应用:

import Vue from "vue";
import App from "./App";
import router from "VueRouter";
import cookies from "vue-cookies";
import VueAxios from "vue-axios";
import axios from "axios";
//elementUI无需在引用,如需使用相关代码请使用ELEMENT代替如:
const Message = ELEMENT.Message;

  至此配置所有完成,须要注意的是使用CDN以后,用户在访问你的页面时都会去请求所配置的CDN文件,因此选择一个速度快且稳定的CDN站点十分重要的;还有就是并非全部的依赖文件均可使用此等方式引用,有些组件是不会导出对象的,也就意味着不能使用CDN来完成使用。