如何让你初学的Vue项目看起来十分高端、牛逼?

前言

我们之所以拥抱Vue.js以及React等MVVM框架,原因有很多,其中重要的一条就是:优雅,容易维护。而初学者在使用了Vue.js之后,代码依然是一团面条,这显然还有很大的提升空间。现在我们研讨一下,如何让你的Vue项目看起来十分的牛逼?

我来列一列:

发誓:不重构一次就自杀

在你会用Vue写出一个项目之后,你要做的并不是去写第二个项目,而是不断思考:如何重构。

你对前一个项目的重构绝对是值得的,你之后的所有项目都会获益。

有句圈内名言是:“程序员看自己一个月前的代码,都有种想吐的感觉”,这很正常。一个项目除了基本维护,还要有重构的心,当然了,重构的工作量是相当大的,可能会相当于第一次开发时间的30%-80%甚至更多,所以一定要制定计划,还要有心理准备。

多学习高star的开源作品

作为初学者,你身边不太可能有很多大牛,毕竟大牛云集的公司也没你的容身之处。我比较推荐的学习对象是github,去上面找高star的开源作品,这些作品的水平是经得住检验的。

封装!再封装!

封装是让代码看起来优雅的最有效办法,没有之一。当你不知道怎么重构,那么,先封装。

将一切能复用的代码全都封装起来,存到另外的文件中,然后import。包括:

  • 组件
  • 混入
  • 工具
  • ajax

等等。

最后,让你的page(或者叫view)文件夹里的每个.vue文件的js行数不超过100行,css行数不超过100行,就是最合适的,你的代码如果能给人这种感觉:“卧槽?外观看着复杂的页面,vue文件就这么几行代码?”——恭喜,你成功了。

拆分

封装肯定要拆分,但拆分不一定都是封装,有时候只是将大文件拆分成多个小文件。

我们都知道,对人脑来说,最一目了然的“索引”,就是目录和文件名,因为你连文件都不用打开,就能知道这个文件是干什么用的,这样维护一个项目无疑是优雅的。

比如,一个项目的scss文件,就可以这么拆分:

image.png

完全不用解释,也不用打开文件看内容,我就一定知道这些文件的代码大致会是什么样的,是负责什么职责的。

同样的,公用js文件也可以拆分,比如utils.js、modal.js等等。就比如这个modal.js,可能代码不超过50行,功能也很单一,就是负责弹出对话框,但是依然单成为一个文件,你会问,这么做值得么?值。它负责了一个很常用的、无歧义的功能,又不算utils,因为utils主要是做一些计算函数,比如格式化时间戳、比如对js原生函数做一些补充,等等。更何况,modal.js可能还包括若干种使用场景,比如它的content可能是文本,也可能是表单,那么你的弹出框函数可能要准备2个,一个是基本弹出框,一个是带表单的弹出框,所以整体下来可能70、80行都有可能,值得单成一个文件。

最后差不多是这意思:

- scss
- - base.scss
- - icon.scss
- - index.scss
- - mixin.scss
- - reset.scss
- - variable.scss
- config.js
- utils
- - ajax.js
- - modal.js
- - utils.js
- - ......

page文件夹的目录结构

业内通常做法是根据page的名字先命名文件夹,然后里面放一个跟page名字相同的.vue文件。也就是:

- page
- - home
- - - home.vue
- - search
- - - search.vue

然后,再考虑home.vue的组件存放在哪,以及home的某个子页存放在哪,这时候业内的习惯就有不同说法了,而我的建议是:

一、能复用的组件当然要拆分。
二、不能复用的组件封装不封装呢?看情况而定。假如不封装,全写在home.vue里,依然能保持home.vue足够整洁,那么就不要封装,否则,就可以去封装。

对于复杂的页面,就比如仿美团的webapp的首页,肯定是很复杂的,这个可以拆分组件封装起来。

三、组件放在哪里?我建议:放在跟page并列的components文件夹里,也就是:

- components
- - home
- - - home-slider.vue
- page
- - home
- - - home.vue
- - search
- - - search.vue

所以,components文件夹不一定包含所有page的组件。

这个方案的优势:

