【随心秀】优化1M带宽的云服务器访问速度

image

一台1M带宽的云服务器, 理论下载最大速度是128kb/s
现如今,前端项目构建后的文件动辄就是几M大小,那用户来访问岂不是需要10s以上
天呐,哪会有用户这么好心的等你这么久,早就溜了
那么如何优化访问速度呐,且听我细细道来
先体验优化后的服务器(3s左右打开)

http://blog.lzuntalented.cn/assets/img/1m-speed.2535851c.jpg

先对比下优化前后的首页访问速度
左边是优化前访问速度(已经超过20s)
右边是优化后的访问速度(奇迹般的能到2s)

解决方案

扩容

扩容?这辈子都不会扩容


优化构建

要突破1M带宽的限制,首先想到的是把构建包的体积降下来,其次是减少首屏加载的资源,再者可以通过CDN加速静态资源访问

1.如何减小构建包体积

项目中使用很多第三方库(react、react-router、antd等等),把这些库提取出来就可以减少构建包的体积
webpack中的externals配置可以在打包时忽略这些第三方包,这样就有效减少包体积

// webpack.config.js
module.exports = {
  // 通过externals配置,将react、react-dom、react-router、antd设置为打包时不参与构建
  externals: {
    // 左边key表示在import导入时的包名
    // 右边的值表示外部引入导出的变量名-这个要写正确了
    react: 'React',
    'react-dom': 'ReactDOM',
    'react-router': 'ReactRouter',
    antd: 'antd',
  }
};

那这些被导出的包该如何引用呐
在html文件中,使用script标签引入这些包就行

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
        <link rel="stylesheet" href="bound.css">
        <link  rel="stylesheet">
        <link  rel="stylesheet">
        <script src="https://cdn.bootcss.com/react/16.8.6/umd/react.production.min.js"></script>
        <script src="https://cdn.bootcss.com/react-dom/16.8.6/umd/react-dom.production.min.js"></script>
        <script src="https://cdn.bootcss.com/react-router/3.2.1/ReactRouter.min.js"></script>
        <script src="https://cdn.bootcss.com/antd/3.16.3/antd.min.js"></script>
    <head>
</html>

注意到上面的html模板中引用animate.min.css和antd.min.css
不止js有第三方包,css也有,那css也可以使用externals导出吗?
答案是:不能!
那这些第三方css库如何处理呐?
别慌,在使用antd,官方说使用babel-plugin-import这个插件可以达到按需加载的效果,例如若只使用Button这个组件,可以只引入Button相关的js代码和css代码,这样可以减少构建后文件大小
参考下这种按需加载的导入方式,来看下babel-plugin-import如何使用

// 这个插件的原理是找到libraryName对应的包名导入,将这一行代码重写一下  
// 例如:import 'animate.css' 会被转换成 import './empty.css'
// 将三方包指向一个空的css文件,那打包的后会打包这个空的css文件,也就不会增加包的体积

// .babelrc.js
module.exports = {
    plugins: [
        [
          'import',
          {
            libraryName: 'animate.css',
            customName: name => './empty.css',
          },
          'animate.css',
        ],
        [
          'import',
          {
            libraryName: 'antd/dist/antd.less',
            customName: name => './empty.css',
          },
          'antd/dist/antd.less',
        ],
    ],
}

2.如何减少首屏加载资源

减少首屏加载资源,就是把首屏不需要的资源延迟加载,以达到优化加载速度的目的。
一个站点可能会有多个路由,那么除了当前路由相关的资源需要加载,其他的路由的内容都应该被懒加载。
React提供了React.lazy方法来懒加载组件,React.lazy必须要被包裹在React.Suspense标签里。
要使用懒加载需要结合动态import()这个语法,使用babel的plugin-syntax-dynamic-import这个插件可以支持这个语法。

// 动态加载组件的一个写法
// 在路由引用一个组件时,使用这种方式把需要引用的组件包裹一下
/* loadable.js */
import React from 'react';
const Comp = React.lazy(() => import(/* webpackChunkName: 'preview' */ './index.js'));
export default () => <React.Suspense><Comp /></React.Suspense>;

3.通过CDN加速静态资源访问

我们知道通过CDN访问静态资源可以加速资源获取,那再去云服务商开个CDN服务?
不必这么麻烦,市面上有可免费使用CDN镜像,使用他们提供的就可以,又可以节省一部分开支。

免费好用的cdn加速服务

http://blog.lzuntalented.cn/assets/img/1m-pkg.9bd7f30a.jpg

最后来看下构建后的包的体积,先只关注bound.js
左边是未优化的构建结果js大小1.42M,那么首次加载就需要11s
右边是优化后的构建结果,js文件加起来总和才486k,首页的资源只有185k,那么理论加载速度只需要2s
这还只是对比的js的加载,再加上css的加载,性能提升更明显了

结语

本次优化使用的项目在 【随心秀】(一款类似易企秀的开源微场景编辑器)
经过不懈的努力终于把网址首次加载速度降到3s
其实还有优化的地方,还要更多去探索,一起加油吧

?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容

  • 前端开发面试题 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增加。 题目类型: 理论知...
    怡宝丶阅读 2,575评论 0 7
  • 慢慢的干货~ 有点长~ 关于 React 应用加载的优化,其实网上类似的文章已经有太多太多了,随便一搜就是一堆,已...
    BluesCurry阅读 3,860评论 1 19
  • 性能优化方向分类 请求数量: 合并脚本和样式表, CSS Sprites, 拆分初始化负载, 划分主域(使用“查找...
    Www刘阅读 1,764评论 3 8
  • 1、感恩今天早上天使时间6:30起床,脚踩在湿漉漉的草地上,完全自由的跟大地母亲连接,舞动自己的身体,每一个细胞慢...
    感恩女神诗淘阅读 276评论 1 3
  • 全网热议996话题,由京东裁员一开始引起关注,到马老师的“不正确,不中听的实话”刺痛了普通大众的心,全民陷入讨论9...
    元宵丸子阅读 235评论 0 0