浅谈前端优化

雅虎军规

首先,我们先来看看“雅虎军规”的35条:

尽量减少 HTTP 请求个数——须权衡

使用CDN(内容分发网络)

为文件头指定 Expires 或 Cache-Control ,使内容具有缓存性。

避免空的 src 和 href

使用 gzip 压缩内容

把 CSS 放到顶部

把 JS 放到底部

避免使用 CSS 表达式

将 CSS 和 JS 放到外部文件中

减少 DNS 查找次数

精简 CSS 和 JS

避免跳转

剔除重复的 JS 和 CSS

配置 ETags

使 AJAX 可缓存

尽早刷新输出缓冲

使用 GET 来完成 AJAX 请求

延迟加载

预加载

减少 DOM 元素个数

根据域名划分页面内容

尽量减少 iframe 的个数

避免 404

减少 Cookie 的大小

使用无 cookie 的域

减少 DOM 访问

开发智能事件处理程序

用 代替 @import

避免使用滤镜

优化图像

优化 CSS Spirite

不要在 HTML 中缩放图像

favicon.ico要小而且可缓存

保持单个内容小于25K

打包组件成复合文本

一.webpack-bundle-analyzer 

webpack-bundle-analyzer —— Webpack 插件和 CLI 实用程序,她可以将内容束展示为方便交互的直观树状图,让你明白你所构建包中真正引入的内容;我们可以借助她,发现它大体有哪些模块组成,找到不合时宜的存在,然后优化它。我们可以在 项目的 package.json 文件中注入如下命令,以方便运行她(npm run analyz),默认会打开 http://127.0.0.1:8888 作为展示。

“analyz”: “NODE_ENV=production npm_config_report=true npm run build”

浅谈前端优化_第1张图片

二. webpack externals

使用ES6, 由于浏览器兼容问题,需要使用 babel 转换。而这 babel-polyfill 也得引入以确保兼容;还比如项目开发中常用到的 moment, lodash等,都是挺大的存在,如果必须引入的话,即考虑外部引入之,再借助 externals 予以指定, webpack可以处理使之不参与打包,而依旧可以在代码中通过CMD、AMD或者window/global全局的方式访问。

// webpack 中予以指定

externals: {

  'babel-polyfill': 'window'

}

需要补充的是 externals 中:key 是 require 的包名,value 是全局的变量。

三. 引即用

1.像 jQuery ,用原生写几行代码就可以解决的事儿,就不引用。

2. 不用的类库不引用

3.按需引入

import { debounce } from 'lodash'

import { throttle } from 'lodash'

// 改成如下写法

import debounce from 'lodash/debounce'

import throttle from 'lodash/throttle'

// 引入组件,自动转换

import _ from 'lodash'

_.debounce()

_.throttle()

额外补充的是,即便采用如上写法,还是不够快捷,每个用到的文件,都写一遍 import,实在多有不便。更可取的是,将项目所需的方法,统一引入,按需添加,组建出本地 lodash 类库,然后 export 全局使用;

// helper 文件夹下 lodash,统一引入你需要的方法

import _ from 'lodash'

export default {

  cloneDeep: _.cloneDeep,

  debounce: _.debounce,

  throttle: _.throttle,

  size: _.size,

  pick: _.pick,

  isEmpty: _.isEmpty

}

// 注入到全局

import _ from '@helper/lodash.js'

_.debounce()

4.尽可能引入更合适的包

 momentjs: SpaceTime: A lightweight way to manipulate, traverse, compare, and format dates and times across planet Earth。 具有与 monent 相似 api 的新类库,其体积又相对小很多(当然,据观察其灵活度略逊一筹);date-fns:现代JavaScript日期实用程序库( Modern JavaScript date utility library ),如 lodash 一样,可支持模块化

5.按需异步加载模块

关于前端开发优化,重要的一条是,尽可能合并请求及资源,如常用的请求数据合并,压缩合并 js,构造雪碧图诸此等等(当然得适当,注意体积,过大不宜);但,同时也当因需制宜,根据需要去异步加载,避免无端就引入早成的浪费。webpack 也是内置对这方面的支持; 假如,你使用的是 Vue,将一个组件(以及其所有依赖)改为异步加载,所需要的只是把:

import Foo from './Foo.vue'

改为如下写法:

const Foo = () => import('./Foo.vue')

如此分割之时,该组件所依赖的其他组件或其他模块,都会自动被分割进对应的 chunk 里,实现异步加载,当然也支持把组件按组分块,将同组中组件,打包在同个异步 chunk 中。如此能够非常有效的抑制 Javascript 包过大,同时也使得资源的利用更加合理化。

6.生产环境,压缩混淆并移除console

现代化中等规模以上的开发中,区分开发环境、测试环境和生产环境,并根据需要予以区别对待,已然成为行业共识;可能的话,还会有预发布环境。对待生产环境,压缩混淆可以很有效的减小包的体积;同时,如果能够移除使用比较频繁的 console,而不是简单的替换为空方法,也是精彩的一笔小优化。如果使用 UglifyJsPlugin 插件来压缩代码,加入如下配置,即可移除掉代码中的 console:

new webpack.optimize.UglifyJsPlugin({

  compress: {

    warnings: false,

    drop_console: true,

    pure_funcs: ['console.log']

  },

  sourceMap: false

})

7.Webpack3 新功能: Scope Hoisting

截止目前(17-08-06), Webpack 最新版本是 3.4.1;Webpack在 3.0 版本,提供了一个新的功能:Scope Hoisting,又译作“作用域提升”。只需在配置文件中添加一个新的插件,就可以让 Webpack 打包出来的代码文件更小、运行的更快:

module.exports = {

  plugins: [

    new webpack.optimize.ModuleConcatenationPlugin()

  ]

}

8.百度统计和GA

根据页面的访问数据进行对页面的优化。

你可能感兴趣的:(浅谈前端优化)