learn.lianglianglee.com/专栏/左耳听风/087 程序员练级攻略(2018):前端基础和底层原理.md.html
2022-05-11 19:04:14 +08:00

1287 lines
54 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
<link rel="icon" href="/static/favicon.png">
<title>087 程序员练级攻略2018前端基础和底层原理.md.html</title>
<!-- Spectre.css framework -->
<link rel="stylesheet" href="/static/index.css">
<!-- theme css & js -->
<meta name="generator" content="Hexo 4.2.0">
</head>
<body>
<div class="book-container">
<div class="book-sidebar">
<div class="book-brand">
<a href="/">
<img src="/static/favicon.png">
<span>技术文章摘抄</span>
</a>
</div>
<div class="book-menu uncollapsible">
<ul class="uncollapsible">
<li><a href="/" class="current-tab">首页</a></li>
</ul>
<ul class="uncollapsible">
<li><a href="../">上一级</a></li>
</ul>
<ul class="uncollapsible">
<li>
<a href="/专栏/左耳听风/000 开篇词 洞悉技术的本质,享受科技的乐趣.md.html">000 开篇词 洞悉技术的本质,享受科技的乐趣.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/001 程序员如何用技术变现(上).md.html">001 程序员如何用技术变现(上).md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/002 程序员如何用技术变现(下).md.html">002 程序员如何用技术变现(下).md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/003 Equifax信息泄露始末.md.html">003 Equifax信息泄露始末.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/004 从Equifax信息泄露看数据安全.md.html">004 从Equifax信息泄露看数据安全.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/005 何为技术领导力.md.html">005 何为技术领导力.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/006 如何拥有技术领导力.md.html">006 如何拥有技术领导力.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/007 推荐阅读:每个程序员都该知道的事.md.html">007 推荐阅读:每个程序员都该知道的事.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/008 Go语言Docker和新技术.md.html">008 Go语言Docker和新技术.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/009 答疑解惑:渴望、热情和选择.md.html">009 答疑解惑:渴望、热情和选择.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/010 如何成为一个大家愿意追随的Leader.md.html">010 如何成为一个大家愿意追随的Leader.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/011 程序中的错误处理:错误返回码和异常捕捉.md.html">011 程序中的错误处理:错误返回码和异常捕捉.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/012 程序中的错误处理:异步编程和最佳实践.md.html">012 程序中的错误处理:异步编程和最佳实践.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/013 魔数 0x5f3759df.md.html">013 魔数 0x5f3759df.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/014 推荐阅读机器学习101.md.html">014 推荐阅读机器学习101.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/015 时间管理:同扭曲时间的事儿抗争.md.html">015 时间管理:同扭曲时间的事儿抗争.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/016 时间管理:投资赚取时间.md.html">016 时间管理:投资赚取时间.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/017 故障处理最佳实践:应对故障.md.html">017 故障处理最佳实践:应对故障.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/018 故障处理最佳实践:故障改进.md.html">018 故障处理最佳实践:故障改进.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/019 答疑解惑:我们应该能够识别的表象和本质.md.html">019 答疑解惑:我们应该能够识别的表象和本质.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/020 分布式系统架构的冰与火.md.html">020 分布式系统架构的冰与火.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/021 从亚马逊的实践,谈分布式系统的难点.md.html">021 从亚马逊的实践,谈分布式系统的难点.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/022 分布式系统的技术栈.md.html">022 分布式系统的技术栈.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/023 分布式系统关键技术:全栈监控.md.html">023 分布式系统关键技术:全栈监控.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/024 分布式系统关键技术:服务调度.md.html">024 分布式系统关键技术:服务调度.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/025 分布式系统关键技术:流量与数据调度.md.html">025 分布式系统关键技术:流量与数据调度.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/026 洞悉PaaS平台的本质.md.html">026 洞悉PaaS平台的本质.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/027 推荐阅读:分布式系统架构经典资料.md.html">027 推荐阅读:分布式系统架构经典资料.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/028 编程范式游记1- 起源.md.html">028 编程范式游记1- 起源.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/029 编程范式游记2- 泛型编程.md.html">029 编程范式游记2- 泛型编程.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/030 编程范式游记3 - 类型系统和泛型的本质.md.html">030 编程范式游记3 - 类型系统和泛型的本质.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/031 Git协同工作流你该怎样选.md.html">031 Git协同工作流你该怎样选.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/032 推荐阅读:分布式数据调度相关论文.md.html">032 推荐阅读:分布式数据调度相关论文.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/033 编程范式游记4- 函数式编程.md.html">033 编程范式游记4- 函数式编程.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/034 编程范式游记5- 修饰器模式.md.html">034 编程范式游记5- 修饰器模式.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/035 编程范式游记6- 面向对象编程.md.html">035 编程范式游记6- 面向对象编程.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/036 编程范式游记7- 基于原型的编程范式.md.html">036 编程范式游记7- 基于原型的编程范式.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/037 编程范式游记8- Go 语言的委托模式.md.html">037 编程范式游记8- Go 语言的委托模式.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/038 编程范式游记9- 编程的本质.md.html">038 编程范式游记9- 编程的本质.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/039 编程范式游记10- 逻辑编程范式.md.html">039 编程范式游记10- 逻辑编程范式.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/040 编程范式游记11- 程序世界里的编程范式.md.html">040 编程范式游记11- 程序世界里的编程范式.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/041 弹力设计篇之“认识故障和弹力设计”.md.html">041 弹力设计篇之“认识故障和弹力设计”.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/042 弹力设计篇之“隔离设计”.md.html">042 弹力设计篇之“隔离设计”.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/043 弹力设计篇之“异步通讯设计”.md.html">043 弹力设计篇之“异步通讯设计”.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/044 弹力设计篇之“幂等性设计”.md.html">044 弹力设计篇之“幂等性设计”.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/045 弹力设计篇之“服务的状态”.md.html">045 弹力设计篇之“服务的状态”.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/046 弹力设计篇之“补偿事务”.md.html">046 弹力设计篇之“补偿事务”.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/047 弹力设计篇之“重试设计”.md.html">047 弹力设计篇之“重试设计”.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/048 弹力设计篇之“熔断设计”.md.html">048 弹力设计篇之“熔断设计”.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/049 弹力设计篇之“限流设计”.md.html">049 弹力设计篇之“限流设计”.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/050 弹力设计篇之“降级设计”.md.html">050 弹力设计篇之“降级设计”.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/051 弹力设计篇之“弹力设计总结”.md.html">051 弹力设计篇之“弹力设计总结”.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/052 区块链技术 - 区块链的革命性及技术概要.md.html">052 区块链技术 - 区块链的革命性及技术概要.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/053 区块链技术 - 区块链技术细节 - 哈希算法.md.html">053 区块链技术 - 区块链技术细节 - 哈希算法.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/054 区块链技术 - 区块链技术细节 - 加密和挖矿.md.html">054 区块链技术 - 区块链技术细节 - 加密和挖矿.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/055 区块链技术 - 去中心化的共识机制.md.html">055 区块链技术 - 去中心化的共识机制.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/056 区块链技术 - 智能合约.md.html">056 区块链技术 - 智能合约.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/057 区块链技术 - 传统金融和虚拟货币.md.html">057 区块链技术 - 传统金融和虚拟货币.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/058 管理设计篇之分布式锁.md.html">058 管理设计篇之分布式锁.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/059 管理设计篇之配置中心.md.html">059 管理设计篇之配置中心.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/060 管理设计篇之边车模式.md.html">060 管理设计篇之边车模式.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/061 管理设计篇之服务网格.md.html">061 管理设计篇之服务网格.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/062 管理设计篇之网关模式.md.html">062 管理设计篇之网关模式.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/063 管理设计篇之部署升级策略.md.html">063 管理设计篇之部署升级策略.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/064 性能设计篇之缓存.md.html">064 性能设计篇之缓存.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/065 性能设计篇之异步处理.md.html">065 性能设计篇之异步处理.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/066 性能设计篇之数据库扩展.md.html">066 性能设计篇之数据库扩展.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/067 性能设计篇之秒杀.md.html">067 性能设计篇之秒杀.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/068 性能设计篇之边缘计算.md.html">068 性能设计篇之边缘计算.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/069 程序员练级攻略2018开篇词.md.html">069 程序员练级攻略2018开篇词.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/070 程序员练级攻略2018零基础启蒙.md.html">070 程序员练级攻略2018零基础启蒙.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/071 程序员练级攻略2018正式入门.md.html">071 程序员练级攻略2018正式入门.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/072 程序员练级攻略2018程序员修养.md.html">072 程序员练级攻略2018程序员修养.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/073 程序员练级攻略2018编程语言.md.html">073 程序员练级攻略2018编程语言.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/074 程序员练级攻略:理论学科.md.html">074 程序员练级攻略:理论学科.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/075 程序员练级攻略2018系统知识.md.html">075 程序员练级攻略2018系统知识.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/076 程序员练级攻略2018软件设计.md.html">076 程序员练级攻略2018软件设计.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/077 程序员练级攻略2018Linux系统、内存和网络.md.html">077 程序员练级攻略2018Linux系统、内存和网络.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/078 程序员练级攻略2018异步IO模型和Lock-Free编程.md.html">078 程序员练级攻略2018异步IO模型和Lock-Free编程.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/079 程序员练级攻略2018Java底层知识.md.html">079 程序员练级攻略2018Java底层知识.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/080 程序员练级攻略2018数据库.md.html">080 程序员练级攻略2018数据库.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/081 程序员练级攻略2018分布式架构入门.md.html">081 程序员练级攻略2018分布式架构入门.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/082 程序员练级攻略2018分布式架构经典图书和论文.md.html">082 程序员练级攻略2018分布式架构经典图书和论文.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/083 程序员练级攻略2018分布式架构工程设计.md.html">083 程序员练级攻略2018分布式架构工程设计.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/084 程序员练级攻略2018微服务.md.html">084 程序员练级攻略2018微服务.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/085 程序员练级攻略2018容器化和自动化运维.md.html">085 程序员练级攻略2018容器化和自动化运维.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/086 程序员练级攻略2018机器学习和人工智能.md.html">086 程序员练级攻略2018机器学习和人工智能.md.html</a>
</li>
<li>
<a class="current-tab" href="/专栏/左耳听风/087 程序员练级攻略2018前端基础和底层原理.md.html">087 程序员练级攻略2018前端基础和底层原理.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/088 程序员练级攻略2018前端性能优化和框架.md.html">088 程序员练级攻略2018前端性能优化和框架.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/089 程序员练级攻略2018UIUX设计.md.html">089 程序员练级攻略2018UIUX设计.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/090 程序员练级攻略2018技术资源集散地.md.html">090 程序员练级攻略2018技术资源集散地.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/091 程序员面试攻略:面试前的准备.md.html">091 程序员面试攻略:面试前的准备.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/092 程序员面试攻略:面试中的技巧.md.html">092 程序员面试攻略:面试中的技巧.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/093 程序员面试攻略:面试风格.md.html">093 程序员面试攻略:面试风格.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/094 程序员面试攻略:实力才是王中王.md.html">094 程序员面试攻略:实力才是王中王.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/095 高效学习:端正学习态度.md.html">095 高效学习:端正学习态度.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/096 高效学习:源头、原理和知识地图.md.html">096 高效学习:源头、原理和知识地图.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/097 高效学习:深度,归纳和坚持实践.md.html">097 高效学习:深度,归纳和坚持实践.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/098 高效学习:如何学习和阅读代码.md.html">098 高效学习:如何学习和阅读代码.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/099 高效学习:面对枯燥和量大的知识.md.html">099 高效学习:面对枯燥和量大的知识.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/100 高效沟通Talk和Code同等重要.md.html">100 高效沟通Talk和Code同等重要.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/101 高效沟通:沟通阻碍和应对方法.md.html">101 高效沟通:沟通阻碍和应对方法.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/102 高效沟通:沟通方式及技巧.md.html">102 高效沟通:沟通方式及技巧.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/103 高效沟通:沟通技术.md.html">103 高效沟通:沟通技术.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/104 高效沟通:好老板要善于提问.md.html">104 高效沟通:好老板要善于提问.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/105 高效沟通:好好说话的艺术.md.html">105 高效沟通:好好说话的艺术.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/106 加餐 谈谈我的“三观”.md.html">106 加餐 谈谈我的“三观”.md.html</a>
</li>
<li>
<a href="/专栏/左耳听风/107 结束语 业精于勤,行成于思.md.html">107 结束语 业精于勤,行成于思.md.html</a>
</li>
</ul>
</div>
</div>
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
<div class="sidebar-toggle-inner"></div>
</div>
<script>
function add_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.add('show')
}
function remove_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.remove('show')
}
function sidebar_toggle() {
let sidebar_toggle = document.querySelector('.sidebar-toggle')
let sidebar = document.querySelector('.book-sidebar')
let content = document.querySelector('.off-canvas-content')
if (sidebar_toggle.classList.contains('extend')) { // show
sidebar_toggle.classList.remove('extend')
sidebar.classList.remove('hide')
content.classList.remove('extend')
} else { // hide
sidebar_toggle.classList.add('extend')
sidebar.classList.add('hide')
content.classList.add('extend')
}
}
function open_sidebar() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.add('show')
overlay.classList.add('show')
}
function hide_canvas() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.remove('show')
overlay.classList.remove('show')
}
</script>
<div class="off-canvas-content">
<div class="columns">
<div class="column col-12 col-lg-12">
<div class="book-navbar">
<!-- For Responsive Layout -->
<header class="navbar">
<section class="navbar-section">
<a onclick="open_sidebar()">
<i class="icon icon-menu"></i>
</a>
</section>
</header>
</div>
<div class="book-content" style="max-width: 960px; margin: 0 auto;
overflow-x: auto;
overflow-y: hidden;">
<div class="book-post">
<p id="tip" align="center"></p>
<div><h1>087 程序员练级攻略2018前端基础和底层原理</h1>
<p>对于前端的学习和提高,我的基本思路是这样的。首先,前端的三个最基本的东西 HTML5、CSS3 和 JavaScriptES6是必需要学好的。这其中有很多很多的技术比如CSS3 引申出来的 Canvas位图、SVG矢量图 和 WebGL3D 图),以及 CSS 的各种图形变换可以让你做出非常丰富的渲染效果和动画效果。</p>
<p>ES6 简直就是把 JavaScript 带到了一个新的台阶JavaScript 语言的强大,大大释放了前端开发人员的生产力,让前端得以开发更为复杂的代码和程序,于是像 React 和 Vue 这样的框架开始成为前端编程的不二之选。</p>
<p>我一直认为学习任何知识都要从基础出发,所以我会有很大的篇幅在讲各种技术的基础知识和基本原理,尤其是如下的这些知识,都是前端程序员需要一块一块啃掉的硬骨头。</p>
<ul>
<li><strong>JavaScript 的核心原理</strong>。这里我会给出好些网上很不错的讲 JavaScript 的原理的文章或图书,你一定要学好语言的特性和其中的各种坑。</li>
<li><strong>浏览器的工作原理</strong>。这也是一块硬骨头,我觉得这是前端程序员需要了解和明白的东西,不然,你将无法深入下去。</li>
<li><strong>网络协议 HTTP</strong>。也是要着重了解的,尤其是 HTTP/2还有 HTTP 的几种请求方式短连接、长连接、Stream 连接、WebSocket 连接。</li>
<li><strong>前端性能调优</strong>。有了以上的这些基础后,你就可以进入前端性能调优的主题了,我相信你可以很容易上手各种性能调优技术的。</li>
<li><strong>框架学习</strong>。我只给了 React 和 Vue 两个框架。就这两个框架来说Virtual DOM 技术是其底层技术,组件化是其思想,管理组件的状态是其重点。而对于 React 来说,函数式编程又是其编程思想,所以,这些基础技术都是你需要好好研究和学习的。</li>
<li><strong>UI 设计</strong>。设计也是前端需要做的一个事,比如像 Google 的 Material UI或是比较流行的 Atomic Design 等应该是前端工程师需要学习的。</li>
</ul>
<p>而对于工具类的东西,这里我基本没怎么涉及,因为本文主要还是从原理和基础入手。那些工具我觉得都很简单,就像学习 Java 我没有让你去学习 Maven 一样,因为只要你去动手了,这种知识你自然就会获得,我们还是把精力重点放在更重要的地方。</p>
<p>下面我们从前端基础和底层原理开始讲起。先来讲讲 HTML5 相关的内容。</p>
<h1>HTML5</h1>
<p>HTML5 主要有以下几本书推荐。</p>
<ul>
<li><a href="https://book.douban.com/subject/25786074/">HTML5 权威指南</a> ,本书面向初学者和中等水平 Web 开发人员,是牢固掌握 HTML5、CSS3 和 JavaScript 的必读之作。书看起来比较厚,是因为里面的代码很多。</li>
<li><a href="https://book.douban.com/subject/24533314/">HTML5 Canvas 核心技术</a> ,如果你要做 HTML5 游戏的话,这本书必读。</li>
</ul>
<p>对于 SVG、Canvas 和 WebGL 这三个对应于矢量图、位图和 3D 图的渲染来说,给前端开发带来了重武器,很多 HTML5 小游戏也因此蓬勃发展。所以,你可以学习一下。</p>
<p>学习这三个技术,我个人觉得最好的地方是 MDN。</p>
<ul>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/SVG">SVG: Scalable Vector Graphics</a></li>
<li><a href="https://developer.mozilla.org/kab/docs/Web/API/Canvas_API">Canvas API</a></li>
<li><a href="https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API">The WebGL API: 2D and 3D graphics for the web</a></li>
</ul>
<p>最后是几个资源列表。</p>
<ul>
<li><a href="https://github.com/diegocard/awesome-html5">Awesome HTML5</a> 。GitHub 上的 Awesome HTML5其中有大量的资源和技术文章。</li>
<li><a href="https://github.com/willianjusten/awesome-svg">Awesome SVG</a></li>
<li><a href="https://github.com/raphamorim/awesome-canvas">Awesome Canvas</a></li>
<li><a href="https://github.com/sjfricke/awesome-webgl">Awesome WebGL</a></li>
</ul>
<h1>CSS</h1>
<p>在《程序员练级攻略2018》系列文章最开始我们就推荐过 CSS 的在线学习文档,这里再推荐一下 <a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS">MDN Web Doc - CSS</a> 。我个人觉得只要你仔细读一下文档CSS 并不难学。绝大多数觉得难的,一方面是文档没读透,另一方面是浏览支持的标准不一致。所以,学好 CSS 最关键的还是要仔细地读文档。</p>
<p>之后,在写 CSS 的时候,你会发现,你的 CSS 中有很多看起来相似的东西。你的 DRY - Dont Repeat Yourself 洁癖告诉你,这是不对的。所以,你需要学会使用 <a href="http://lesscss.org/">LESS</a><a href="http://sass-lang.com/">SaSS</a> 这两个 CSS 预处理工具,其可以帮你提高很多效率。</p>
<p>然后,你需要学习一下 CSS 的书写规范,前面的《程序员修养》一文中提到过一些,这里再补充几个。</p>
<ul>
<li><a href="https://github.com/necolas/idiomatic-css">Principles of writing consistent, idiomatic CSS</a></li>
<li><a href="https://github.com/grvcoelho/css-styleguide">Opinionated CSS styleguide for scalable applications</a></li>
<li><a href="https://google.github.io/styleguide/htmlcssguide.html">Google HTML/CSS Style Guide</a></li>
</ul>
<p>如果你需要更有效率,那么你还需要使用一些 CSS Framework其中最著名的就是 Twitter 公司的 <a href="https://getbootstrap.com/">Bootstrap</a>,其有很多不错的 UI 组件,页面布局方案,可以让你非常方便也非常快速地开发页面。除此之外,还有,主打清新 UI 的 <a href="https://semantic-ui.com/">Semantic UI</a> 、主要响应式界面的 <a href="http://foundation.zurb.com/">Foundation</a> 和基于 Flexbox 的 <a href="http://bulma.io/">Bulma</a></p>
<p>当然,在使用 CSS 之前,你需要把你浏览器中的一些 HTML 标签给标准化掉。所以,推荐几个 Reset 或标准化的 CSS 库:<a href="https://github.com/necolas/normalize.css">Normalize</a><a href="https://github.com/jgthms/minireset.css">MiniRest.css</a><a href="https://github.com/jonathantneal/sanitize.css/">sanitize.css</a><a href="https://github.com/Martin-Pitt/css-unstyle">unstyle.css</a></p>
<p>关于更多的 CSS 框架,你可以参看<a href="https://github.com/troxler/awesome-css-frameworks">Awesome CSS Frameworks</a> 上的列表。</p>
<p>接下来,是几个公司的 CSS 相关实践,供你参考。</p>
<ul>
<li><a href="https://codepen.io/chriscoyier/post/codepens-css">CodePens CSS</a></li>
<li><a href="http://markdotto.com/2014/07/23/githubs-css/">Github 的 CSS</a></li>
<li><a href="https://medium.com/@fat/mediums-css-is-actually-pretty-fucking-good-b8e2a6c78b06">Mediums CSS is actually pretty f***ing good</a></li>
<li><a href="https://medium.com/bbc-design-engineering/css-at-bbc-sport-part-1-bab546184e66">CSS at BBC Sport</a></li>
<li><a href="https://blog.trello.com/refining-the-way-we-structure-our-css-at-trello">Refining The Way We Structure Our CSS At Trello</a></li>
</ul>
<p>最后是一个可以写出可扩展的 CSS 的阅读列表 <a href="https://github.com/davidtheclark/scalable-css-reading-list">A Scalable CSS Reading List</a></p>
<h1>JavaScript</h1>
<p>下面是学习 JavaScript 的一些图书和文章。</p>
<ul>
<li><a href="https://book.douban.com/subject/11874748/">JavaScript: The Good Parts</a> 中文翻译版为《JavaScript 语言精粹》。这是一本介绍 JavaScript 语言本质的权威图书,值得任何正在或准备从事 JavaScript 开发的人阅读,并且需要反复阅读。学习、理解、实践大师的思想,我们才可能站在巨人的肩上,才有机会超越大师,这本书就是开始。</li>
<li><a href="https://book.douban.com/subject/26638316/">Secrets of the JavaScript Ninja</a> 中文翻译版为《JavaScript 忍者秘籍》,本书是 jQuery 库创始人编写的一本深入剖析 JavaScript 语言的书。适合具备一定 JavaScript 基础知识的读者阅读,也适合从事程序设计工作并想要深入探索 JavaScript 语言的读者阅读。这本书有很多晦涩难懂的地方,需要仔细阅读,反复琢磨。</li>
<li><a href="https://book.douban.com/subject/25786138/">Effective JavaScript</a> Ecma 的 JavaScript 标准化委员会著名专家撰写,作者凭借多年标准化委员会工作和实践经验,深刻辨析 JavaScript 的内部运作机制、特性、陷阱和编程最佳实践,将它们高度浓缩为极具实践指导意义的 68 条精华建议。</li>
<li>接下来是 ES6 的学习,这里给三个学习手册源。
<ul>
<li><a href="https://hacks.mozilla.org/category/es6-in-depth/">ES6 in Depth</a>InfoQ 上有相关的中文版 - <a href="http://www.infoq.com/cn/es6-in-depth/">ES6 深入浅出</a>。还可以看看 <a href="https://codetower.github.io/es6-features?utm_source=mybridge&amp;utm_medium=email&amp;utm_campaign=read_more">A simple interactive ES6 Feature list</a> ,或是看一下 <a href="https://es6.ruanyifeng.com/">阮一峰翻译的 ES6 的教程</a></li>
<li><a href="https://github.com/addyosmani/es6-tools">ECMAScript 6 Tools</a> ,这是一堆 ES6 工具的列表,可以帮助你提高开发效率。</li>
<li><a href="https://mbeaudru.github.io/modern-js-cheatsheet/">Modern JS Cheatsheet</a> ,这个 Cheatsheet 在 GitHub 上有 1 万 6 千颗星,你就可见其影响力了。</li>
</ul>
</li>
<li>然后,还有一组很不错的《<a href="https://github.com/getify/You-Dont-Know-JS">You Dont Know JS 系列</a>》 的书。
<ul>
<li>[You Dont Know JS: “Up &amp; Going”](https://github.com/getify/You-Dont-Know-JS/blob/master/up &amp; going/README.md#you-dont-know-js-up--going)</li>
<li>[You Dont Know JS: “Scope &amp; Closures”](https://github.com/getify/You-Dont-Know-JS/blob/master/scope &amp; closures/README.md#you-dont-know-js-scope--closures)</li>
<li>[You Dont Know JS: “this &amp; Object Prototypes”](https://github.com/getify/You-Dont-Know-JS/blob/master/this &amp; object prototypes/README.md#you-dont-know-js-this--object-prototypes)</li>
<li>[You Dont Know JS: “Types &amp; Grammar”](https://github.com/getify/You-Dont-Know-JS/blob/master/types &amp; grammar/README.md#you-dont-know-js-types--grammar)</li>
<li>[You Dont Know JS: “Async &amp; Performance”](https://github.com/getify/You-Dont-Know-JS/blob/master/async &amp; performance/README.md#you-dont-know-js-async--performance)</li>
<li>[You Dont Know JS: “ES6 &amp; Beyond”](https://github.com/getify/You-Dont-Know-JS/blob/master/es6 &amp; beyond/README.md#you-dont-know-js-es6--beyond)</li>
</ul>
</li>
<li>接下来是一些和编程范式相关的文章。
<ul>
<li><a href="https://auth0.com/blog/glossary-of-modern-javascript-concepts/">Glossary of Modern JavaScript Concepts: Part 1</a> ,首先推荐这篇文章,其中收集了一些编程范式方面的内容,比如纯函数、状态、可变性和不可变性、指令型语言和声明式语言、函数式编程、响应式编程、函数式响应编程。</li>
<li><a href="https://auth0.com/blog/glossary-of-modern-javascript-concepts-part-2/">Glossary of Modern JavaScript Concepts: Part 2</a> ,在第二部分中主要讨论了作用域和闭包,数据流,变更检测,组件化……</li>
</ul>
</li>
<li>下面三篇文章是德米特里·索什尼科夫Dmitry Soshnikov个人网站上三篇讲 JavaScript 内在的文章。
<ul>
<li><a href="http://dmitrysoshnikov.com/ecmascript/javascript-the-core-2nd-edition/">JavaScript. The Core: 2nd Edition</a></li>
<li><a href="http://dmitrysoshnikov.com/ecmascript/javascript-the-core/">JavaScript. The Core (older ES3 version)</a></li>
<li><a href="https://medium.com/@DmitrySoshnikov/js-scope-static-dynamic-and-runtime-augmented-5abfee6223fe">JS scope: static, dynamic, and runtime-augmented</a></li>
</ul>
</li>
<li><strong>How JavaScript Works</strong>” 是一组非常不错的文章(可能还没有写完),强烈推荐。这一系列的文章是 SessionStake 的 CEO 写的,现在有 13 篇,我感觉可能还没有写完。这个叫 <a href="https://blog.sessionstack.com/@zlatkov">亚历山大·兹拉特科夫Alexander Zlatkov</a> 的 CEO 太猛了。
<ul>
<li><a href="https://blog.sessionstack.com/how-does-javascript-actually-work-part-1-b0bacc073cf">An overview of the engine, the runtime, and the call stack</a></li>
<li><a href="https://blog.sessionstack.com/how-javascript-works-inside-the-v8-engine-5-tips-on-how-to-write-optimized-code-ac089e62b12e">Inside the V8 engine + 5 tips on how to write optimized code</a> ,了解 V8 引擎。这里,也推荐 <a href="https://medium.com/dailyjs/understanding-v8s-bytecode-317d46c94775">Understanding V8s Bytecode</a> 这篇文章可以让你了解 V8 引擎的底层字节码。</li>
<li><a href="https://blog.sessionstack.com/how-javascript-works-memory-management-how-to-handle-4-common-memory-leaks-3f28b94cfbec">Memory management + how to handle 4 common memory leaks</a> ,内存管理和 4 种常见的内存泄露问题。</li>
<li><a href="https://blog.sessionstack.com/how-javascript-works-event-loop-and-the-rise-of-async-programming-5-ways-to-better-coding-with-2f077c4438b5">Event loop and the rise of Async programming + 5 ways to better coding with async/await</a> Event Loop 和异步编程。</li>
<li><a href="https://blog.sessionstack.com/how-javascript-works-deep-dive-into-websockets-and-http-2-with-sse-how-to-pick-the-right-path-584e6b8e3bf7">Deep dive into WebSockets and HTTP/2 with SSE + how to pick the right path</a> WebSocket 和 HTTP/2。</li>
<li><a href="https://blog.sessionstack.com/how-javascript-works-a-comparison-with-webassembly-why-in-certain-cases-its-better-to-use-it-d80945172d79">A comparison with WebAssembly + why in certain cases its better to use it over JavaScript</a> JavaScript 内在原理。</li>
<li><a href="https://blog.sessionstack.com/how-javascript-works-the-building-blocks-of-web-workers-5-cases-when-you-should-use-them-a547c0757f6a">The building blocks of Web Workers + 5 cases when you should use them</a> Web Workers 技术。</li>
<li><a href="https://blog.sessionstack.com/how-javascript-works-service-workers-their-life-cycle-and-use-cases-52b19ad98b58">Service Workers, their lifecycle and use cases</a> Service Worker 技术。</li>
<li><a href="https://blog.sessionstack.com/how-javascript-works-the-mechanics-of-web-push-notifications-290176c5c55d">The mechanics of Web Push Notifications</a> Web 端 Push 通知技术。</li>
<li><a href="https://blog.sessionstack.com/how-javascript-works-tracking-changes-in-the-dom-using-mutationobserver-86adc7446401">Tracking changes in the DOM using MutationObserver</a> Mutation Observer 技术。</li>
<li><a href="https://blog.sessionstack.com/how-javascript-works-the-rendering-engine-and-tips-to-optimize-its-performance-7b95553baeda">The rendering engine and tips to optimize its performance</a> ,渲染引擎和性能优化。</li>
<li><a href="https://blog.sessionstack.com/how-javascript-works-inside-the-networking-layer-how-to-optimize-its-performance-and-security-f71b7414d34c">Inside the Networking Layer + How to Optimize Its Performance and Security</a> ,网络性能和安全相关。</li>
<li><a href="https://blog.sessionstack.com/how-javascript-works-under-the-hood-of-css-and-js-animations-how-to-optimize-their-performance-db0e79586216">Under the hood of CSS and JS animations + how to optimize their performance</a> CSS 和 JavaScript 动画性能优化。</li>
</ul>
</li>
<li>接下来是 Google Chrome 工程经理 <a href="https://medium.com/@addyosmani">阿迪·奥斯马尼Addy Osmani</a> 的几篇 JavaScript 性能相关的文章,也是非常好的。
<ul>
<li><a href="https://medium.com/dev-channel/the-cost-of-javascript-84009f51e99e">The Cost Of JavaScript</a></li>
<li><a href="https://medium.com/reloading/javascript-start-up-performance-69200f43b201">JavaScript Start-up Performance</a></li>
</ul>
</li>
<li>其它与 JavaScript 相关的资源。
<ul>
<li><a href="https://mathiasbynens.be/notes/javascript-unicode">JavScript has Unicode Problem</a> ,这是一篇很有价值的 JavaScript 处理 Unicode 的文章。</li>
<li><a href="https://mgechev.github.io/javascript-algorithms/index.html">JavaScript Algorithms</a> ,用 JavaScript 实现的各种基础算法库。</li>
<li><a href="https://github.com/Chalarangelo/30-seconds-of-code">JavaScript 30 秒代码</a> ,一堆你可以在 30 秒内看懂各种有用的 JavaScript 的代码,在 GitHub 上有 2 万颗星了。</li>
<li><a href="https://github.com/denysdovhan/wtfjs">What the f*ck JavaScript</a> ,一堆 JavaScript 搞笑和比较 tricky 的样例。</li>
<li><a href="https://github.com/airbnb/javascript">Airbnb JavaScript Style Guide</a> Airbnb 的 JavaScript 的代码规范GitHub 上有 7 万多颗星。</li>
<li><a href="https://www.youtube.com/watch?v=hO7mzO83N1Q">JavaScript Patterns for 2017</a> YouTube 上的一个 JavaScript 模式分享,值得一看。</li>
</ul>
</li>
</ul>
<h1>浏览器原理</h1>
<p>你需要了解一下浏览器是怎么工作的,所以,你必需要看《<a href="http://taligarsiel.com/Projects/howbrowserswork1.htm">How browsers work</a>》。这篇文章受众之大,后来被人重新整理并发布为《<a href="https://www.html5rocks.com/en/tutorials/internals/howbrowserswork/">How Browsers Work: Behind the scenes of modern web browsers</a>》,其中还包括中文版。这篇文章非常非常长,所以,你要有耐心看完。如果你想看个精简版的,可以看我在 Coolshell 上发的《<a href="https://coolshell.cn/articles/9666.html">浏览器的渲染原理简介</a>》或是看一下<a href="https://arvindr21.github.io/howBrowserWorks">这个幻灯片</a></p>
<p>然后,是对 Virtual DOM 的学习。Virtual DOM 是 React 的一个非常核心的技术细节,它也是前端渲染和性能的关键技术。所以,你有必要要好好学习一下这个技术的实现原理和算法。当然,前提条件是你需要学习过前面我所推荐过的浏览器的工作原理。下面是一些不错的文章可以帮你学习这一技术。</p>
<ul>
<li><a href="https://medium.com/@deathmood/how-to-write-your-own-virtual-dom-ee74acc13060">How to write your own Virtual DOM</a></li>
<li><a href="https://medium.com/@deathmood/write-your-virtual-dom-2-props-events-a957608f5c76">Write your Virtual DOM 2: Props &amp; Events</a></li>
<li><a href="https://medium.com/@gethylgeorge/how-virtual-dom-and-diffing-works-in-react-6fc805f9f84e">How Virtual-DOM and diffing works in React</a></li>
<li><a href="https://medium.com/@rajaraodv/the-inner-workings-of-virtual-dom-666ee7ad47cf">The Inner Workings Of Virtual DOM</a></li>
<li><a href="https://github.com/livoras/blog/issues/13">深度剖析:如何实现一个 Virtual DOM 算法</a></li>
<li>以及两个 Vitual-DOM 实现供你参考:
<ul>
<li><a href="https://github.com/Matt-Esch/virtual-dom">Matt-Esch/Virtual-DOM</a></li>
<li><a href="https://maquettejs.org/">Maquette</a></li>
</ul>
</li>
</ul>
<h1>网络协议</h1>
<ul>
<li>
<p><a href="https://book.douban.com/subject/25856314/">High Performance Browser Networking</a> ,本书是谷歌公司高性能团队核心成员的权威之作,堪称实战经验与规范解读完美结合的产物。本书目标是涵盖 Web 开发者技术体系中应该掌握的所有网络及性能优化知识。</p>
<p>全书以性能优化为主线,从 TCP、UDP 和 TLS 协议讲起,解释了如何针对这几种协议和基础设施来优化应用。然后深入探讨了无线和移动网络的工作机制。最后,揭示了 HTTP 协议的底层细节,同时详细介绍了 HTTP 2.0、 XHR、SSE、WebSocket、WebRTC 和 DataChannel 等现代浏览器新增的能力。</p>
</li>
<li>
<p>另外,<a href="https://en.wikipedia.org/wiki/HTTP/2">HTTP/2</a>也是 HTTP 的一个新的协议,于 2015 年被批准通过,现在基本上所有的主流浏览器都默认启用这个协议。所以,你有必要学习一下这个协议。下面相关的学习资源。</p>
<ul>
<li><a href="https://legacy.gitbook.com/book/ye11ow/http2-explained/details">Gitbook - HTTP/2 详解</a></li>
<li><a href="https://daniel.haxx.se/http2/">http2 explained</a><a href="https://www.gitbook.com/book/ye11ow/http2-explained/details">中译版</a></li>
<li><a href="https://cascadingmedia.com/insites/2015/03/http-2.html">HTTP/2 for a Faster Web</a></li>
<li><a href="https://www.nginx.com/wp-content/uploads/2015/09/NGINX_HTTP2_White_Paper_v4.pdf">Nginx HTTP/2 白皮书</a></li>
<li>HTTP/2 的两个 RFC
<ul>
<li><a href="https://httpwg.org/specs/rfc7540.html">RFC 7540 - Hypertext Transfer Protocol Version 2 (HTTP/2)</a> HTTP/2 的协议本身。</li>
<li><a href="https://httpwg.org/specs/rfc7541.html">RFC 7541 - HPACK: Header Compression for HTTP/2</a> HTTP/2 的压缩算法。</li>
</ul>
</li>
</ul>
</li>
<li>
<p>新的 HTML5 支持 <a href="https://en.wikipedia.org/wiki/WebSocket">WebSocket</a>,所以,这也是你要学的一个重要协议。</p>
<ul>
<li><a href="https://www.websocket.org/quantum.html">HTML5 WebSocket: A Quantum Leap in Scalability for the Web</a> ,这篇文章比较了 HTTP 的几种链接方式Polling、Long Polling 和 Streaming并引入了终级解决方案 WebSocket。你知道的了解一个技术的缘由是非常重要的。</li>
<li><a href="https://stackoverflow.com/questions/12555043/my-understanding-of-http-polling-long-polling-http-streaming-and-websockets">StackOverflow: My Understanding of HTTP Polling, Long Polling, HTTP Streaming and WebSockets</a> ,这是 StackOverflow 上的一个 HTTP 各种链接方式的比较,也可以让你有所认识。</li>
<li><a href="http://blog.teamtreehouse.com/an-introduction-to-websockets">An introduction to Websockets</a> ,一个 WebSocket 的简单教程。</li>
<li><a href="https://github.com/facundofarias/awesome-websockets">Awesome Websockets</a> GitHub 的 Awesome 资源列表。</li>
<li>一些和 WebSocket 相关的想法,可以开阔你的思路:
<ul>
<li><a href="https://www.html5rocks.com/en/tutorials/websockets/basics/">Introducing WebSockets: Bringing Sockets to the Web</a></li>
<li><a href="http://lucumr.pocoo.org/2012/9/24/websockets-101/">Websockets 101</a></li>
<li><a href="https://banksco.de/p/state-of-realtime-web-2016.html">Real-Time Web by Paul Banks</a></li>
<li><a href="https://samsaffron.com/archive/2015/12/29/websockets-caution-required">Are WebSockets the future?</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h1>小结</h1>
<p>总结一下今天的内容。我一直认为学习任何知识都要从基础出发,所以今天我主要讲述了 HTML5、CSS3 和 JavaScriptES6这三大基础核心给出了大量的图书、文章以及其他一些相关的学习资源。之后我建议你学习浏览器的工作原理和网络协议相关的内容。我认为掌握这些原理也是学好前端知识的前提和基础。值得花时间好好学习消化。</p>
</div>
</div>
<div>
<div style="float: left">
<a href="/专栏/左耳听风/086 程序员练级攻略2018机器学习和人工智能.md.html">上一页</a>
</div>
<div style="float: right">
<a href="/专栏/左耳听风/088 程序员练级攻略2018前端性能优化和框架.md.html">下一页</a>
</div>
</div>
</div>
</div>
</div>
</div>
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
</div>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194" integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw==" data-cf-beacon='{"rayId":"7099789d6df73cfa","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}' crossorigin="anonymous"></script>
</body>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-NPSEEVD756');
var path = window.location.pathname
var cookie = getCookie("lastPath");
console.log(path)
if (path.replace("/", "") === "") {
if (cookie.replace("/", "") !== "") {
console.log(cookie)
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
}
} else {
setCookie("lastPath", path)
}
function setCookie(cname, cvalue) {
var d = new Date();
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
}
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i].trim();
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
}
return "";
}
</script>
</html>