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 相关文章推荐
javascript学习之闭包分析
Dec 02 Javascript
IE与Firefox在JavaScript上的7个不同句法分享
Oct 30 Javascript
javascript页面动态显示时间变化示例代码
Dec 18 Javascript
怎么判断js脚本加载完成
Feb 28 Javascript
利用jQuery异步上传文件的插件用法详解
Jul 19 jQuery
Three.js实现绘制字体模型示例代码
Sep 26 Javascript
vue.js多页面开发环境搭建过程
Apr 24 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
Sep 17 Javascript
BootstrapValidator实现表单验证功能
Nov 08 Javascript
原生JS实现留言板功能
Feb 08 Javascript
用JS写一个发布订阅模式
Nov 07 Javascript
vue.js 使用原生js实现轮播图
Apr 26 Vue.js
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
基于mysql的论坛(6)
2006/10/09 PHP
PHP获取中英混合字符串长度的方法
2014/06/07 PHP
PHP 实现类似js中alert() 提示框
2015/03/18 PHP
php基于dom实现读取图书xml格式数据的方法
2017/02/03 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
浅谈Laravel核心解读之Console内核
2018/12/02 PHP
Jquery实现网页跳转或用命令打开指定网页的解决方法
2013/07/09 Javascript
javascript完美拖拽的实现方法
2013/09/29 Javascript
JS实现生成会变大变小的圆环实例
2015/08/05 Javascript
Vue.js计算属性computed与watch(5)
2016/12/09 Javascript
百度地图JavascriptApi Marker平滑移动及车头指向行径方向
2017/03/13 Javascript
关于javascript sort()排序你可能忽略的一点理解
2017/07/18 Javascript
实例分析js事件循环机制
2017/12/13 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
js数组去重的N种方法(小结)
2018/06/07 Javascript
Vue中的验证登录状态的实现方法
2019/03/09 Javascript
vue中的面包屑导航组件实例代码
2019/07/01 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
浅谈vue中document.getElementById()拿到的是原值的问题
2020/07/26 Javascript
js实现带有动画的返回顶部
2020/08/09 Javascript
Python正则表达式实现截取成对括号的方法
2017/01/06 Python
Python随机读取文件实现实例
2017/05/25 Python
python实现诗歌游戏(类继承)
2019/02/26 Python
Python-copy()与deepcopy()区别详解
2019/07/12 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
Python字符串格式化常用手段及注意事项
2020/06/17 Python
CSS3 中的@keyframes介绍
2014/09/02 HTML / CSS
英国最大的老式糖果店:A Quarter Of
2017/04/08 全球购物
LG西班牙网上商店:Tienda LG Online Es
2019/07/30 全球购物
中国文明网向国旗敬礼活动精彩寄语2014
2014/09/27 职场文书
2014年教学工作总结
2014/11/13 职场文书
撤诉申请书法院范本
2015/05/18 职场文书
go类型转换及与C的类型转换方式
2021/05/05 Golang
Python循环之while无限迭代
2022/04/30 Python
python实现学生信息管理系统(面向对象)
2022/06/05 Python