この記事では主に Vue プロジェクトを最適化する方法を紹介します。編集者がそれを参考にさせていただきます。編集者をフォローして見てみましょう
久しぶりにブログ記事を書きます この記事は私が半年ほどVueフレームワークを使ってみた経験をまとめたものです この記事はあくまで雑談です。 vue-cli によって初期化されたプロジェクト、または webpack パッケージ化に依存するプロジェクトに適用されます。
数日前、Vue プロジェクトが大きくなるほど最適化が難しくなり、多くの苦痛が生じると言っているのを見かけましたが、これは最終的には解決されるべき問題であり、パフォーマンスには問題ありません。すべての主要なテスト Web サイトには関連データがあります。本題に入りましょう
基本的な最適化
いわゆる基本的な最適化は、あらゆる Web プロジェクトに必要であり、問題の根本です。 HTML、CSS、および JS は、それぞれ .vue ファイルの 、<template>、<style>、<script>、</style></template>
に対応します。 vue プロジェクトで最適化する価値のあるポイントは何ですか
,<template>,<style>,<script>,
下面逐个谈下 vue 项目里都有哪些值得优化的点
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 的唯一性。
style
将样式文件放在 vue 文件内还是外?讨论起来没有意义,重点是按模块划分,我的习惯是放在 vue 文件内部,方便写代码是在同一个文件里跳转上下对照,无论内外建议加上 <style scopeed>
将样式文件锁住,目的很简单,再好用的标准也避免不了多人开发的麻烦,约定命名规则也可能会冲突,锁定区域后尽量采用简短的命名规则,不需要 .header-title__text
之类的 class,直接 .title 搞定。
为了和上一条作区分,说下全局的样式文件,全局的样式文件,尽量抽象化,既然不在每一个组件里重复写,就尽量通用,这部分抽象做的越好说明你的样式文件体积越小,复用率越高。建议将复写组件库如 Element 样式的代码也放到全局中去。
不使用 float 布局,之前看到很多人封装了 .fl -- float: left
到全局文件里去,然后又要 .clear,现在的浏览器还不至于弱到非要用 float 去兼容,完全可以 flex,grid 兼容性一般,功能其实 flex 布局都可以实现,float 会带来布局上的麻烦,用过的都知道不相信解释坑了。
至于其他通用的规范这里不赘述,相关文章很多。
script
这部分也是最难优化的点,说下个人意见吧。
多人开发时尽量保持每个组件 export default {}
内的方法顺序一致,方便查找对应的方法。我个人习惯 data、props、钩子、watch、computed、components。
data 里要说的就是初始化数据的结构尽量详细,命名清晰,简单易懂,避免无用的变量,isEditing 实际可以代表两个状态,true 或 false,不要再去定义 notEditing 来控制展示,完全可以在模板里 {{ isEditing ? 编辑中 : 保存 }}
テンプレート
v-if="isShow && isAdmin && (a || b)",
このような式ですが識別することはできますが、長期的な解決策ではありません。不快に思われる場合は、それをメソッドに記述し、計算してメソッドにカプセル化します。この利点は、同じ式を判断するのに便利であることです。複数の場所に同じ権限を持つ他の要素を再度使用することもできます。表示を判断するときに同じメソッドを呼び出すだけです。 🎜 :key="item"
の使用は明らかに無意味です。より良い方法は、 (item) を使用することです。 、index) arr でループするときに、then:key="index"
を使用してキーの一意性を確保します。 🎜 .fl -- float: left
をグローバル ファイルにカプセル化してから、.clear を要求する人がたくさんいます。プロセッサは互換性のために float を使用する必要があるほど弱くはありません。flex と完全に互換性があり、実際、この機能は flex レイアウトで実装できます。私がその説明を信じていないことはわかっています。 🎜 export default {}
内のメソッドの順序を一貫した状態に保つようにしてください。対応するメソッドを見つけます。私は個人的にデータ、プロップ、フック、ウォッチ、コンピューテッド、コンポーネントを使用しています。 🎜 {{ isEditing Editing: Save}}
で完全に使用できます。props 親コンポーネントと子コンポーネントに値を渡すときは、次のようにしてください:width="" :heigth="" しないでください:option={} 必要なパラメーターのみを指定できることです。子コンポーネントの props にデータ型を追加し、エラーのトラブルシューティングを容易にし、値の転送をより厳密にするためにデフォルト値を追加します。
フックは、ライフサイクルの意味、いつリクエストされるべきか、いつメソッドをログアウトすべきか、どのメソッドをログアウトする必要があるかを理解する必要があるだけです。シンプルでわかりやすく、公式サイトに書かれています。
メソッドの各メソッドはシンプルでなければならず、パラメータが多すぎない短くて再利用可能なメソッドをカプセル化するようにしてください。開発に lodash に大きく依存している場合、メソッドははるかに単純に見えますが、プロジェクトで少数のメソッドのみが使用されている場合は、loadsh をローカルに導入できます。 lodash を使用したい場合は、util.js ファイルを自分でカプセル化できます
どちらを使用するかについては、計算された属性は主にフィルター変換のレイヤーを参照してください。いくつかの呼び出しメソッドを追加しないでください。watch の機能は、データの変更を監視したり、this.$store.dispatch('update', { ... })
コンポーネントの最適化
などのイベントをトリガーしたりすることです。プロジェクトの規模に応じて解体するのが合理的です。小規模なプロジェクトであれば vuex や axios などを使用せずに、いくつかのコンポーネントだけで完了できます。規模が大きくなると、コンポーネントを細分化する必要があります。より詳細な方が良いです。レイアウトのカプセル化、ボタン、フォーム、プロンプト ボックス、カルーセルなどを含みます。そのような詳細を記述する時間がない場合は、Element コンポーネント ライブラリのコードを参照することをお勧めします。クリックして最適化しますvue-router と vuex の最適化
vue-router ルートの切り替えに加えて、最も一般的に使用されるロジックは、アクセス許可の処理とアクセス許可の制御です。ここでは詳細には触れませんが、関連するデモや記事がたくさんあるので、最適化に関して言えば、コンポーネントの遅延読み込みについて言及する価値があります正午の公式 Web サイトのリンクは、上記の例は次のとおりですconst Foo = r => require.ensure([], () => r(require('./Foo.vue')), 'group-foo') const Bar = r => require.ensure([], () => r(require('./Bar.vue')), 'group-foo') const Baz = r => require.ensure([], () => r(require('./Baz.vue')), 'group-foo')
このコードは、Foo、Bar、Baz の 3 つのコンポーネントを組み合わせたもので、ファイルの残りの部分は group-foo という名前のチャンク ファイルにパッケージ化されています。 Web サイトがロードされると、どのチャンクをロードする必要があるかを自動的に分析します。ただし、個別のパッケージの総量は大きくなりますが、最初の画面のリクエスト速度を見ると、それははるかに高速です。もっと早く。
这一步是将转换后的数据更新到 state 里,可能会有数据分发的过程(传进一个 object 改变多个 state 中 key 的 value),可以转换数据结构,但是尽量不做字段转换,在上一步做
此时的 store 已经更新,使用 getter 方法来取值,token: state => state.token,单单的取值,尽量不要做数据转换,需要转换的点在于多个地方用相同的字段,但是结构不同的情况(很少出现)。
在组件里用 mapGetters 拿到对应的 getter 值。
打包优化
上面说了代码方面的规范和优化,下面说下重点的打包优化,前段时间打包的 vender bundle 足足 1.4M,app bundle 也有 270K,app bundle 可以通过组件懒加载解决,vender 包该怎么解决?
有人会质疑是不是没压缩或依赖包没去重,其实都做了就是看到的 1.4M。
解决方法很简单,打包 vender 时不打包 vue、vuex、vue-router、axios 等,换用国内的 bootcdn 直接引入到根目录的 index.html 中。
例如:
<script src="//cdn.bootcss.com/vue/2.2.5/vue.min.js"></script> <script src="//cdn.bootcss.com/vue-router/2.3.0/vue-router.min.js"></script> <script src="//cdn.bootcss.com/vuex/2.2.1/vuex.min.js"></script> <script src="//cdn.bootcss.com/axios/0.15.3/axios.min.js"></script>
在 webpack 里有个 externals,可以忽略不需要打包的库
externals: { 'vue': 'Vue', 'vue-router': 'VueRouter', 'vuex': 'Vuex', 'axios': 'axios' }
此时的 vender 包会非常小,如果不够小还可以拆分其他的库,此时增加了请求的数量,但是远比加载一个 1.4M 的 bundle 快的多。
总结
本文谈的优化可以解决部分性能问题,实际开发细节很多,总之按着规范写代码,团队的编码风格尽量统一,处理细节上多加思考,大部分性能问题都能迎刃而解。
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
以上がVue プロジェクトを最適化するときは何に注意する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。