最近在阅读《高效前端:Web高效编程与优化实践》这本书,书中介绍了前端高效编程的优化实践和前端基础。本文将结合我的的理解介绍部分高效编程的例子。css
表单中原生的radio/checkbox的样式各个浏览器都不太一致。要想统同样式,一种作法是本身div/span
去画,而后去监听单击事件。这种作法就是逻辑控制彻底要本身写,还有原生事件change
也没法使用。html
这里能够经过CSS提供伪类checked
来实现自定义样式。原理是把一个checkbox
和一个用来自定义样式的span
写在一个label
里面,checkbox
始终隐藏。前端
<style> input[type=checkbox]{ display: none; } /*未选中的checkbox的样式*/ .checkbox{ /* 实现略 */ } input[type=checkbox]:checked + .checkbox{ /* 实现略 */ } </style>
<label for="apple">
<input type="checkbox" id="apple">
<span class="checkbox"></span>
</label>
复制代码
有1~3个items要显示在同一行, 可是item的个数不必定,就一个的话item占宽100%,两个时各占50%,三个时各占33%。显然你能够用js来计算,可是这样有点繁琐。编程
咱们能够经过CSS3的first-child
和nth-last-child
来实现个数的区分数组
<style> li { width: 100% } li:first-child:nth-last-child(2), li:first-child:nth-last-child(2) ~ li{ width: 50% } li:first-child:nth-last-child(3), li:first-child:nth-last-child(3) ~ li{ width: 33% } </style>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
</ul>
复制代码
这个技巧应该是比较常见,经过把宽高设置为0,同时只设置一个边的border来画三角形。下面提供一些其余三角形画法:浏览器
// 斜边在左边的三角形
border-top: 50px solid transparent;
border-bottom: 50px solid transparent;
border-left: 50px solid #000;
// 直角三角形
border-left: 60px solid transparent;
border-right: 0 solid transparent;
border-bottom: 40px solid #000;
// 等边三角形
border-left: 28px solid transparent;
border-right: 28px solid transparent;
border-bottom: 40px solid #000;
复制代码
不推荐直接在JS里面更改样式属性, 应该经过增删类来控制样式,除了scroll和mousemove缓存
// common
function popCallback(popType){
switch(popType){
case: "favHouse":
favHouse();
break;
case: "saveSearch":
saveSearch();
break;
}
}
// strategy
var popCallback = {
favHouse: function(){ /*do sth.*/ },
saveSearch: function(){ /*do sth.*/ }
}
if(typeof popCallback[popType] === "function"){
popCallback[popType]();
}
复制代码
这边其实也能够在项目中静态类型检查器(Flow、TypeScript)来优化代码。书中有介绍几点还不错建议:antd
var num = 0,
str = '',
obj = null;
复制代码
// bad
var num = 5;
num = "-" + num;
// good
var num = 5;
var sign = "-" + num;
复制代码
// bad
function getPrice(count){
if(count < 0) return "";
else return count * 100;
}
// good
function getPrice(count){
if(count < 0) return -1;
else return count * 100;
}
复制代码
全局做用域比较复杂,因此查找属性比较慢。局部做用的查找是很快的app
// bad
var url = "";
if(window.location.protocal === "https:"){
url = "wss://xxx.com" + window.location.pathname + window.location.search;
}
// good 缓存成局部变量
var url = "";
var location = window.location;
if(location.protocal === "https:"){
url = "wss://xxx.com" + location.pathname + location.search;
}
复制代码
咱们的代码中应该避免==
的使用,应该使用===
,这样能够避免js类型转换带来的一些意外的结果。函数
==
建议的使用场景是判断变量是否为空的时候,即if(obj == null)
var nums = [4, 8, 1, 9, 0];
nums.sort((a, b) => b - a);
复制代码
var tpl =
` <div> <span>1</span> </div> `;
var url = `/list?page=${page}&type=${type}`;
复制代码
var tasks = [];
for(let i = 0; i <= 4; i++){
tasks.push(function(){
console.log("i is " + i);
});
}
for(var j = 0; j < tasks.length; j++){
tasks[j]();
}
复制代码
常见的Loading都有图片加载、AJAX请求、上传文件进度条。还有一个最近流行的骨架屏(skeleton loading)
这部分能够去看下一些UI库的基本理念和设计原则,如antd-design
Chrome Devtools调试建议能够看下F12里面的官方文档。
console.table
打印对象数组console.dir
能递归打印对象的全部属性,打印一个DOM结点devtools的Coverage标签栏,没有用到的用红色表示, 用到的用绿色表示
devtools有一个Renders能够用来研究重绘
书中的优化实践点仍是不少的,我这边就介绍部分相对比较经常使用的。其实优化实践给出了比较好的方案,可是实际仍是要结合具体状况来选择方案的。