前端性能优化02vue性能优化

一、template语义化标签,避免乱嵌套,合理命名属性等等标准推荐的东西就不谈了。 模板部分帮助我们展示结构化数据,vue 通过数据驱动视图,主要注意一下几点 v-show,v-if 用哪个?在我来看要分两个维度去思考问题,第一个维度是权限问题,只要涉及到权限相关的展示无疑要用 v-if ,第二个维度在没有权限限制下根据用户点击的频次选择,频繁切换的使用 v-show ,不频繁切换的使用 v-if ,这里要说的优化点在于减少页面中 dom 总数,我比较倾向于使用 v-if ,因为减少了 dom 数量,加快首屏渲染,至于性能方面我感觉肉眼看不出来切换的渲染过程,也不会影响用户的体验。不要在模板里面写过多的表达式与判断 v-if="isShow && isAdmin && (a || b)" ,这种表达式虽说可以识别,但是不是长久之计,当看着不舒服时,适当的写到 methods 和 computed 里面封装成一个方法,这样的好处是方便我们在多处判断相同的表达式,其他权限相同的元素再判断展示的时候调用同一个方法即可。循环调用子组件时添加 key。 key 可以唯一标识一个循环个体,可以使用例如 item.id 作为 key,假如数组数据是这样的 ['a' , 'b', 'c', 'a'],使用 :key="item" 显然没有意义,更好的办法就是在循环的时候 (item, index) in arr ,然后 :key="index" 来确保 key 的唯一性。在列表数据进行遍历渲染时,给每一项item设置唯一key值,会方便vuejs内部机制精准找到该条列表数据。当state更新时,新的状态值和旧的状态值对比,较快地定位到diff。二、style将样式文件放在 vue 文件内还是外?讨论起来没有意义,重点是按模块划分,我的习惯是放在 vue 文件内部,方便写代码是在同一个文件里跳转上下对照,无论内外建议加上 <style scoped> 将样式文件锁住,目的很简单,再好用的标准也避免不了多人开发的麻烦,约定命名规则也可能会冲突,锁定区域后尽量采用简短的命名规则,不需要 .header-title__text 之类的 class,直接 .title 搞定。为了和上一条作区分,说下全局的样式文件,全局的样式文件,尽量抽象化,既然不在每一个组件里重复写,就尽量通用,这部分抽象做的越好说明你的样式文件体积越小,复用率越高。建议将复写组件库如 Element 样式的代码也放到全局中去。不使用 float 布局,之前看到很多人封装了 .fl -- float: left 到全局文件里去,然后又要 .clear,现在的浏览器还不至于弱到非要用 float 去兼容,完全可以 flex,grid 兼容性一般,功能其实 flex 布局都可以实现,float 会带来布局上的麻烦,用过的都知道。至于其他通用的规范这里不赘述。三、script这部分也是最难优化的点,说下个人意见吧。 ...

April 30, 2019 · 2 min · jiezi

create-react-app同时对多个框架(antd+antd-mobile)做按需加载的方法

在React项目开发中,经常需要引用一些实用的第三方框架。在使用一些比较庞大的第三方框架时,框架内的各种资源文件数量巨大,这时,如果我们在每次使用框架时,都将框架内所有资源都全部加载的话,这将使得页面的性能大大降低。这时,我们就需要对这些庞大的第三方框架做按需加载了。首先介绍下对单个框架做按需加载的方法其实在使用create-react-app脚手架的情况下,对单个框架做按需加载的方法,网上的相关文章已经很多了,我这里只简单的介绍下。常用的方法就是通过babel-plugin-import来实现按需加载,并通过react-app-rewired来重写项目配置文件,将babel-plugin-import写入配置。1、安装cnpm install babel-plugin-import –devcnpm install react-app-rewired –dev2、修改package.json"scripts": {- “start”: “react-scripts start”,+ “start”: “react-app-rewired start”,- “build”: “react-scripts build”,+ “build”: “react-app-rewired build”,- “test”: “react-scripts test”,+ “test”: “react-app-rewired test”,}3、在项目的根目录下创建一个 config-overrides.js 用于修改默认配置const {injectBabelPlugin} = require(‘react-app-rewired’);const rewireLess = require(‘react-app-rewire-less’);const path = require(‘path’)module.exports = function override(config, env) { config = injectBabelPlugin( [‘import’, { libraryName: ‘antd’, libraryDirectory: ’es’, style: true } ], config ); config = rewireLess.withLoaderOptions({ modifyVars: {"@primary-color": “#4197FC”}, javascriptEnabled: true, })(config, env); return config;};这样就完成了对antd的按需加载那么对多个框架做按需加载应该怎么做呢?对多个框架做按需加载的方法这里拿antd和antd-mobile两个框架来举例子首先还是要按照上面的步骤安装babel-plugin-import和react-app-rewired,并修改默认配置,区别只是在最后一步上。在调用babel-plugin-import的injectBabelPlugin方法时,需要调用两次,并注明相对应的框架名。具体代码如下:const {injectBabelPlugin} = require(‘react-app-rewired’);const rewireLess = require(‘react-app-rewire-less’);const path = require(‘path’)module.exports = function override(config, env) { config = injectBabelPlugin( [‘import’, { libraryName: ‘antd’, libraryDirectory: ’es’, style: true }, ‘ant’ ], config ); config = injectBabelPlugin( [‘import’, { libraryName: “antd-mobile”, libraryDirectory: ’lib’, style: true }, ‘ant-mobile’ ], config ); config = rewireLess.withLoaderOptions({ modifyVars: {"@primary-color": “#4197FC”}, javascriptEnabled: true, })(config, env); return config;}; ...

February 15, 2019 · 1 min · jiezi