开发者和阅读代码者,永远将目光放在page文件夹,不要被其他任何文件夹分心,也就是说,page相当于主干道,而其他文件夹、其他文件相当于小路,小路用到的时候自然回去查阅怎么走,用不到的时候,永远不要出现在宏观视野里。

有些人的方案是,在page\search文件夹建一个components目录,然后放组件,这样的劣势很明显,乱,IDE的左侧目录树里各种components文件夹。

四、子页面放哪里?实践中你会发现,比如一个search页面,它其实还分成多个page来辅助,这些子页面怎么存放?根据上个自然段的原则,就很好办了:放到search文件夹就可以了。比如:

- components
- - common ------ 公用组件,不多说
- - home
- - - home-slider.vue
- page
- - home
- - - home.vue
- - search
- - - search.vue
- - - search-setting.vue
- - - search-setting-xxx.vue

而有些人的做法是,建立一个children文件夹:

- components
- - common ------ 公用组件,不多说
- - home
- - - home-slider.vue
- page
- - home
- - - home.vue
- - search
- - - search.vue
- - - children
- - - - setting.vue

显然,用children文件夹,就不符合“一目了然”的原则,因为还要打开子目录才能看清全貌,甚至children里面还有children,结果满眼的children。

总之,如果你对别人说“我维护了一个80多页的大项目”,那么,你的page文件夹里有80多个vue文件就没错了,不要有多余的文件,不要有复杂的子目录,这样无论对开发者、后继维护者、吃瓜群众来讲,都是最好的目录架构。

怎么对待vuex

你可能有N种选择:

  1. 干脆不用vuex
  2. 用简单用法,一个store.js搞定
  3. 用高级用法,index.js、state.js、getter.js、action.js、mutations.js、mutation-types.js一个也不能少
  4. 再加上module和其他高级用法

怎么选,需要你跟你的团队商定。我觉得吧:

  • 单人开发:不用vuex,或是简单模式足够,无论项目有多复杂。
  • 多人开发,还是用高级用法和更高级用法为妙。

注释

给函数和类做注释是一个好习惯,通常注释长得像这样:

/**
 * 干什么什么用途的
 * @param {Sting} url
 * @param {Sting} title
 * @param {Number} w
 * @param {Number} h
 * @return {number} 返回XXX
 */

如果你用VS Code,当你写好一个函数或者类,紧贴这个函数或者类的上一行敲入/**,会有一个JSDoc提示,自动抓取该函数的参数。

VS Code官方介绍是:https://code.visualstudio.com/Docs/languages/javascript#_js-doc-support

当你紧贴函数敲入:

image.png

就会形成:

image.png

可见,自动生成的注释只是个半成品,你需要:

  1. 注意到上面有一个空行了么?这里写函数的用途
  2. 将星号换成数据类型,比如StingNumber
  3. 每个参数后面都可以加解释,例如* @param {Sting} url 请求地址
  4. 如果有返回值,可以最下方新增一行,写上* @return {number} 返回XXX

可能你见过更为复杂的注释,比如有作者、最后编辑时间等,也可以加上:

/**
 * 干什么什么用途的
 * @author 某某某
 * @lastModified 2019.3.15
 * @param {Sting} url
 * @param {Sting} title
 * @param {Number} w
 * @param {Number} h
 * @return {number} 返回XXX
 */

都是可以的,更为复杂的内容我认为就没必要加了。

如果你需要使用JSDoc生成API文档,那时候你才需要仔细研究JSDoc的每一个细节。

ESLint

无论对于什么层级的选手,ESLint都属于又爱又恨的东西,当你正在思考复杂的逻辑的时候,它突然给你来个“没有敲空格”的提示,你说难受不难受?但是,又不能不用。

其实网上已经有很多的文章介绍正确的ESLint用法,简单说:

  1. 平时关掉ESLint,做法是去相关配置文件注释掉关于ESLint的配置
  2. 只在阶段性编程任务完成之后,再取消注释,然后一次性排查所有错误

其他细节

其他细节就不好总结了,需要慢慢积累。

比如template里面的插值表达式,你是用{{ xxx }}这种写法,还是{{xxx}}?显然,前者看着更舒服。但是,是不是凡是能空格的地方全空格呢?又不一定。

总之,多学习,多积累,你就能够写出漂亮优雅的代码。

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

推荐阅读更多精彩内容