7.26 前端语言串讲
一.前端语言的基本能力
1.1 前端三剑客
html用于构建前端的结构,控制内容的排版形式,为网页设计提供模板结构。它是所有网页的基石。
css用于设计网页的样式,为所有的页面元素赋予特殊的形式,同时也使用各种方法使得网页变得可交互。它是网页“长什么样”、“给人什么感觉”的构造者。
javascript用于提高网页的交互性,它可以为网页赋予复杂的功能与特征,以响应网页使用者的需求。它主要由具有较强功能的编程性语言组成。
如下图所示,这三者在进行前端设计时有着相辅相成的联系。html构建了人体的骨骼,css在骨架上形成了人体的皮囊,而javascript则组成了人的肌肉,使人得以进行多种精密的活动。
html的本质是由标签构成的文本文件,通过网站容器可以实现从文本到具体页面效果的转换。css的格式是selector后面跟随一个包含多个declaration的大括号,每个declaration是一个键值对,实现一种具体效果。为了实现css的效果,selector的选择十分重要,每种selector都对应一种特殊的选择方法。下图是css的一些语法组成。
javascript借鉴C语言的基本语法,java语言的数据类型和内存管理,借鉴scheme语言,将函数提升到一等公民的地位。通用作用包括校验数据输入、交互控制、平台无关性、处理数据和时间等等。现代的javascript新增了Let/Const、箭头函数、字符串模板、默认参数等等。javascript共有七种基本类型,基本语法如下:
function是一种特殊的字符,在段落中可以被整体地使用。使用function只需要两个部分:声明或定义一个function,然后去使用或运行它。定义方法如下:
1.2 浏览器中的作用方式
浏览器一般包含两种引擎:渲染引擎和javascript引擎。渲染引擎主要用于加载页面,读取html内容并构建DOM树,接着获取css资源并构建cssom树,再将两者的特性相结合,最终计算出网页的样式和排版并推断其中哪些可以视作一整个图层,将页面绘制出来。javascript需要使用解释器才能够运行,一个优秀的解释器除了需要能够解决复杂的语法,还要拥有高度优化的性能。以V8为例,其工作流程如下图:
二.前端语言的协作配合
2.1 css在HTML中的应用
inline css
<p style="color :blue;">This is a paragraph.</p>
internal css
<head>
<style type = text/css>
body {background-color: blue;}
p { color: yellow;}
</style>
</head>
external css
<head>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
2.2 javascript在HTML中的应用
<button onclick="showContent()">Show hidden content</button>
<template>
<h2>Flower</h2>
<img src="img_white_flower.jpg" width="214" height="204">
</template>
<script>
function showContent(){
var temp = document.getElementsByTagName("template")[0];
var clon = temp.content.cloneNode(true);
document.body.appendChild(clon)
}
</script>
<button onclick="getElementById('time').innerHTML= Date()">
Show Date
</button>
<p id="geeks" onclick="onclick_event()">
Click Here
</p>
DOM树是javascript中的一个重要部分。DOM的事件机制流程是一个双向过程,包括事件捕捉和事件冒泡。事件捕捉:点击按钮时,click时间从document一直定位到button;事件捕获:定位到button后,click事件会被激发,并层层向外传递。
javascript本身也包含一些事件机制。javascript是单线程的,有着exentloop的机制。javascript有一个微任务队列和一个宏任务队列,首先执行已在call stack中的宏任务,然后从微任务队列中取出微任务(如Promise)进行执行,全部完成后再从宏任务队列中取出宏任务(如script代码块)依次执行。
2.3 HTML在javascript中的应用
function renderHello(){
var template = document.getElementById('template').innerHTML;
var rendered = Mustache.render(template,{ name: 'Luke'});
document.getElementById('target').innerHTML = rendered;
}
<html>
<body onload="renderHello()">
<div id="target">Loading...</div>
<script id="template" type="x-tmpl-mustache">
Hello {{ name }}!
</script>
<script src="https://unpkg.com/mustache@latest"></script>
<script src="render.js"></script>
</body>
</html>
2.4 css在javascript中的应用
css可以通过DOMAPI在js里进行应用,也可以通过jsx或者jss。
div.style.width="100px";
dic.style.cssText="width;100px;height:100px;background: palevioletred;";
dic.setAttribute("class","div2")
link.setAttribute("href","css2.css")
cssmodule用于解决全局类名冲突的问题:
三.HTML介绍
HTML是前端开发中最基础的一门语言,它不是图灵完备的,它只是一门标记语言。其基本语法分为五个部分,最核心的是标签。
3.1 标签的分类
html的标签可以分为四种主要类型:文档型、闭合型、换行型、H5新元素。文档型是html必须具备的标签类型。闭合型则分为闭合标签,如
,和空标签,如
换行型则分为块级标签,如
,
等等和行内标签,如。H5新元素包括语义化标签、媒体标签、表单标签和功能标签。
3.2 HTML head
![image-20230726170658701转存失败,建议直接上传图片文件]()
3.3 HTML body
html body的标签十分繁多,可以依据不同功能分成不同的组别。
3.4 HTML ARIA
了解ARIA并非只是为了盲人阅读,它可以为我们设计UI系统提供指导意义。它可以使我们的代码更加容易被理解
<span role="checkbox" aria-checked="false" tabinbox="0" aria-labelledby="chk1-label"></span>
<label id="chk1-label">Remember my preferences</label>
3.5 HTML5
HTML5不再是单纯的纯文本标记语言,而是包括了Canvas、音视频、拖拽、Worker、svg、位置信息等多种功能的集成。
HTML5中有多种语义化标签可以使用,实现多种功能,便于开发者更好地维护网站结构。它也同时扩展了表单能力,可以实现多种形式的表单。HTML5中有三种存储方法:Cookies(4KB)、Local Storage(5-25MB)和Session Storage(50MB)。
IndexedDB适合用于更复杂的场景,对应特殊的存储需求。
PWA基于Service Worker,AMP便于搜索引擎爬取,两者均用于提高页面的访问效率。
Audio:
const audioCtx = new (window.AudioContext || window.webkitAudioContext);
const osci = audioCtx.createOscillator();
const gain = audioCtx.createGain();
osci.connect(gain)
gain.connect(audioCtx.destination);
osci.start();
Video:
const mediaSource = new MediaSource();
const video = document.createElement('video');
video.src = mediaSource;
mediaSource.addSourceBuffer(...);
video.play();
Audio和Video可以定制化Media能力。
HTML5可以使用Blob、ArrayBuffer等进行二进制支持。
Web Worker的工作流程为:1.在主线程中new一个Worker 2.在主线程中定义监听器 3.使用postMessage互传数据 4.使用terminate销毁线程
WebSocket是一种全双工通信方式,本质是TCP的连接请求:
const socket = new WebSocket('ws://localhost:8080');
socket.addEventListener('open',(event) => {
socket.send('Hello Server!');
});
socket.addEventListener('message', (event) => {
console.log('Message from server ', event.data);
});
Shadow DOM是一种特殊的节点类型。
<span role="checkbox" aria-checked="false" tabinbox="0" aria-labelledby="chk1-label"></span>
<label id="chk1-label">Remember my preferences</label>
const audioCtx = new (window.AudioContext || window.webkitAudioContext);
const osci = audioCtx.createOscillator();
const gain = audioCtx.createGain();
osci.connect(gain)
gain.connect(audioCtx.destination);
osci.start();
const mediaSource = new MediaSource();
const video = document.createElement('video');
video.src = mediaSource;
mediaSource.addSourceBuffer(...);
video.play();
const socket = new WebSocket('ws://localhost:8080');
socket.addEventListener('open',(event) => {
socket.send('Hello Server!');
});
socket.addEventListener('message', (event) => {
console.log('Message from server ', event.data);
});