前端知识总结

部分来自:https://juejin.im/post/5cbd1e33e51d45789161d053

1. async 和 defer的相同点和区别

defer 延迟加载
async 异步加载
defer和async在“下载”这块是一样的,都是异步不会阻塞html的解析
区别在于何时执行,async不管声明顺序如何,加载完了后会立刻执行
defer将在页面完成解析(domcontentloaded)前执行,同时是按照加载顺序执行的

w3school的说法:

如果 async=“async”:脚本相对于页面的其余部分异步地执行(当页面继续进行解析时,脚本将被执行)
如果不使用 async 且 defer=“defer”:脚本将在页面完成解析时执行
如果既不使用 async 也不使用 defer:在浏览器继续解析页面之前,立即读取并执行脚本

我特意试了一下

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
<script src="./a.js"></script>
<script src="./a1.js" async></script>
<script src="./a2.js" defer></script>
<script src="./a3.js" ></script>

</head>

<body>
</body>
</html>

打印的结果是a、a1、a3、a2 意味着defer会滞后执行(注:2020-06 用chrome 68实验结果和mdn说的不一样,暂时不知道是什么原因,看到文章的博友也可以帮忙看下为什么)
https://segmentfault.com/q/1010000000640869[]

2. 关于服务端渲染

服务端渲染和普通的后端渲染的区别是:服务端渲染通过一个中间node层,直接返回一串html让浏览器解析;后端渲染也是返回html,但页面管理和后端耦合
总的来说减少了客户端和服务器来回的通信时间。
服务端渲染

3. requestAnimationFrame可以更快更准确的渲染

接收一个函数,requestAnimationFrame(Fn),比setInterval和setTimeout好

4. 如何自定义事件 (不考虑ie9之前版本)
  • (1) 使用new Event 无法获取event.detail
let btn = document.querySelector("#btn");
let event = new Event("someNewEvent",{
    name:"mj"
})
btn.addEventListener("someNewEvent",function(event){
    console.log("event",event)
})
btn.dispatchEvent(event) // 触发事件
  • (2) 使用createEvent(“customEvent”) 属于dom3

event.initEvent(eventType,canBubble,cancelable) 已废弃
该特性已经从 Web 标准中删除,虽然一些浏览器目前仍然支持它,但也许会在未来的某个时间停止支持,请尽量不要使用该特性。

let btn = document.getElementById("app");
let ev = document.createEvent("CustomEvent");
ev.initEvent("someNewEvent",true,true);
btn.addEventListener("someNewEvent",function(event){
    console.log("createEvent",event)
})
btn.dispatchEvent(ev);
  • (3) 使用 new CustomEvent
let btn = document.getElementById("app");
let ev = new CustomEvent("someNewEvent1",{
    bubble:true,
    cancleable:true,
    detail:"我是传递的参数"
})
btn.addEventListener("someNewEvent1",function(event){
    console.log("CustomEvent",event)
})
btn.dispatchEvent(ev);
  • (3) 使用 观察者模式
function eventHandler(){
    this.handler = {}
}
eventHandler.prototype = {
    constructor:eventHandler,
    add:function(type,handler){
        if(typeof this.handler[type]==="undefined"){
            this.handler[type] = []
        }
        this.handler[type].push(handler)
    },
    remove:function(type,handler){
        if(this.handler[type] instanceof Array){
            let arr = this.handler[type];
            for(let i = 0;i<arr.length;i++){
                if(arr[i] === handler){
                    arr.splice(i,1);
                    break;
                }
            }
        }
    },
    fire:function(event){
        if(this.handler[type] instanceof Array){
            let arr = this.handler[type];
            arr.forEach(handler=>handler(event))
        }
    }
}
5. == 和 === 的区别

===只有类型相同且值相同时,返回true
== 如果两者类型相同,比较值
如果两者类型不同,首先需要类型转换:

  • 如果比较的是null和undefined,返回true
  • 判断两者类型是否为string何number,如果是,将字符串转化为number
  • 判断一方是否为boolean,如果是,将boolean转化为number再判断
  • 判断一方是否为object且另一方为string、number或者symbol,如果是,将object转为原始类型再进行判断
6. 设置nginx代理

正向代理:代理的是客户端,如通过xxx网络上youtube,是通过xxx网络将国内ip转为一个对应的国外ip,即可访问
反向代理:客户端请求代理服务器,代理服务器向具体服务器请求,nginx作为服务器的一个代理人

反向代理设置:

server {
    listen       80;
    server_name  www.123.com;

    location / {
        proxy_pass http://127.0.0.1:8080;
        index  index.html index.htm index.jsp;
    }
}

当访问 www.123.com 时相当于访问 http://127.0.0.1:8080/index.html

7. Object.is

Object.is类似于===,但有一些细微差别,如
Object.is(NaN,NaN) // true
NaN===NaN // false

Object.is(+0,-0) // false
+0===-0 // true

8. BFC相关知识点
  • bfc内,盒子垂直排列;
  • 同一个bfc的两个元素的margin会发生垂直合并,使用bfc可保证margin都生效,因为bfc是页面上的一个独立容器,容器子元素不影响外面的元素
  • 计算bfc高度,浮动元素也算在内
  • bfc的区域不会与float box重叠,所以一个兄弟元素为float时,防止两者重叠,可把一个元素设置bfc
创建bfc

根元素
浮动元素,float不为none
position为absolute或fixed
overflow不为visible的元素
display为inline-block,table-cell,table-caption

9. commonJS、es6模块和AMD规范

AMD非同步加载,可指定回调函数

define(["package/lib"],function(){


})


define(function(require,exports,module))

commonJS:每个模块提供了一个exports变量,默认exports = module.exports
所以可以使用exports.add = function(){};exports.minus = function(){}
但是不要切断两者的引用,如将exports直接指向一个对象,exports=xxx
commonJS 使用require和module.exports

es6实现了import和export,实际上也是经过babel翻译成require和module.exports,所以编译还不够,还需要借助webpack这种工具打包
nodejs会把commonJS规范下代码全变成函数字符串,然后通过vm解析
浏览器中实现require和module对象,同时也是变成字符串让浏览器执行

10. node的一些知识
  • process.cwd():nodejs 进程的工作目录

  • __dirname: nodejs全局变量,获取当前文件所在目录完整目录名

  • __filename: 带完整路径得文件名

  • path.join(path1,path2,path3) 把路径字符串连起来并规范路径

  • path.resolve([from…],to) 相当于cd操作

loader:
https://www.jianshu.com/p/c89f1f3fd4af

plugin:
https://blog.csdn.net/yolo0927/article/details/85017565
https://www.jianshu.com/p/02e3f743659b

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值