2019年1月

下载.jpg

HTML5标签中增加了非常多的语义化标签,比如nav,footer诸如此类

但是这篇笔记,主要介绍这些语义化标签以及应用的场景

作为一个程序员,你肯定就在想,html非常的简单,是我们入门级别的语言

但是我想说:html是入门简单,精通非常难,可以完全和后端精通相媲美

因为难的指标就是:能够正确运用标签,可能会和自身的“文化”素养挂钩:

比如说:

语义类标签对开发者更为友好,使用语义类标签增强了可读性,即便是在没有的时候,开发者也能够清晰地看出网页的结构,也更为便于团队的开发和维护。除了对人类友好之外,语义类标签也十分适宜机器阅读。它的文字表现力丰富,更适合搜索引擎检索(SEO),也可以让搜索引擎爬虫更好地获取到更多有效信息,有效提升网页的搜索量,并且语义类还可以支持读屏软件,根据文章可以自动生成目录等等。

这是极客专栏上的一段话:但是我并不认为语义化标签能对开发造成良好的维护性,因为不是每一个前端工程师都精通语义化标签,这会造成累加更多的沟通成本

下面举一下比较简单的例子:ul是无序列表,ol是有序列表,可是在我们开发中,总是把一些相关性的信息列表做成ul,如果大量的使用此类代码,会对机器读码造成

肉眼开不见的压力,也会让你的代码变得更臃肿;

所以,对于语义标签,我的态度是:“用对”比“不用”好,“不用”比“用错”好。当然了,我觉得有理想的前端工程师还是应该去追求“用对”它们。

摘自极客专栏的一段话,作为一个优秀的前端工程师,不仅仅要考虑的是功能的实现,也要考虑你的标记语言是否在某个程度上是优雅的;

最后说一句话:标签语义化不是我们现在所担心的,因为它和你们的工作可能没任何关系,甚至可以继续使用div,span,都不影响,只是语义化是一个趋势,我们要改变这个风气。

下载.jpg

koa2是express框架的原班人马打造,仅仅只有600 700行代码,可谓超轻量级做小程序,博客轻量级程序,可以不用express,koa2也是一个非常不错的选择;

首先我们来看看koa2的入门demo吧,首先安装koa2,直接npm安装即可;

const koa = require('koa')
const app = new koa()

app.use(async(ctx,next)=>{
ctx.body = '1'
//下一个中间件
next();
//上下文
ctx.body = ctx.body+ '2'
})

app.use(async(ctx,next)=>{
ctx.body = '1'
//下一个中间件
next();
//上下文
ctx.body = ctx.body+ '2'
})

app.use(async(ctx,next)=>{
ctx.body = '1'
//下一个中间件
next();
//上下文
ctx.body = ctx.body+ '2'
})

app.listen('3000')

所谓的消息中间件的概念,就是一个类似洋葱圈的样子,我们从请求编译到结束,会从外层进入内层,再从内层穿过外层,执行next方法就会进入下一个中间件,
ctx是上下文对象;

我们可以写一个定时方法,然后使用await方法来进行等待中间件执行完毕;

app.use(async(ctx,next)=>{
ctx.body = '3'
await delay()
//下一个中间件
await next();
//上下文
ctx.body = ctx.body+ '4'
})

自己实现一个koa2的打印logger

module.exports=async(ctx,next)=>{
const start = new Date().getTime();
await next()
const end = new Date().getTime();

console.log(ctx.request.url,end-start,ctx.body.length)
}

打印请求路径,和运行时间,还有上下午字符串长度

我们直接在server.js中app.use使用这个logger,也别忘记了引入;

koa2的路由的2种实现方法

app.use(async(ctx,next)=>{
ctx.body = '1'
if(ctx.request.url == 'qitiandasheng'){
ctx.body = '齐天大圣'
}else if(ctx.request.url == '/'){
ctx.body = '首页'
}else{
ctx.body = '

404

'
}
//下一个中间件
await next();
//上下文
ctx.body = ctx.body+ '2'
})

第一种是利用上下文对象的request.url来在中间件中做判断来做出对应的显示;

还有一个比较正规的方法是利用koa2-router,首先我们安装它

router.get('/sun', (ctx, next) => {
ctx.body = '1'
next()
});

app
.use(router.routes())
.use(router.allowedMethods());

koa router地址:https://github.com/alexmingoia/koa-router

u=426744177,1467744783&fm=11&gp=0.jpg

当我学习es6的时候,Promise是比较新的解决回调的方案,然后今年去年就比较流行asynac来解决咯;

首先回顾一下回调地狱是怎么形成的;

function ajax(fn){

setTimeout(()=>{
console.log('你好')
},1000)

}

//callback回调地狱
ajax(()=>{
console.log("执行结束")
ajax(()=>{
ajax(()=>{
ajax(()=>{
})
})
})
console.log("执行结束")
})

这个是比较经典的callback回调地狱啦,我们如果这样书写嵌套,一些参数可能会比较恼人,而且修改也不好修改

所以第一代解决方案Promise,意思就是一个承诺,拥有2个参数,一个是接受,一个是拒绝,然后用then方法接受,相对来说比较优雅:

function delay(word){
return new Promise((reslove,reject)=>{
setTimeout(()=>{
reslove(word)
},2000)
})
}

//Promise解决方案1
delay('孙悟空')
.then((word)=>{
console.log(word)
return delay('猪八戒')
})
.then((word)=>{
console.log(word)
return delay('沙悟净')
})
.then(word=>{
console.log(word)
})

这个相对于我们原始的方式,简直是太方便了,但是直到我看到asynac,直接傻瓜式的写法,也是很6了;

//asynac和await解决方案2
async function start(){
const word1 = await delay('孙悟空')
console.log(word1)
const word2 = await delay('猪八戒')
console.log(word2)
const word3 = await delay('沙悟净')
console.log(word3)
}

我们直接这样使用,await必须要跟它搭配使用,且必须存在于一个方法体,函数必须要asynac修饰,目的就是等待执行,就完美解决了异步回调造成的代码污染的情况;

下一章的koa的中间件就是利用asynac和await来实现的哟