如何让你的代码变得更优雅?这些代码规范和技巧必须知道(进阶必备,建议收藏)(代码片段)

欧阳呀 欧阳呀     2022-12-04     618

关键词:


在这里插入图片描述

1. 看你的代码就知道你几斤几两

1.1 面试常会犯的错

💂‍♂️:面试者
👨‍⚖️:面试官

  • 面试前

💂‍♂️:先把简历写好,机构老师特别交代:一出去就要说三年工作经验👲
💂‍♂️:面试题要背,工资不能要低了~
💂‍♂️:包装一下
💂‍♂️:…

  • 面试中

👨‍⚖️:问题回答的不错,可以看看你最近做的项目么?
💂‍♂️:这这这…
👨‍⚖️:或者你写的一些东西,github上有么
💂‍♂️(犹豫良久,拿出一个项目):您看下
👨‍⚖️(皱起了眉):这代码写的不对啊,考虑的不够完善…
💂‍♂️:呃呃呃…
👨‍⚖️(诧异):这里也有很明显的漏洞,这不像是一个三年经验的人写出的代码吧
💂‍♂️(满头大汗):这这这…
👨‍⚖️: 回去等通知吧(面试基本完犊子~)

  • 很多小伙伴面试都只注重“面子”,不注重“里子
  • 简历搞的高大上,牛皮吹的震天响
  • 一看代码,提几个问题,立马原形毕露
  • 实际上,我们写的每一行代码就是我们实力的最好证明,你的经验,你的技巧,你的习惯,都会在代码中展现。
  • 所以,想要提升,想升职加薪迎娶白富美,必须从改善代码习惯开始
    在这里插入图片描述

1.2 Javascript编码标准

  • 实际上,编码标准是有争议的,每个人可能都有自己的标准,但对标准应该是什么样的,则似乎很少能达成共识。
  • 但编码标准意味着,通过共同语言和一致的结构,把开发人员从无意义的工作中解放出来。把重心放在功能逻辑上去。
  • 一个好的标准能提供清晰明了的意图,是有效工作所必需的。

