Vue使用CDN引用项目组件,减少项目体积的步骤


Posted in Javascript onOctober 30, 2020

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

首先,我们要明白为什么我的Vue项目在打包后产生的文件会那么大。我们在最开始使用Vue的时候几乎所有组件、插件的引用都会放到项目主文件中进行即 main.js文件,我们的引用方式可能是这样的:

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中使用CDN就相当于是将原本自己项目所需要下载的依赖文件交由用户的网络进行下载,Vue中仅仅保持对依赖文件的引用即可。主要需要改动的有两个地方一个是Vue的index.html,以及build目录下的webpack.base.conf.js,废话不多说,上代码:

<!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" rel="external nofollow" >
</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分为几部分:

第一部分:https://cdn.jsdelivr.net/npm 指定当前资源下载站点,与之类似的还有UNPKG、cdnjs.com、BootCDN等。个人比较推荐使用jsdelivr,速度比较稳定

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

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

css文件也可以使用cdn来进行引用

上述配置完成后,还需要修改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来完成使用。

以上就是Vue使用CDN引用项目组件,减少项目体积的步骤的详细内容,更多关于vue 减少项目体积的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
由点击页面其它地方隐藏div所想到的jQuery的delegate
Aug 29 Javascript
js跨域问题浅析及解决方法优缺点对比
Nov 08 Javascript
javascript动态创建表格及添加数据实例详解
May 13 Javascript
JavaScript学习笔记之取数组中最大值和最小值
Mar 23 Javascript
Node.js 应用跑得更快 10 个技巧
Apr 03 Javascript
JS实现HTML表格排序功能
Aug 05 Javascript
JS简单实现表格排序功能示例
Dec 20 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
Sep 21 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
Oct 22 Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
Mar 01 Javascript
layer弹出层扩展主题的方法
Sep 11 Javascript
vue 使用vant插件做tabs切换和无限加载功能的实现
Nov 04 Javascript
vue+swiper实现左右滑动的测试题功能
Oct 30 #Javascript
利用vue3+ts实现管理后台(增删改查)
Oct 30 #Javascript
vue项目页面嵌入代码块vue-prism-editor的实现
Oct 30 #Javascript
解决vue侦听器watch,调用this时出现undefined的问题
Oct 30 #Javascript
vue2.0 watch里面的 deep和immediate用法说明
Oct 30 #Javascript
JavaScript实现轮播图效果
Oct 30 #Javascript
vue组件添加事件@click.native操作
Oct 30 #Javascript
You might like
PHP Google的translate API代码
2008/12/10 PHP
PHP 程序员也要学会使用“异常”
2009/06/16 PHP
php面向对象全攻略 (四)构造方法与析构方法
2009/09/30 PHP
解析php中memcache的应用
2013/06/18 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
2015/09/22 PHP
Laravel5.5以下版本中如何自定义日志行为详解
2018/08/01 PHP
php写入文件不覆盖的实例讲解
2019/09/17 PHP
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
Django1.7+JQuery+Ajax验证用户注册集成小例子
2017/04/08 jQuery
Vue-cli-webpack搭建斗鱼直播步骤详解
2017/11/17 Javascript
vue.js input框之间赋值方法
2018/08/24 Javascript
KnockoutJS数组比较算法实例详解
2019/11/25 Javascript
微信小程序实现吸顶特效
2020/01/08 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
详解Python发送邮件实例
2016/01/10 Python
Python类属性的延迟计算
2016/10/22 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
2018/05/15 Python
Windows下python3.6.4安装教程
2018/07/31 Python
python yield关键词案例测试
2019/10/15 Python
Python使用QQ邮箱发送邮件报错smtplib.SMTPAuthenticationError
2019/12/20 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
Python使用进程Process模块管理资源
2020/03/05 Python
python爬虫scrapy图书分类实例讲解
2020/11/23 Python
python函数超时自动退出的实操方法
2020/12/28 Python
HTML5自定义mp3播放器源码
2020/01/06 HTML / CSS
佳能英国官方网站:Canon UK
2017/08/08 全球购物
女装和独特珠宝:Sundance Catalog
2018/09/19 全球购物
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
网络体系结构及协议的定义
2014/03/13 面试题
计算机专业自我鉴定
2013/10/15 职场文书
2014年情人节活动方案
2014/02/16 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
Javascript设计模式之原型模式详细
2021/10/05 Javascript
「SHOW BY ROCK!!」“雫シークレットマインド”组合单曲MV公开
2022/03/21 日漫
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android
vue3 自定义图片放大器效果的示例代码
2022/07/23 Vue.js