一、前端开发
前端工程师“Front-End-Developer”源自于美国。大约从2005年开始正式的前端工程师角色被行业所认可,到了2010年,互联网开始全面进入移动时代,前端开发的工作越来越重要。
最初所有的开发工作都是由后端工程师完成的,随着业务越来越繁杂,工作量变大,于是我们将项目中的可视化部分和一部分交互功能的开发工作剥离出来,形成了前端开发。
由于互联网行业的急速发展,导致了在不同的国家,有着截然不同的分工体制。
在日本和一些人口比较稀疏的国家,例如加拿大、澳洲等,流行“Full-Stack Engineer”,也就是我们通常所说的全栈工程师。通俗点说就是一个人除了完成前端开发和后端开发工作以外,有的公司从产品设计到项目开发再到后期运维可能都是同一个人,甚至可能还要负责UI、配动画,也可以是扫地、擦窗、写文档、维修桌椅等等。
而在美国等互联网环境比较发达的国家项目开发的分工协作更为明确,整个项目开发分为前端、中间层和后端三个开发阶段,这三个阶段分别由三个或者更多的人来协同完成。
国内的大部分互联网公司只有前端工程师和后端工程师,中间层的工作有的由前端来完成,有的由后端来完成。
PRD(产品原型-产品经理) - PSD(视觉设计-UI工程师) - HTML/CSS/JavaScript(PC/移动端网页,实现网页端的视觉展示和交互-前端工程师)
二、下载和安装VS Code
下载地址
https://code.visualstudio.com/
三、初始设置
1、中文界面配置
- 首先安装中文插件:Chinese (Simplified) Language Pack for Visual Studio Code
- 右下角弹出是否重启vs,点击“yes”
- 重启后如果界面没有变化,则 点击 左边栏Manage -> Command Paletet...【Ctrl+Shift+p】
- 在搜索框中输入“configure display language”,回车
- 打开locale.json文件,修改文件下的属性 "locale":"zh-cn"
- 重启vs
2、插件安装
为方便后续开发,建议安装如下插件
3、创建项目
vscode本身没有新建项目的选项,所以要先创建一个空的文件夹,如project_xxxx。
然后打开vscode,再在vscode里面选择 File -> Open Folder 打开文件夹,这样才可以创建项目。
4、保存工作区
打开文件夹后,选择“文件 -> 将工作区另存为...”,为工作区文件起一个名字,存储在刚才的文件夹下即可
5、新建文件夹和网页
6、预览网页
以文件路径方式打开网页预览
需要安装“open in browser”插件:
文件右键 -> Open In Default Browser
以服务器方式打开网页预览
需要安装“Live Server”插件:
文件右键 -> Open with Live Server
7、设置字体大小
左边栏Manage -> settings -> 搜索 “font” -> Font size
8、开启完整的Emmet语法支持
设置中搜索 Emmet:启用如下选项,必要时重启vs
自学参考:http://es6.ruanyifeng.com/
一、ECMAScript 6 简介
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。
1、ECMAScript 和 JavaScript 的关系
一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系?
要讲清楚这个问题,需要回顾历史。1996 年 11 月,JavaScript 的创造者 Netscape 公司,决定将 JavaScript 提交给标准化组织 ECMA,希望这种语言能够成为国际标准。次年,ECMA 发布 262 号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript,这个版本就是 1.0 版。
因此,ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现(另外的 ECMAScript 方言还有 Jscript 和 ActionScript)
2、ES6 与 ECMAScript 2015 的关系
ECMAScript 2015(简称 ES2015)这个词,也是经常可以看到的。它与 ES6 是什么关系呢?
2011 年,ECMAScript 5.1 版发布后,就开始制定 6.0 版了。因此,ES6 这个词的原意,就是指 JavaScript 语言的下一个版本。
ES6 的第一个版本,在 2015 年 6 月发布,正式名称是《ECMAScript 2015 标准》(简称 ES2015)。
2016 年 6 月,小幅修订的《ECMAScript 2016 标准》(简称 ES2016)如期发布,这个版本可以看作是 ES6.1 版,因为两者的差异非常小,基本上是同一个标准。根据计划,2017 年 6 月发布 ES2017 标准。
因此,ES6 既是一个历史名词,也是一个泛指,含义是 5.1 版以后的 JavaScript 的下一代标准,涵盖了 ES2015、ES2016、ES2017 等等,而 ES2015 则是正式名称,特指该年发布的正式版本的语言标准。本书中提到 ES6 的地方,一般是指 ES2015 标准,但有时也是泛指“下一代 JavaScript 语言”。
二、基本语法
ES标准中不包含 DOM 和 BOM的定义,只涵盖基本数据类型、关键字、语句、运算符、内建对象、内建函数等通用语法。
本部分只学习前端开发中ES6的最少必要知识,方便后面项目开发中对代码的理解。
1、let声明变量
1// var 声明的变量没有局部作用域2// let 声明的变量 有局部作用域3{4var a = 05let b = 16}7console.log(a) // 08console.log(b) // ReferenceError: b is not defined
1// var 可以声明多次2// let 只能声明一次3var m = 14var m = 25let n = 36let n = 47console.log(m) // 28console.log(n) // Identifier 'n' has already been declared
1// var 会变量提升2// let 不存在变量提升3console.log(x) //undefined4var x = "apple"56console.log(y) //ReferenceError: y is not defined7let y = "banana"
2、const声明常量(只读变量)
1// 1、声明之后不允许改变 2const PI = "3.1415926"3PI = 3 // TypeError: Assignment to constant variable.
1// 2、一但声明必须初始化,否则会报错2const MY_AGE // SyntaxError: Missing initializer in const declaration
3、解构赋值
解构赋值是对赋值运算符的扩展。
他是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。
在代码书写上简洁且易读,语义更加清晰明了;也方便了复杂对象中数据字段获取。
1//1、数组解构2// 传统3let a = 1, b = 2, c = 34console.log(a, b, c)5// ES66let [x, y, z] = [1, 2, 3]7console.log(x, y, z)
1//2、对象解构2let user = {name: 'Helen', age: 18}3// 传统4let name1 = user.name5let age1 = user.age6console.log(name1, age1)7// ES68let { name, age } = user//注意:结构的变量必须是user中的属性9console.log(name, age)
4、模板字符串
模板字符串相当于加强版的字符串,用反引号 `,除了作为普通字符串,还可以用来定义多行字符串,还可以在字符串中加入变量和表达式。
1// 1、多行字符串2let string1 = `Hey,3can you stop angry now?`4console.log(string1)5// Hey,6// can you stop angry now?
1// 2、字符串插入变量和表达式。变量名写在 ${} 中,${} 中可以放入 JavaScript 表达式。2let name = "Mike"3let age = 274let info = `My Name is ${name},I am ${age+1} years old next year.`5console.log(info)6// My Name is Mike,I am 28 years old next year.
1// 3、字符串中调用函数2function f(){3 return "have fun!"4}5let string2 = `Game start,${f()}`6console.log(string2); // Game start,have fun!
5、声明对象简写
1const age = 122const name = "Amy"34// 传统5const person1 = {age: age, name: name}6console.log(person1)78// ES69const person2 = {age, name}10console.log(person2) //{age: 12, name: "Amy"}
6、定义方法简写
1// 传统2const person1 = {3 sayHi:function(){4 console.log("Hi")5 }6}7person1.sayHi();//"Hi"8910// ES611const person2 = {12 sayHi(){13 console.log("Hi")14 }15}16person2.sayHi() //"Hi"
7、对象拓展运算符
拓展运算符(...)用于取出参数对象所有可遍历属性然后拷贝到当前对象。
1// 1、拷贝对象2let person1 = {name: "Amy", age: 15}3let someone = { ...person1 }4console.log(someone) //{name: "Amy", age: 15}
1// 2、合并对象2let age = {age: 15}3let name = {name: "Amy"}4let person2 = {...age, ...name}5console.log(person2) //{age: 15, name: "Amy"}
8、函数的默认参数
1function showInfo(name, age = 17) {2 console.log(name + "," + age)3}45// 只有在未传递参数,或者参数为 undefined 时,才会使用默认参数6// null 值被认为是有效的值传递。7showInfo("Amy", 18) // Amy,188showInfo("Amy", "") // Amy,9showInfo("Amy", null) // Amy, null10showInfo("Amy") // Amy,1711showInfo("Amy", undefined) // Amy,17
9、不定参数
不定参数用来表示不确定参数个数,形如,...变量名,由...加上一个具名参数标识符组成。具名参数只能放在参数列表的最后,并且有且只有一个不定参数。
1function f(...values) {2 console.log(values.length)3}4f(1, 2) //25f(1, 2, 3, 4) //4
10、箭头函数
箭头函数提供了一种更加简洁的函数书写方式。基本语法是:
参数 => 函数体
1// 传统2var f1 = function(a){3 return a4}5console.log(f1(1))678// ES69var f2 = a => a10console.log(f2(1))
1// 当箭头函数没有参数或者有多个参数,要用 () 括起来。2// 当箭头函数函数体有多行语句,用 {} 包裹起来,表示代码块,3// 当只有一行语句,并且需要返回结果时,可以省略 {} , 结果会自动返回。4var f3 = (a,b) => {5 let result = a+b6 return result7}8console.log(f3(6,2)) // 8910// 前面代码相当于:11var f4 = (a,b) => a+b
11、Promise
在JavaScript的世界中,所有代码都是单线程执行的。由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行。
异步执行可以用回调函数实现:
例1、定时器
1// 1、timeout的定时器功能使用了回调函数2console.log('before setTimeout()')3setTimeout(()=>{4 console.log('Done')5}, 1000) // 1秒钟后调用callback函数6console.log('after setTimeout()')
例2、ajax
mock/user.json
1{2 "id": "1",3 "username":"helen",4 "age":185}
html页面引入jquery.js
1
1 // 2、ajax功能使用了回调函数2$.get('mock/user.json', (data)=>{34 console.log(data)5})
例3、1秒后执行ajax操作
1 // 1、timeout的定时器功能使用了回调函数2console.log('before setTimeout()')3setTimeout(() => {4 console.log('Done')56 // 2、ajax功能使用了回调函数7 $.get('mock/user.json', (data) => {89 console.log(data)10 })1112}, 1000); // 1秒钟后调用callback函数13console.log('after setTimeout()')
例4、1秒后获取用户数据,然后根据用户id获取用户登录日志
mock/login-log-1.json
1{2 "items":3 [4 {5 "date":"2018-12-01",6 "ip":"10.10.10.10"7 },8 {9 "date":"2018-12-01",10 "ip":"10.10.10.10"11 }12 ]13}
回调函数嵌套的噩梦
1// 1、1秒后获取用户数据2console.log('before setTimeout()')3setTimeout(() => {4 console.log('Done')56 // 2、获取用户数据7 $.get('mock/user.json', (data) => {89 console.log(data)1011 // 3、获取当前用户的登录日志12 $.get(`mock/login-log-${data.id}.json`, (data) => {1314 console.log(data)15 })16 })1718}, 1000) // 1秒钟后调用callback函数19console.log('after setTimeout()')
Promise是异步编程的一种解决方案。从语法上说,Promise 是一个对象,从它可以获取异步操作的响应消息。
古人云:“君子一诺千金”,这种“承诺将来会执行”的对象在JavaScript中称为Promise对象。
12
有错误处理的promise案例
12
也可以使用catch处理失败
1.then((data)=>{//成功23})4.catch(()=>{//处理失败:then方法的第二个参数是失败的回调5 console.log('出错啦!')6})
12、模块化
随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂。
Javascript模块化编程,已经成为一个迫切的需求。理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块。
但是,Javascript不是一种模块化编程语言,它不支持"类"(class),更遑论"模块"(module)了。
在 ES6 前, 实现模块化使用的是 RequireJS 或者 seaJS(分别是基于 AMD 规范的模块化库, 和基于 CMD 规范的模块化库)。
ES6 引入了模块化,其设计思想是在编译时就能确定模块的依赖关系,以及输入和输出的变量。
ES6 的模块化分为导出(export) @与导入(import)两个模块。
创建api/user.js
1let getList = () => {2 console.log('获取数据列表')3}45let save = () => {6 console.log('保存数据')7}8export { getList, save }
创建component/user.js(注意:浏览器不支持很多ES6的高级功能,我们需要使用babel将其转换成ES5,后面的课程将会介绍)
1import { getList, save } from "../api/user.js"2console.log(getList())3console.log(save())