• 《前端JavaScript重点》学习笔记 6-12


    回顾JS基础知识

    • 特点:表面看起来不能用于工作中开发代码。
    • 内置函数:Object Array Boolean String ......
    • 内置对象:Math JSON
    • 我们连网页弹出一句‘hello world’都不能实现
     
    常说的JS包含两部分:
    • JS基础知识(ECMA262标准)://规定基础语法、规则
    • JS-Web-API(W3C标准)://浏览器需要让开发者做更多事情。例如,如何弹出一个框
     
    JS-Web-API
    W3C标准关于JS的规定有
    • DOM操作
    • BOM操作
    • 事件绑定
    • ajax请求(包括http协议)
    • 存储
    JS-Web-API
    页面弹框window.alert(123),浏览器需要做:
    1)定义一个window全局变量,对象类型
    2)给它定义一个alert属性,属性值是一个函数
     
    获取元素document.getElementById(id),浏览器需要做:
    1)定义一个document全局变量,对象类型
    2)给它定义一个getElementById的属性,属性值是一个函数。
     
    但w3c标准没有规定任何JS基础相关的东西
    不管什么变量类型、原型、作用域和异步(这些是ECMA262规定的)
    只管定义用于浏览器中JS操作页面的API和全局变量。
     
    全面考虑,JS内置的全局函数和变量有哪些?
    1)之前讲过的 Object Array Boolean String Math JSON等
    2)刚刚提到的window document
    3)接下来要讲的navigator,所有未定义的全局变量
     
    NodeJS包含JS基础知识(ECMA262标准),但不含W3C标准,因为nodeJs不是跑在浏览器的,而是在服务器中。
    前端的JS则是二者的集合。
     
     
    第六篇  DOM和BOM
    题目:
    1.DOM是哪种基本的数据结构
    2.DOM操作常用的API有哪些
    3.DOM节点的attr和property有何区别
    4.如何检测浏览器的类型
    5.拆解url的各部分
    知识点#####
    • DOM本质
      DOM(Document Object Model——文档对象模型)是用来呈现以及与任意 HTML 或 XML 交互的API文档。DOM 是载入到浏览器中的文档模型,它用节点树的形式来表现文档,每个节点代表文档的构成部分(例如: element——页面元素、字符串或注释等等)。
      DOM可以理解为浏览器把拿到的HTML代码,结构化为一个浏览器能识别并且js可操作的模型。
              // HTML是XML的特殊类型
    • BOM本质
      BOM(Browser Object Document)即浏览器对象模型。
      BOM提供了独立于内容 而与浏览器窗口进行交互的对象;
      由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象是window;
      BOM由一系列相关的对象构成,并且每个对象都提供了很多方法与属性;
    • DOM节点操作
      • 获取DOM节点
                        var div1=document.getElementById('div1') //元素
                        var divList=document.getElementByTagName('div') //集合
                        console.log(divList.length);
                        console.log(divList[0]);
     
                        var containerList=document.getElementByClassName('.container') //集合
                        var pList=document.querySelectorAll('p') //集合
     
    • property
                        js对象的属性
            var pList=document.querySelectorAll('p')
            var p=pList[0]
            //获取了DOM对象,对象在js中都是可扩展的
            console.log(p.style.width); //获取样式
            p.style.width='100px' //修改样式
            console.log(p.className); //获取className
            p.className='p1' //修改className
            //获取nodeName和nodeType
            console.log(p.nodeName);
            console.log(p.nodeType);
     
    • Attribute
    标签属性,用于扩充HTML标签,可以改变标签行为或提供数据,格式为name=value
    var pList=document.querySelectorAll('p') 
    var p=pList[0] 
    p.getAttribute('data-name') 
    p.setAttribute('data-name','imooc') 
    p.getAttribute('style') 
    p.setAttribute('style','font-size:30px;')
     
    • DOM结构操作
      • 新增节点
    var div1=document.getElementById('div1')
    var p1=document.createElement('p') //创建新节点
    p1.innerHTML='Hello'
    div1.appendChild(p1) //添加新创建的元素
    //移动已有节点
    var p2=document.getElementById('p2')
    div1.appendChild(p2) 
    • 获取父子元素、删除节点
    var div1=document.getElementById('div1')
    var parent=div1.parentElement //获取父元素
    var child=div1.childNodes //获取子元素
    div1.removeChild(child[0]) //移除child[0]子节点
    • navigator&screen
    //navigator
    var ua=navigator.userAgent
    var isChrome=ua.indexOf('Chrome')
    console.log(isChrome);
    //screen
    console.log(screen.width);
    console.log(screen.height);
    • location&history
    //location
    console.log(location.href); //整个URL路径
    console.log(location.protocol); //http https
    console.log(location.pathname); //域名之后的路径
    console.log(location.search); //?后的参数
    console.log(location.hash);  //#后的内容
    //history
    history.back()
    history.forward()
    解题#####
    1.DOM是哪种基本的数据结构
    2.DOM操作常用的API有哪些
    • 获取DOM节点以及节点的property和Attribute
    • 获取父节点,获取子节点
    • 新增节点,删除节点
    3.DOM节点的attr和property有何区别
    • property是一个JS对象的属性的修改
    • Attribute是HTML标签属性的修改
    4.如何检测浏览器的类型
    navigator.userAgent
    5.拆解url的各部分
    //location
    console.log(location.href);  
    console.log(location.protocol); //协议 http https
    console.log(location.pathname); //域名之后的路径
    console.log(location.search);
    console.log(location.hash);
     
     
    第七篇  事件
    题目:
    1.编写一个通用的事件监听函数
    2.描述事件冒泡流程
    3.对于一个无限下拉加载图片的页面,如何给每个图片绑定事件
     
    知识点#####
    • 通用事件绑定
    //标准方法    容易写错,
    var btn=document.getElementById('btn1');
    btn.addEventListener('click',function(e){
        console.log('clicked');
    })  
    //封装事件绑定
    function myBindEvent(elem,type,fn){
         elem.addEventListener(type,fn)
    }
    var a=document.getElementById('link1');
    myBindEvent(a,'click',function(e){
        e.preventDefault();  //阻止默认行为
        alert('link1 has clicked');
    })
    IE低版本使用attachEvent绑定事件,和W3C标准不一样
    IE低版本使用量已非常少,很多网站都早已不支持        
    建议对IE低版本的兼容性:了解即可,无需深究
    如果遇到对IE低版本要求苛刻的面试,果断放弃
     
    • 事件冒泡
    <div id="div1">
        <p id="p1">激活</p>
        <p id="p2">取消</p>
        <p id="p3">取消</p>
        <p id="p4">取消</p>
    </div>
    <div id="div2">
        <p id="p5">取消</p>
        <p id="p6">取消</p>
    </div>
    <script type="text/javascript">
        function myBindEvent(elem,type,fn){
            elem.addEventListener(type,fn)
        }
        var p1=document.getElementById('p1')
        var body=document.body;
        myBindEvent(p1,'click',function(e){
            e.stopPropagation();    //阻止冒泡
            alert('激活')
        })
        myBindEvent(body,'click',function(e){
            alert('取消');
        })
    </script>
    点击p1,弹出“激活”,如果没有e.stopPropagation(),事件将继续向上冒泡找到body的alert('取消')
     
    • 代理
    <div id="div1">
        <a href="#">a1</a>
        <a href="#">a2</a>
        <a href="#">a3</a>
        <a href="#">a4</a>
        <!-- 会随时新增更多a标签 -->
    </div>
    <script type="text/javascript">
        function myBindEvent(elem,type,fn){
            elem.addEventListener(type,fn)
        }
        var div1=document.getElementById('div1')
        myBindEvent(div1,'click',function(e){    //通过事件冒泡机制
            var target=e.target //获取要绑定事件的元素
            if(target.nodeName==='A'){
                alert(target.innerHTML)
            }
        })
    </script>
    点击每一个a标签弹出对应的标签内的内容
    解题#####
    1.编写一个通用的事件监听函数
     //仅有这种情况使用'=='
    if(obj.a==null){
        //此时条件相当于obj.a===null||obj.a===undefined,简写形式
        //这是jQuery源码中推荐的写法
    }
     
    function myBindEvent(elem,type,selector,fn){
        if(fn==null){   
            fn=selector;
            selector=null;
        }  
        elem.addEventListener(type,function(e){
            var target;
            if(selector){
                // 代理
                target=e.target;
                if(target.matches(selector)){ //判断目标节点是否和选择器匹配   
                    fn.call(target,e);   //target被当做fn函数中的this
                }
            }else{
                // 不使用代理
                fn(e);
            }
        })
    }
    //mathes()  用来判断当前DOM节点能否完全匹配对应的CSS选择器规则;如果匹配成功,返回true,反之则返回false。
    //使用代理
    var div1=document.getElementById('div1');
    myBindEvent(div1,'click','a',function(e){
        e.preventDefault();
        console.log(this.href);
    })
     
    //不使用代理
    var btn1=document.getElementById('btn1');
    myBindEvent(btn1,'click',function(e){
        console.log(btn1.innerHTML);
    })
     
     
     
    //上一篇知识点:call apply bind
    function fn1(name,age){
        alert(name)
        console.log(this)    
    }
    fn1.call({x:100},'zhangsan',20)    //({x:100}
     
    代理的好处:
    • 代码简介 (不用写那么多绑定)
    • 减少浏览器内存占用 (绑定一次浏览器累积一次)
    2.描述事件冒泡流程
    • DOM树形结构
    • 事件冒泡
    • 阻止冒泡
    3.对于一个无限下拉加载图片的页面,如何给每个图片绑定事件
    使用代理
    第八篇  存储与Ajax
    1.请描述一下cookie,sessionStorage,和localStorage的区别
    2.手动编写一个ajax,不依赖第三方库
    3.跨域的几种实现方式
    知识点#####
    • cookie
      • 本身用于客户端服务端通信,但它有本地存储的功能于是就被‘借用’,使用documen.cookie=...获取和修改
      • 缺点:
        • 存储量太小,只有4kb
        • 所有http请求都带着,会影响获取资源的效率
        • API简单,需要封装才能用,document.cookie=...用起来麻烦
    • localStorage和sessionStorage(这两者在HTML5出现之后才出现)
      • HTML5专为存储设计,最大容量5M(不用在http请求中携带)
      • API:localStorage.setItem(key,value); localStorage.getItem(key); // sessionstorage也是setItem(),getItem().
      • IOS Safari隐藏模式下,localStorage.getItem(key);会报错,建议同意使用try-catch封装
      • 区别:localstorage可以存储在本地,sessionStorage在浏览器关闭时就会清理。因此多用localstorage。
    • cookie sessionStorage localStorage区别
      • 容量区别,cookie为4k,localStorage和sessionStorage为5M
      • cookie每次请求都会被携带在ajax中,localStorage和sessionStorage不会被携带只作为存储使用
      • API易用性   cookie自己封装一大段代码,后两个用两个API基本满足需求
    • XMLHttpRequest
    var xhr=new XMLHttpRequest();
    xhr.open('GET','/api',false)
    xhr.onreadystatechange=function(){
    //这里的函数异步执行
        if(xhr.readyState==4){
            if(xhr.status==200){
                alert(xhr.responseText)
            }
        }
    }
    xhr.send(null)
            IE低版本使用ActiveXObject,和W3C标准不一样
            IE低版本使用量已非常少,很多网站都早已不支持        
            建议对IE低版本的兼容性:了解即可,无需深究
            如果遇到对IE低版本要求苛刻的面试,果断放弃
    • 状态码说明
      • readyState
        • 0-(未初始化)还没有调用send()方法
        • 1-(载入)已调用send()方法,正在发送请求
        • 2-(载入完成)send()方法执行完成,已经收到全部响应内容
        • 3-(交互)正在解析响应内容
        • 4-(完成)响应内容解析完成,可以在客户端调用了
      • status
        • 2xx-成功处理请求。如200
        • 3xx-需要重定向,浏览器直接跳转
        • 4xx-客户端请求错误,如404(地址错误)
        • 5xx-服务器端错误
    • 跨域
      • 什么是跨域
        • 浏览器有同源策略,不允许ajax访问其他域接口
                                    http://www.yourname.com:8080/page1.html
                                    https://m.imooc.com:80/course/ajaxcoursercom?cid=4001
                                    协议:http/https;
                                    域名:www.yourname.com/m.imooc.com
                                    端口:8080/80  不写时使用默认值
     
    • 跨域条件:协议、域名、端口,有一个不同就算跨域
     
    • 可以跨域的三个标签:
      • <img src=''>
      • <link href=''>
      • <script src=''>
    • 三个标签的场景
      • <img> 用于打点统计,统计网站可能是其它域
      • <link><script>可以使用CDN,CDN也是其它域
      • <script>可以用于JSONP,马上讲解   //JSONP就是利用<script>的src来实现跨域获取数据的。
    • 跨域注意事项
      • 所有的跨域请求都必须经过信息提供方的允许
      • 如果未经允许即可获取,那就是浏览器的同源策略出现漏洞
     
     
                        假如你的网站要跨域访问慕课网的一个接口,慕课网给你一个地址http://coding.m.imooc.com/api.js,返回内容格式如callback({x:100,y:200})(可动态生成)
    <script>
        window.callback=function(data){
            //这是我们跨域得到的信息
            console.log(data);
        }
    </script>
    <script src='http://coding.m.imooc.com/api.js';></script>
    <!-- 以上将返回callback({x:100,y:200}) -->
     
     
    补充:
    JSONP 是 JSON with padding(填充式 JSON 或参数式 JSON)的简写。
    JSONP实现跨域请求的原理简单的说,就是动态创建<script>标签,然后利用<script>的src 不受同源策略约束来跨域获取数据。
    JSONP 由两部分组成:回调函数和数据。回调函数是当响应到来时应该在页面中调用的函数。回调函数的名字一般是在请求中指定的。而数据就是传入回调函数中的 JSON 数据。
    动态创建<script>标签,设置其src,回调函数在src中设置:
    var script = document.createElement("script");
    document.body.insertBefore(script, document.body.firstChild);
    在页面中,返回的JSON作为参数传入回调函数中,我们通过回调函数来来操作数据。
    function handleResponse(response){
    // 对response数据进行操作代码
    }
    了解了JSONP的基本使用方法,我们在实现上面通过ajax调用豆瓣接口的需求,实现代码如下:
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>JSONP实现跨域2</title>
    </head>
    <body>
        <div id="mydiv">
            <button id="btn">点击</button>
        </div>
    </body>
    <script type="text/javascript">
        function handleResponse(response){
            console.log(response);
        }
    </script>
    <script type="text/javascript">
    window.onload = function() {
        var oBtn = document.getElementById('btn');
        oBtn.onclick = function() {
            var script = document.createElement("script");
            document.body.insertBefore(script, document.body.firstChild);
        };
    };
    </script>
    </html>
     
    • 方式2:服务端设置http header
    另外一个解决跨域的简单方法,需要服务器端来做,但是作为交互方,我们必须知道这个方法,是将来解决跨域问题的一个趋势
    //注意:不同后端语言的写法可能不一样
    //第二个参数填写允许跨域的域名称,不建议直接写"*"
    response.setHeader('Access-Control-Allow-Origin','http://a.com,http://b.com';);
    response.setHeader('Access-Control-Allow-Headers','X-Request-With');
    response.setHeader('Access-Control-Allow-Methods','PUT,POST,GET,DELETE,OPTIONS');
    //接收跨域的cookie
                        response.setHeader('Access-Control-Allow-Credentials','true');
    • 方式3:iframe  //自己添加的
    解题#####
    1.请描述一下cookie,sessionStorage,和localStorage的区别
    • 容量区别,cookie为4k,localStorage和sessionStorage为5M
    • cookie每次请求都会被携带在ajax中,localStorage和sessionStorage不会被携带只作为存储使用
    • API易用性   cookie自己封装一大段代码,后两个用两个API基本满足需求
    2.手动编写一个ajax,不依赖第三方库
    var xhr=new XMLHttpRequest()
    xhr.open('GET','/api',false)
    xhr.onreadystatechange=function(){
        //这里的函数异步执行
        if(xhr.readyState==4){
            if(xhr.status==200){
                alert(xhr.responseText)
            }
        }
    }
    xhr.send(null)   //get请求时为空或null,post请求时参数为要发送的数据。
    3. 跨域的几种实现方式
    • JSONP
    • 服务器端设置http header
     
     
    作者:Yangkeloff
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
     
    第九篇  开发环境
     
    关于开发环境:
        1)面试官想通过开发环境了解面试者的经验
        2)开发环境最能体现工作产出的效率
        3)会以聊天的形式为主,而不是具体的问题
    1. IDE(写代码的效率)
    2. git(代码版本管理,多人协作开发)
    3. JS模块化
    4. 打包工具
    5. 上线回滚的流程
     
     
    • IDE 
      • webstorm sublime vscode atom 插件
      • 不要说自己使用Dreamweaver、notepad
    • git
      • 正式项目都需要代码版本管理
      • 大型项目需要多人协作开发
      • Git和Linux是同一个作者
      • 网络Git服务器如coding.net、github.com
      • 一般公司代码非开源,都有自己的Git服务器
      • 搭建Git服务器无需了解太多
      • Git的基本操作必须很熟练
      • 常用Git命令
        • git add .    
        • git checkout xxx //切换到已有的分支   
        • git commit -m "xxx"
        • git push origin master    //提交到远程仓库
        • git pull origin master   //从仓库下载
        • git branch  //查看所有分支
        • git checkout -b xxx / git checkout xxx   //新建一个分支 /切换到已有的分支   
        • git merge xxx  // 把xxx分支合并到当前分支
    • 代码演示
            
     
     9-1 JS模块化
        模块化本身就是一个面试的问题
        知识点#####
    • 不使用模块化的情况
      函数
     
    调用
     
    1.js文件引入顺序必须遵循函数层级引用的顺序,最先引入util.js,然后a-util.js,以此类推
    2.这些代码中的函数必须是全局变量,才能暴露给使用方,会有全局变量污染的问题
    3.a.js知道要引用a-util.js,但是它并不知道还依赖于util.js,代码逻辑并不清晰,所以要使用模块化
     
     
    • 使用模块化
     
    1.直接使用<script type="text/javascript" src="a.js"></script>即可,其它会根据依赖关系自动引用
    2.在util.js和a-util.js中没有使用全局变量,不会带来污染和覆盖
    3.以上代码只是理想中的效果,用于描述模块化的思想,和实际语法相比略有出入
     
     
    • AMD
      • A:异步 M:模块 D:定义
      • require.js <a>requirejs.org</a>
      • 全局define函数
      • 全局require函数
      • 依赖JS会自动异步加载
      • 使用requirejs完成刚才的例子
     
    //util.js
    define(function(){
        var util={
            getFormatDate:function(date,type){
                if(type===1){
                    var month=date.getMonth()+1;
                    var day=date.getDate();
                    if(month<10){
                        month='0'+month;
                    }
                    if(day<10){
                        day='0'+day;
                    }
                    return date.getFullYear()+'-'+month+'-'+day;
                }
                if(type===2){
                    return date.getFullYear()+'年'+(date.getMonth()+1)+'月'+date.getDate()+'日';
                }
            }
        }
        return util;
    })
     
    //a-util.js
    define(['./util.js'],function(util){
        var aUtil={
            aGetFormatDate:function(date){
                return util.getFormatDate(date,2)
            }
        }
        return aUtil
    })
     
    //a.js
    define(['./a-util.js'],function(aUtil){
        var a={
            printDate:function(date){
                console.log(aUtil.aGetFormatDate(date));
            }
        }
        return a;
    })
     
    //main.js
    require(['./js/a.js'],function(a){
        var date=new Date()
        a.printDate(date)
    })
     
    //html
    <script data-main="./js/main.js" src="https://cdn.bootcss.com/require.js/2.3.3/require.min.js";></script>
    • CommonJS
      • CommonJS是Nodejs模块化规范,现在被大量用前端
      • 前端开发依赖的插件和库,都可以从npm获取
      • 构建工具高度自动化,使npm成本非常低
      • CommonJS本身不会异步加载JS,而是一次性同步加载出来
      • module.exports={aaa:...,bbb:...}输出模块,require(xxx.js)引用模块
      • 使用CommonJS

    // util.js
    module.exports={
        getFormatDate:function(date,type){
            if(type===1){
                var month=date.getMonth()+1
                var day=date.getDate()
                if(month<10){
                    month='0'+month;
                }
                if(day<10){
                    day='0'+day;
                }
                return date.getFullYear()+'-'+month+'-'+day
            }
            if(type===2){
                return date.getFullYear()+'年'+(date.getMonth()+1)+'月'+date.getDate()+'日'
            }
        }
    }
    //a-tuil.js
    var util=require('util.js')
    module.exports={
        aGetFormatDate:function(date){
            return util.getFormatDate(date,2)
        }
    }
     
    commonJS 暴露给外部的接口为module.exports 所指向的对象,而AMD 暴露给外部的接口为return 的对象
     
    • AMD和CommonJS的使用场景
      • 需要异步加载,使用AMD
      • 使用npm后建议使用CommonJS(需要异步加载,使用CommonJS)
     
     
      9-2 构建工具
     
     
    • webpack
               
              使用
               首先,启动一个服务器,接着初始化npm环境,然后安装webpack
    1)进入当前文件目录
    2)npm install http-server -g
    3)http-server -p 8881  //启动服务器  只能浏览静态网页 。http-server是常用的轻量级web服务器
    4)初始化npm环境  npm init  //生成package.json文件
    5)npm install webpack --save-dev   // 安装开发版本的webpack。生成了node-moudles文件夹
    --save   //保存在package.json中,不加--save表示只安装不保存在package.json
    -dev  //安装开发版本
    npm install moment --save//安装非开发版的方法
    npm unstall moment --save //卸载npm的方法  
    看下图注意开发版和非开发版的区别
            
     
    //新建文件 webpack.config.js
    var path=require('path'); 
    var webpack=require('webpack');
     
    module.exports={
        context:path.resolve(__dirname,'./src'), //找到src目录 ( 自己创建scr)
        entry:{   //入口,在src下  
            app:'./app.js'  //(自己创建app.js )
        },
        output:{
            path:path.resolve(__dirname,'./dist'), //输出至dist目录  (会自动生成)
            filename:'bundle.js' //输出文件名 (会自动生成)
        },
        plugins:[
            new webpack.optimize.UglifyJsPlugin() //代码压缩
        ]
    }
    //package.json
    {
      "name": "webpack-test",
      "version": "1.0.0",
      "description": "webpack test",
      "main": "index.js",
      "scripts": {
        "test": "echo "Error: no test specified" && exit 1",
        "start": "webpack"  //新添加,用于启动
      },
      "author": "liuxin",
      "license": "ISC",
      "devDependencies": {
        "webpack": "^3.10.0"
      },
      "dependencies": {
        "jquery": "^3.3.1"
      }
    }
    //app.js
    console.log(1)
     
    命令行执行: npm start   //在本地配置一个服务器环境,npm start首先会安装一系列的必要程序,这些程序依赖package.json中的内容。
    输出
         
        生成webpack.config.js中指定的文件夹和文件
        
     
     
    将bundle.js引入index.html中
    //index.html
    <body>
        <div id="root"></div>
        <script src="dist/bundle.js"></script>
    </body>
    命令行执行  http-server -p 8881 启动服务器
    控制台输出 1
     
    构建工具--使用jQuery
    //hello.js
    module.exports={
        print:function(){
            console.log('hello');
        }
    }
     
    //app.js
    var $=require('jquery');  //调用npm安装的jQuery
    var hello=require('./hello.js');
    var $root=$('#root');
    $root.html('<p>这是jquery插入的恩子</p>');
    hello.print();
     
    重新npm start,执行。运行结果:
     
     
    补充:http-server 超轻量级web服务器
    有的时候做前端,想要运行一些代码,但是又没有必要使用tomcat或者Apache http server,这个时候一个轻量级的简单的http server就可以搞定了。
    Http-server是基于nodejs的http服务器,它最大好处就是:
      可以使任意一个目录成为服务器的目录,完全抛开后台的沉重工程,直接运行想要的js代码。
     
     
    • 上线和回滚
            知识点
    • 上线和回滚的基本流程
    •  Linux基本命令
    上线和回滚流程:
    1)非常重要的开发环节
    2)各个公司的具体流程不同
    3)由专门的工具或者系统完成,我们无需关心细节
    4)如果你没有参与过,面试时也要说出要点
    5)只讲要点,具体实现无法讲解
     
    上线流程要点:
    1)将测试完成的代码提交到git版本库的master分支
    2)将当前服务器的代码全部打包并记录版本号,备份
    3)将master分支的代码提交覆盖到线上服务器,生成新版本号
     
    回滚流程要点:
    1)将当前服务器的代码打包并记录版本号,备份
    2)将备份的上一个版本号解压,覆盖到线上服务器,并生成新的版本号
     
    Linux基本命令---使用原因
    1)服务器使用Linux居多,server版,只有命令行
    2)测试环境要匹配线上环境因此也是Linux
    3)经常需要登录测试机来自己配置、获取数据 
     
    Linux基本命令
     
    mkdir a   //创建文件夹a
    ll    //查看当前文件
    cd a  //进入文件夹a
    pwd   // 查看当前目录/路径
    cd..    //返回上层目录
    rm -rf a  //删除文件夹a
    vi a.js   //或者vim。表示编辑。创建a.js文件并打开编辑器,按下I 表示输入模式,可以编辑代码。 退出按ESC,退出保存按ESC键+W键。:+w 保存。: + q 退出。  :+w+q 保存后退出
    cp a.js  a1.js //拷贝a.js到a1.js
    mkdir src  
    mv  a1.js  src/aj.js   //移动a1.js到src下
    cat a.js  //在命令行打印a.js内容
    head a.js  //在命令行打印a.js前一部分的内容
    tail a.js  //在命令行打印a.js后一部分的内容
    head -n 1 a.js  //在命令行打印a.js第一行
    tail -n 2 a.js  //在命令行打印a.js最后两行
    grep '2' a.js   //搜索第二行内容 打印
     
     
    第十篇  页面加载与性能优化
     
    1.从输入url到得到HTML的详细过程 (常考)
    2.window.onload和DOMContentLoaded的区别
    3.性能优化的几个示例
    知识点#####
    • 加载资源的形式
      • 输入url(或跳转页面)加载HTML http://xxxxx.com
      • 加载HTML中的静态资源 如js css 图片 视频 媒体资源等
    • 加载一个资源的过程
      • 浏览器根据DNS服务器(域名服务器)得到域名的IP地址 (得到baidu.com的IP地址)
      • 向这个IP的机器发送http请求
      • 服务器收到、处理并返回http请求(可能是js css HTML 图片等文件)
      • 浏览器得到返回内容
    • 浏览器渲染页面的过程
      • 根据HTML结构生成DOM Tree
      • 根据CSS生成CSSOM
      • 将DOM和CSSOM整合成RenderTree(渲染树:比dom tree多了样式)
      • 根据RenderTree渲染和展示
      • 遇到<script>时,会执行并阻塞渲染,所以<script>放在<body>即将结束的位置 因为js有权利改变dom结构,如果同时进行会发生冲突
                    思考:1.为何把css放在head中
                              2.为何把js放在body最下面。 1)不会阻塞页面的渲染,让页面更快出来 2)script能拿到所有标签,放在上面时拿不到
     
    • window.onlaod和DOMContentLoaded
    window.addEventListerer('load',function(){
        //页面的全部资源加载完才会执行,包括图片、视频等
    })
    window.addEventListerer('DOMContentLoaded',function(){
        //DOM渲染完即可执行,此时图片、视频等可能还没加载完
    })
    • 性能优化
      • 原则
        • 多使用内存、缓存或其他方法;
        • 减少CPU计算和网络请求
      • 从哪里入手
        • 加载页面和静态资源
        • 页面渲染
      • 优化方法
                    //加载资源优化  加载页面和静态资源
    • 静态资源的压缩合并(如webpack的plugins:[new webpack.optimize.UglifyJsPlugin()])
    • 静态资源缓存 (如浏览器第一次请求过后,第二次就不用再次请求了。这是浏览器的优化策略)
    • 使用CDN让资源加载更快 (大网站都有自己的cdn。比如加载jQuery,会从就近的机房加载,否则只能同较远的服务器请求)
    • 使用SSR(server side rendering)后端渲染(服务端),数据直接输出到HTML (比如最早时候用jsp、PHP、asp写页面时,本身就是后端渲染,数据直接输出到HTML,不是现在的先写HTML再用ajax请求把数据拿过来)
                    //渲染优化。 页面渲染
      • CSS放前面,JS放后面
      • 懒加载(图片懒加载、下拉加载更多)
      • 减少DOM查询,对DOM查询做缓存
      • 减少DOM操作,多个操作尽量合并在一起执行
      • 事件节流 (下面的实例)
      • 尽早执行操作(如DOMContentLoaded)
    • 安全性
    解题#####
    1.从输入url到得到HTML的详细过程
    • 浏览器根据DNS服务器得到域名的IP地址
    • 向这个IP的机器发送http请求
    • 服务器收到、处理并返回http请求
    • 浏览器得到返回内容并渲染页面
    2.window.onload和DOMContentLoaded的区别
    window.onload,页面的全部资源加载完成才会执行,包括图片视频等
    DOMContentLoaded,DOM渲染完即可执行,此时图片视频等可能还没加载完
    补充:$(function(){})在window.onload执行前执行的,$(function(){})类似于原生js中的DOMContentLoaded事件,在DOM加载完毕后,页面全部内容(如图片等)完全加载完毕前被执行。而window.onload会在页面资源全部加载完毕后才会执行。
     
    3.性能优化的几个示例
     //给src赋值一个很小的图片或者缓存的图片,但真正的图片是 abc.png,通过js来控制
    <img id="img1" src="prview.png" data-realsrc="abc.png"/> 
    <script type="text/javascript">
        var img1=document.getElementById('img1')
        img1.src=img1.setAttribute('data-realsrc')
    </script>
    • 缓存DOM查询
            var x=document.getElementBy...  //这样可以避免多次执行DOM查询
    • 合并DOM插入
    var listNode=document.getElementById('list')
    //插入10个li标签
    var frag=document.createDocumentFragment();
    var x,li
    for(x=0;x<10;x++){
        li=document.createElement('li')
        li.innerHTML='List item'+x
        frag.appendChild(li)
    }
    listNode.appendChild(frag)  //只进行了一次dom操作
    • 事件节流
      在快速操作时不执行事件,在停顿时执行,以减少计算次数
    var textarea=document.getElementById('text')
    var timeoutId
    textarea.addEventListener('keyup',function(){
        if(timeoutId){
            clearTimeout(timeoutId)
        }
        timeoutId=setTimeout(function () {
        //触发change事件
        }, 100);   //停顿100ms以上才触发changge事件
    })
    • 尽早操作
    window.addEventListener('load',function(){
        //页面的全部资源加载完成才会执行,包括图片视频等
    })
    document.addEventListener('DOMContentLoaded',function(){
        //DOM渲染完即可执行,此时图片视频等可能还没加载完
    })
    第十一篇  安全性
     
    知识点#####
    安全性在前端面试中的概率是比较低的。有专门的安全人员,一般后端来做。一下列出两种常见的前端攻击方式,主要还是靠后端来解决,前端做一些接口性的配合等。
    • XSS跨站请求攻击
      新浪博客写一篇文章,同时偷偷插入一段<script>
              攻击代码中,有获取cookie,发送到自己的服务器的代码,          
              发布文章被人查看,会把查看者的cookie发送到攻击者的服务器
              //cookie包含有账户等信息,可能有密码等机密信息
      • 解决
        • 前端替换关键字,如替换<为&lt,替换>为&gt。但前端效率低
        • 后端替换
    • XSRF跨站请求伪造
      已登录一个网站正在浏览商品,该网站付费接口是xxx.com/pay?id=100,但是没有任何验证,然后你收到了一封邮件,隐藏着![](xxx.com/pay?id=100),当查看邮件时就已完成付费了
      • 解决
        • 增加验证流程,如输入指纹,密码,短信验证码 //也是后端验证,前端配合
    第十二篇  面试技巧
    技术岗面试技巧不是很多,主要考核的是面试者的技术能力,如果过于注重技巧会有些喧宾夺主的感觉
    • 简历
      • 简洁明了,重点突出项目经历和解决方案
      • 把个人博客放在简历中,并且定期维护更新博客
      • 把个人的开源项目放在简历中,并维护开源项目
      • 简历千万不要造假,要保持能力和经历上的真实性
    • 面试过程中
      • 如何看待加班?加班就像借钱,救急不救穷
      • 千万不可挑战面试官,不要反考面试官
      • 学会给面试官惊喜,但不要太多
      • 遇到不会回答的问题,说出你知道的也可以
      • 谈谈你的缺点——说一下你最近正在学的东西就可以了 (正在学习react,但不是很熟练,大概再过多久就能熟练掌握)
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    练习_Python3 爬取笔趣阁最新小说章节
    Python3 map()函数
    Java图片验证码生成
    神经网络
    leetcode
    hive开发规范
    北明数科 bug
    JAVA集合~
    令人头痛的JVM
    重定向和管道符
  • 原文地址:https://www.cnblogs.com/morongwendao/p/9585062.html
Copyright © 2020-2023  润新知