比较好的Javascript编码应该符合以下标准:

  • 编码错误的可能性降至最低(做好容错处理)
  • 代码适合大规模的项目和团队(一致的、可读的、可扩展的、可维护的)
  • 鼓励编码的效率、效果和复用(低耦合,高复用
  • 鼓励使用JavaScript的优点,避免使用它的缺点(缺点还是不少的,扬长避短)
  • 开发团队通用,无排他性

2. 编程标准

2.1 使用一致的缩进和行长

  • 代码被阅读的次数比编写它的次数要多得多
  • 所以维护性、可读性是第一的(如果你不想被后面接手的人骂娘的话,就要做好这点
  • 不知道大家有没有发现,报纸上的文本列都在50~80个字符的长度之间
  • 对人类的眼睛来说,超过80个字符的某一行,看起来会逐渐变得吃力(有相关科学研究表明)

所以我们得出来的结论是:

  • 每级代码缩进两个空格
  • 每行限制为78个字符
  • 这也是大厂通用写法,最为标准, 代码示例:
class Index extends Component 
  state = 
    navList: [
       name: '全部', index: 0, key: 'all' ,
       name: '展示中', index: 1, key: 'sell' ,
       name: '已下架', index: 2, key: 'out' ,
    ],
    pageTop: 0,
    navActive: 0,
    currentKey: 'all',
    page: 1,
    goodsData: ,
    hasMore: true,
    listLoading: false
  

在这里插入图片描述

2.2 按段落组织代码

在编排代码的时候,要以清晰明白为目标,而不是减少代码的字节数
该有的空格、空白都不能少

  • 按逻辑段落组织代码,段落之间要空行
  • 每一行最多只包含一条语句或赋值语句,但是允许每行同时声明多个变量
  • 运算符和变量之间要有空格,更容易地识别变量
  • 每个逗号之后要有空格
  • 在段落内,相似的运算符要对齐
  • 缩进注释,缩进量和所解释的代码相同
// 把一个或多个声明放在一行上,但每行只有一条赋值语句
let 
	z, x, c, v, d,
	a = l,
	b = 2,
	arr = [1, 2, 3],
	obj = aa: 1, bb: ''张三",
	name = "法外狂徒张三"
	;

// 在下一行段落的前面添加空行
// 函数将文本写入消息容器
print_msg = function ( msg_text )
  // 缩进注释,和它所描述的段落层级一致
  // .text() 防止xss注入
  $('#sl').text( msg_text );
;

// 函数返回随机数
get_rangdom = function ( num_arg )
  return Math.random() * numn_arg;
;

// 初始化值
x = get_random(  10 );
y = get_random(  20 );
r = get_random( 360 );

// 添加空白,对齐相似的元素,相似的语句更容易阅读
x += 10 + num;
y -= 20 - num;

2.3 换行要一致

  • 在运算符的前面换行,开发者检查更加方便
  • 把后续的语句缩进一个层次,比如使用两个空格
  • 在逗号分隔符的后面换行
  • 方括号或者括号单独占一行。清楚地表明这是语句的结尾,不会迫使读者横向扫寻分号
// 将运算符放在左边,排成一列
let str = '我知道你也在向我靠近,' 
		+ '星河万顷都是你的见面礼。'
		+ '所以我也走向了你,'
		+ '暮色千里皆是我的回礼。'
		+ '今夜星光月夜皆归你,我也归你~'

// 方括号单独占一行,下一条语句就容易识别了
// 使用尾部逗号,更容易维护
let addressArr = [
  '湖南省',  '湖北省',  '广西省',
  '江西省',  '江苏省',  '内蒙古自治区',
  '台湾省',  '澳门,  '香港',
];

在这里插入图片描述

3. 命名规范

3.1 变量

命名规则

  • 变量名使用a - z、A - Z、0 - 9、下划线和$符号
  • 变量名不要以数字开头
  • 语义化(看其名,知其意)

作用域

  • 当变量作用域是整个模块时使用驼峰式(模块名字空间的所有地方都可以访问该变量)
  • 当变量作用域不是整个模块时使用下划线 (模块名字空间内的某个函数的局部变量)
  • 确保所有模块作用域内的变量至少有两个音节,这样作用域就会很清晰(例如下:)
    • 用户中心 ⇒ userCenter
    • 商品列表 ⇒ goodsList
    • 消息通知 ⇒ messageInfo
  • 再来一组例子:
变量初始名局部作用域模块作用域
strdirection_strdirectionStr
idgoods_idgoodsId
msguser_msguserMsg
  • 全局变量用 const 定义,常量性质,字母全部大写(尽量少定义)

3.2 命名空间

  • 早期的JavaScript代码比较简单,单独在一张页面上使用,所以大部分时间不需要考虑命名空间的问题,使用全局变量,而不会有什么影响。
  • 但是随着JavaScript应用的蓬勃发展和第三方类库的普遍使用,全局变量的数据可能会急剧上升
  • 地域之门从此便开启了。(比如,当两个代码库声明了相同的全局变量时)
  • 使用单一的全局函数,把其他所有变量的作用域限制在该函数里面,就可以极大地减少这种问题
// 模拟一个第三方库 => jQuery 
(function(window)
	// 此变量只会在此区域生效,使用完之后垃圾回收机制自动回收
	// 不会污染全局变量
	let jquery = ;
)(window)
  • 命名空间的细粒度划分
// 在 jquery.js 中
let jquery = (function () 
  // some code here 
());

// 在 jquery.dom.js 中
let jquery.dom= (function () 
  // some code here 
());

// 在 jquery.css.js 中
let jquery.css = (function () 
  // some code here 
());

在这里插入图片描述

4. 松耦合,高复用

4.1 什么叫耦合?

  • 指一程序中,模块及模块之间信息或参数依赖的程度(官方解释)
  • 举个例子:
    • 多个零件在一起,组成了一辆车,各零件之间存在耦合
    • 电脑主机与显示屏,存在耦合
  • 在程序语言中,也会有耦合,比如A模块依赖于B模块
  • 我们通常是不需要耦合度很高的,除非特定组件,这样才可以达到高复用
    • 举个例子,比如布加迪的轮胎,是找米其林高度定制的,只能适用于布加迪车型,其它品牌车型是用不了的(耦合度越高,复用性越低
    • 在这里插入图片描述
    • 而电脑主机与显示器,一般耦合度就很低了,A品牌电脑主机可以用B,C,D品牌各型号的显示器,所以复用性高,可以自由组合。
    • 在这里插入图片描述

4.2 松耦合

  • 当修改一个组件而不需要更改其他组件时,就做到了松耦合
  • 耦合度视情况而定,复用性组件必须低耦合

如何松耦合?

  • 将JS从CSS中抽离:不要使用CSS表达式
//不好的做法
.boxwidth: expression(document.body.offsetWidth + ’px')
  • 将CSS从JS中抽离:通过JS修改CSS样式时,使用className或classList,不要逐条修改style样式
//不好的做法一
ele.style.color = 'red';
ele.style.left= '10px';
//不好的做法二
ele.style.cssText ='color:red;left:10px;';
.revealcolor:red;left:10px;
//好的做法一
ele.className += 'reveal';
//好的做法二
ele.classList.add('reveal');
  • 将JS从HTML中抽离:从JS文件放入外置文件中
  • 将HTML从JS中抽离:不要在innerHTML中拼接DOM结构,而是使用字符串模板,如handlerbars
    在这里插入图片描述

5. 函数优化

5.1 提炼函数

  • 在javascript开发中,大部分时间都在与函数打交道,所以希望这些函数有着良好的命名,函数体内包含的逻辑清晰明了
  • 如果一个函数过长,不得不加上若干注释才能让这个函数显得易读一些,那这些函数就很有必要进行重构
  • 如果在函数中有一段代码可以被独立出来,那最好把这些代码放进另外一个独立的函数中,这是一种很常见的优化工作。
  • 项目越大,必须拆分得越细,好维护(函数也是如此)
  • 千万不要一个函数从奶奶家写到外婆家去了

这样做的好处主要有以下几点:

  • 避免出现超大函数
  • 独立出来的函数有助于代码复用
  • 独立出来的函数更容易被覆写
  • 独立出来的函数如果拥有一个良好的命名,它本身就起到了注释的作用

比如在一个负责取得用户信息的函数里面,还需要打印跟用户信息有关的信息,那么打印的语句就可以被封装在一个独立的函数里:

let getUserInfo = function()
    ajax( 'http:// xxx.com/userInfo', function( data )
        console.log( 'userId: ' + data.userId );
        console.log( 'userName: ' + data.userName );
        console.log( 'nickName: ' + data.nickName );
    );
;
//改成:
let getUserInfo = function()
    ajax( 'http:// xxx.com/userInfo', function( data )
        printDetails( data );
    );
;
let printDetails = function( data )
    console.log( 'userId: ' + data.userId );
    console.log( 'userName: ' + data.userName );
    console.log( 'nickName: ' + data.nickName );
;

5.2 尽量减少参数

  • 调用一个函数时需要传入多个参数,那这个函数是让人望而生畏的(甚至调用起来还会骂娘~)
  • 必须搞清楚这些参数代表的含义,必须小心翼翼地把它们按照顺序传入该函数。
  • 在实际开发中,向函数传递参数不可避免,但应该尽量减少函数接收的参数数量

比如我们需要封装一个CSS操作库:

  • 第一版的代码
function cssTransform(ele, attr, val)
    // ele 要操作的元素
    // attr 运动属性 缩放,旋转
    // val 具体值
    if(!ele.transform)
        ele.transform = ;
    
    if(typeof val === "undefined")
        // 取值阶段
        // 取不到 设置默认值
        if(typeof ele.transform[attr] === "undefined")
            switch(attr)
                case "scale":
                case "scaleX":    
                case "scaleY":    
                case "scaleZ":
                    // attr是scale 默认值是1 其它都是0
                    ele.transform[attr] = 1;
                    break;   
                default:
                    ele.transform[attr] = 0;     
            
        
        // 取值完毕 返回该值
        return ele.transform[attr];
    else
        // 赋值阶段
        ele.transform[attr] = val;      // 设置属性 方便取值
        let transformVal = "";

        for(var s in ele.transform)
            switch(s)
                case "scale":
                case "scaleX":    
                case "scaleY":    
                case "scaleZ":
                    transformVal += " " + s + "("+(ele.transform[s])+")";
                    break;
                case "rotate":
                case "rotateX":    
                case "rotateY": 
                case "rotateZ": 
                case "skewX":
                case "skewY":    
                    transformVal += " " + s + "("+(ele.transform[s])+"deg)";
                    break;
                default:
                    transformVal +=  " " + s + "("+(ele.transform[s])+"px)";    
            
            ele.style.WebkitTransform = ele.style.transform = transformVal;
        
    

  • 我们需要传入三个参数,这就导致了传参的复杂性
  • 可以将它绑定到HTML元素上,减少传参
HTMLElement.prototype.cssTransform = function (prop, value)
    var transform,
        transformValue = "";
        if(this.transform === undefined) 
            this.transform = transform = Object.create(null);
        
        if(value !== undefined)
            // 赋值阶段
            this.transform[prop] = value;
            transform = this.transform;
            for(var name in transform)
                switch(name)
                    case "scale":
                    case "scaleX":    
                    case "scaleY":    
                    case "scaleZ":
                        transformValue += " " + name + "("+ transform[name]+")";
                        break;
                    case "rotate":
                    case "rotateX":    
                    case "rotateY": 
                    case "rotateZ": 
                    case "skewX":
                    case "skewY":    
                        transformValue += " " + name + "("+ transform[name] + "deg)";
                        break;
                    default:
                        transformValue +=  " " + name + "("+ transform[name] + "px)";    
                
                this.style.WebkitTransform = this.style.transform = transformValue;
            
        else
            // 取值
            return this.transform[prop];
        

  • 现在就只需要两个参数了
  • 核心代码没变,事件直接绑定在元素上,每一个html都拥有这个原型方法
  • 调用更加方便,传参更加简单
    在这里插入图片描述

6.条件优化

6.1 合并条件判断

  • 如果一个函数体内有一些条件分支语句,而这些条件分支语句内部散布了一些重复的代码,那么就有必要进行合并去重工作。
  • 假如有一个分页函数paging(),该函数接收一个参数currPage,currPage表示即将跳转的页码。
  • 在跳转之前,为防止currPage传入过小或者过大的数字,要手动对它的值进行修正,详见如下代码
let paging = function( currPage )
    if ( currPage == 0 )
        currPage = 0;
        jump( currPage ); // 跳转
    else if ( currPage == totalPage )
        currPage = totalPage;
        jump( currPage ); // 跳转
    else
        jump( currPage ); // 跳转
    
;
  • 可以看到,负责跳转的代码jump(currPage)在每个条件分支内都出现了,所以完全可以把这句代码独立出来
let paging = function( currPage )
    if ( currPage == 0 )
        currPage = 0;
    else if ( currPage == totalPage )
        currPage = totalPage;
    
    jump( currPage ); // 把jump 函数独立出来
;

6.2 条件语句过多,提炼成函数

  • 在程序设计中,复杂的条件分支语句是导致程序难以阅读和理解的重要原因,而且容易导致一个庞大的函数
  • 假设现在有一个需求是编写一个计算商品价格的 getPrice(),商品的计算只有一个规则:如果当前正处于夏季,那么所有冬装将以5折出售
let getPrice = function( price )
    let date = new Date();
    if ( date.getMonth() > 6 &&  date.getMonth() < 10 ) // 冬天
        return price * 0.5;
    
    return price;
;
  • 判断是否处于夏季
if ( date.getMonth() > 6 &&  date.getMonth() < 10 )
  • 这句代码要表达的意思很简单,就是判断当前是否正处于夏天(7 - 9月)。
  • 尽管这句代码很短小,但代码表达的意图和代码自身还存在一些距离,阅读代码的人必须要多花一些精力才能明白它传达的意图。
  • 其实可以把这句代码提炼成一个单独的函数,既能更准确地表达代码的意思,函数名本身又能起到注释的作用
let isSummer = function()
    let date = new Date();
    return date.getMonth() > 6 && date.getMonth() < 10;
;

let getPrice = function( price )
    if ( isSummer() ) // 夏天
        return price * 0.5;
    
    return price;
;

在这里插入图片描述

7. 循环优化

7.1 高效循环

  • 在函数体内,如果有些代码实际上负责的是一些重复性的工作
  • 合理利用循环不仅可以完成同样的功能,还可以使代码量更少
  • 以for循环为例,最常规写法
for (let i = 0; i < arr.length; i++) 
    // do something...

  • 大多数人都是这种写法,这种写法的缺点在于,每次循环都要去读取一次数组的长度,性能上并不友好
  • 变量情况的优化写法
for (let i = 0, j = arr.length; i < j; i++) 
    // do something...

  • 将长度进行存储,之后循环无需再去读取长度
  • 这只是上面写法的一种变体,另一种写法而已,谈不上优化。因为无块级作用域,所以和上面的效果是一样的
  • 优化版
for (let i = arr.length - 1; i >= 0; i--) 
    // do something...

  • 推荐的写法,它在第上面的基础上节约了一个变量
    在这里插入图片描述

8. 如何提升js性能

8.1 性能至关重要

  • 性能是创建网页或应用程序时最重要的一个方面,特别是加载性能,如果让用户等久了,别人干脆不等了,会造成用户流失
  • 用户对于应用的体验普遍要求提高了(现在来说,2s 内打不开网页的都是不合格的网站)
  • 应用的性能瓶颈,依然是在js上

8.2 优化方向

1. 删除未使用的js代码

  • 未使用的功能性代码以及与之相关的代码(它一样的会编译,运行)
  • 多余的依赖(不需要的及时删除)

2. 数组与对象避免使用构造函数

  • 构造函数是啥?
  • new Array(), new Object()等
demoObj = () => 
    let obj = new Object()
    obj.name = '朱小明'
    obj.age = 10
    obj.sex = '男'
    return obj

  • 推荐写法
demoObj = () => 
    let obj = 
        name: '朱小明',
        age: 10,
        sex: '男'
    
    return obj

3. 避免全局变量

  • js 的垃圾回收机制是不会销毁全局变量的
  • 所以它会常驻内存

4. 合理使用闭包

  • 闭包可以提供面向对象编程的便利,有私有属性和方法
  • 由于闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存
  • 过度使用闭包可能会导致内存占用过多的问题
  • 所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露

5. 减少循环中的活动

  • 循环本来就耗性能(特别是数据量大的)
  • 方法尽量不要放在循环中执行(执行多次,特别是逻辑复杂的方法,后果可想而知)

1. 如有错误,敬请指出
2. 原创不易,万字长文的总结差不多要一整天时间(熬夜肝文)
3. 如果帮到大家,请各位客官动动发财的小手支持一波(关注、评论、点赞、收藏)

3. 拜谢各位!后续将继续奉献优质好文
4. 如果存在疑问,可以私信我

在这里插入图片描述

让你的js更优雅的小技巧

首先,看一个非常不优雅的例子:看到这段代码,虽然代码很短,但是一眼看上去就不想再看了,也就是没什么可读性。这段代码,没有封装,随意定义一个变量都是全局变量,这样在多人开发或者是大型开发中,极其容易造成... 查看详情

9个小技巧让你的ifelse看起来更优雅(代码片段)

这是我的第52篇原创文章。ifelse是我们写代码时,使用频率最高的关键词之一,然而有时过多的ifelse会让我们感到脑壳疼,例如下面这个伪代码:是不是很奔溃?虽然他是伪代码,并且看起来也很夸张,但在现实中,当我们无数... 查看详情

9个小技巧让你的ifelse看起来更优雅(代码片段)

9个小技巧让你的ifelse看起来更优雅ifelse是我们写代码时,使用频率最高的关键词之一,然而有时过多的ifelse会让我们感到脑壳疼,例如下面这个伪代码:  我们本文提供了9种方法来解决掉那些“烦人”的ifelse,一... 查看详情

分享几个简单的技巧让你的vue.js代码更优雅(代码片段)

1.watch与computed的巧妙结合一个简单的列表页面。你可能会这么做:created()this.fetchData(),watch:keyword()this.fetchData()前端全栈学习交流圈:731771211//面向1-3经验年前端开发人员//帮助突破技术瓶颈,提升思维能力如果参数比较多关键字... 查看详情

9个小技巧让你的ifelse看起来更优雅(代码片段)

ifelse是我们写代码时,使用频率最高的关键词之一,然而有时过多的ifelse会让我们感到脑壳疼,例如下面这个伪代码:是不是很奔溃?虽然他是伪代码,并且看起来也很夸张,但在现实中,当我们无数次review别人代码时,都会发... 查看详情

详解mybatis类型处理器,让你的代码更优雅!

来源:https://www.cnblogs.com/zwwhnly/p/11238131.html本篇主要讲解在MyBatis中如何使用类型处理器。1.明确需求在设计之初,sys_role表的enabled字段有2个可选值,其中0代表禁用,1代表启用,而且实体类中我们使用的是Interg 查看详情

进阶:玩转css变量,让你的css变得更心动!(代码片段)

作者:wsafight https://github.com/wsafight/personBlog/issues/25如果当年的CSS 预处理器变量对于初入前端的我来说是开启了新世界的大门,那么CSS变量对于我来说无疑就是晴天霹雳。其功能不但可以优雅的处理之前js不好处理或不适... 查看详情

学会这10个javascript单行代码,让你的代码更优雅(代码片段)

干货推荐:学会这10个javascript单行代码,让你的代码更优雅数组去重从url获取参数并转为对象检查对象是否为空反转字符串生成随机十六进制检查当前选项卡是否在后台检测元素是否处于焦点检查设备类型文字复制到剪... 查看详情

seo之html优化:让你的网站html代码更符合seo规范

...极利于SEO的,可以让你的网站获得更好的搜索引擎排名。如何制作一个标准的HTML网页,如何做HTML优化,本文将为你详细阐述。一直想写下SEO中关于HTML优化方面的的文章,总算空出这部分时间来了。其实,HTML优化应该是网站内... 查看详情

摸透vue3中的13个全局api,让你的代码更优雅!(代码片段)

来源:Tzhttps://juejin.cn/post/6979394726927532068不知不觉Vue-next[1]的版本已经来到了3.1.2,最近对照着源码学习Vue3的全局Api,边学习边整理了下来,希望可以和大家一起进步。我们以官方定义、用法、源码浅析三个维度来... 查看详情

hystrix——让你的服务更稳一点

...的服务延迟导致自己的服务也被拖跨呢?是否在苦苦思考如何优雅的对依赖服务进行异步调用呢?是否希望当流量高峰时自动进行...1、为什么要用Hystrix在分布式服务环境下,服务之间的调用关系变得错综复杂,你是否担心依赖... 查看详情

高效学习es6,让你的代码更优雅

ES6是咱前端必备的技能,不过,你真的理解ES6的核心新特性吗? 来测试一下,看看这几个问题: ES5和ES6的区别?说一下你所知道的ES6var、let、const之间的区别是什么?什么时候用let,什么时候用co... 查看详情

css黑魔法小技巧,让你少写不必要的js,代码更优雅(代码片段)

...客:这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已,没想到受到了大家的欢迎,有人希望能博主还能整理个CSS的一些黑魔法小技巧,无奈我CSS一直很渣,没什么干货,最近写了一个Chrome插件GayHub,算是把GitHub... 查看详情

让你的代码更加优雅的编程技巧-跳转表(代码片段)

...》,今天我们看一个编程技巧-函数跳转表。我们先来看如何实现一个简易计算器。初始版本让我们实现一个简易计算器,我们首先能想到的方式是什么?switch语句或者ifelse语句。没错,初学就会想到的两种方式,我们来看看这... 查看详情

高清版!这18张python数据科学速查表,让你的代码变得更强大!

欢迎关注,专注Python、数据分析、数据挖掘、好玩工具!数据科学是利用科学方法、流程、算法和系统从数据中提取价值的跨学科领域。数据科学家综合利用一系列技能(包括统计学、计算机科学和业务知识)来... 查看详情

合理利用java不可变对象,让你的代码更加优雅

如果一个对象的状态在创建以后就不会再改变,那么就可以认为它是不可变对象。因为这些对象无法被修改,所以不需要考虑多线程下的同步问题,这使得不可变对象在多线程程序中能够发挥重大作用。如下所示,String对象就是... 查看详情

优雅的提交你的gitcommitmessage(代码片段)

...助大家重视和规范commitmessage的书写.起因知乎上有个问题:如何写好Gitcommitlog?很有意思,能看到各种提交风格:有用emoji的,有用唐诗的,有用随机生成的.风格没有对错,只要能够体 查看详情

代码风格.python-整体风格.0002.让你python程序软件目录更规范化?

...化能更好的控制程序结构,让程序具有更高的可读性,对于如何组织一个较好的目录结构,在Stackoverflow中几乎达成共识.目录结构:说明:假设你的项目名为app,我比较建议的最方便最快捷的目录结构,如下这样就足够.├── app│ ... 查看详情