前端基础
# 前端基础
# ES6
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。
ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现(另外的 ECMAScript 方言还有 Jscript 和 ActionScript)
# let 声明变量
// var 声明的变量没有局部作用域
// let 声明的变量 有局部作用域
{
var a = 0
let b = 1
}
console.log(a) // 0
console.log(b) // ReferenceError: b is not defined
// var 可以声明多次
// let 只能声明一次
var m = 1
var m = 2
let n = 3
let n = 4
console.log(m) // 2
console.log(n) // Identifier 'n' has already been declared
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# const 声明常量
// 1、声明之后不允许改变
const PI = "3.1415926"
PI = 3 // TypeError: Assignment to constant variable.
// 2、一但声明必须初始化,否则会报错
const MY_AGE // SyntaxError: Missing initializer in const declaration
2
3
4
5
6
# 解构赋值
解构赋值是对赋值运算符的扩展。他是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。
//2、对象解构
let user = {name: 'Helen', age: 18}
// 传统
let name1 = user.name
let age1 = user.age
console.log(name1, age1)
// ES6
let { name, age } = user//注意:结构的变量必须是user中的属性
console.log(name, age)
2
3
4
5
6
7
8
9
# 模板字符串
模板字符串相当于加强版的字符串,用反引号 `, 除了作为普通字符串,还可以在字符串中加入变量和表达式。
// 2、字符串插入变量和表达式。变量名写在 ${} 中,${} 中可以放入 JavaScript 表达式。
let name = "Mike"
let age = 27
let info = `My Name is ${name},I am ${age+1} years old next year.`
console.log(info)
// My Name is Mike,I am 28 years old next year.
// 3、字符串中调用函数
function f(){
return "have fun!"
}
let string2 = `Game start,${f()}`
console.log(string2); // Game start,have fun!
2
3
4
5
6
7
8
9
10
11
12
13
# 定义方法简写
// 传统
const person1 = {
name:'zhangsan',
sayHi:function(){
console.log("Hi")
}
}
person1.sayHi();//"Hi"
console.log(person1.name)//zhangsan
// ES6
const person2 = {
sayHi(){
console.log("Hi")
}
}
person2.sayHi() //"Hi"
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 对象拓展运算符
拓展运算符 ... 用于取出参数对象所有可遍历属性然后拷贝到当前对象。
// 1、拷贝对象
let person1 = {name: "Amy", age: 15}
let someone = { ...person1 }
console.log(someone) //{name: "Amy", age: 15}
2
3
4
# 箭头函数
// 传统
var f1 = function(a){
return a
}
console.log(f1(1))
// ES6
var f2 = a => a
console.log(f2(1))
// 当箭头函数没有参数或者有多个参数,要用 () 括起来。
// 当箭头函数函数体有多行语句,用 {} 包裹起来,表示代码块,
// 当只有一行语句,并且需要返回结果时,可以省略 {} , 结果会自动返回。
var f3 = (a,b) => {
let result = a+b
return result
}
console.log(f3(6,2)) // 8
// 前面代码相当于:
var f4 = (a,b) => a+b
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
箭头函数多用于匿名函数的定义
# Vue
# 初始 Vue.js
<!-- id标识vue作用的范围 -->
<div id="app">
<!-- {{}} 插值表达式,绑定vue中的data数据 -->
{{ message }}
</div>
<script src="vue.min.js"></script>
<script>
// 创建一个vue对象
new Vue({
el: '#app',//绑定vue作用的范围
data: {//定义页面中显示的模型数据
message: 'Hello Vue!'
}
})
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
在 vs code 中创建代码片段:
文件 => 首选项 => 用户代码片段 => 新建全局代码片段 / 或文件夹代码片段:vue-html.code-snippets
注意:制作代码片段的时候,字符串中如果包含文件中复制过来的 “Tab” 键的空格,要换成 “空格键” 的空格
{
// Place your snippets for vue here. Each snippet is defined under a snippet name and has a prefix, body and
// description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the
// same ids are connected.
// Example:
// "Print to console": {
// "prefix": "log",
// "body": [
// "console.log('$1');",
// "$2"
// ],
// "description": "Log output to console"
// }
"Print to console": {
"prefix": "vue",
"body": [
"<template>",
" <div class=\"$2\">$5</div>",
"</template>",
"",
"<script>",
"",
"export default {",
" name: '$1',",
" components: {},",
" data() {",
" return {",
"",
" };",
" },",
" computed: {},",
" watch: {},",
" props: {},",
" methods: {},",
" created() {},",
" mounted() {},",
" beforeCreate() {},",
" beforeMount() {},",
" beforeUpdate() {},",
" updated() {},",
" beforeDestroy() {},",
" destroyed() {},",
" activated() {},",
" }",
"</script>",
"<style lang='less' scoped>",
"//@import url($3); 引入公共css类",
"$4",
"</style>"
],
"description": "Log output to console"
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# Vue 指令和差值表达式
# 基本数据渲染和指令
除了使用插值表达式 {{}} 进行数据渲染,也可以使用 v-bind 指令,它的简写的形式就是一个冒号(:)
<!-- 如果要将模型数据绑定在html属性中,则使用 v-bind 指令
此时title中显示的是模型数据
-->
<h1 v-bind:title="message">
{{content}}
</h1>
<!-- v-bind 指令的简写形式: 冒号(:) -->
<h1 :title="message">
{{content}}
</h1>
data: {
content: '我是标题',
message: '页面加载于 ' + new Date().toLocaleString()
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 双向数据绑定
双向数据绑定和单向数据绑定:使用 v-model 进行双向数据绑定
<!-- v-bind:value只能进行单向的数据渲染 -->
<input type="text" v-bind:value="searchMap.keyWord">
<!-- v-model 可以进行双向的数据绑定 -->
<input type="text" v-model="searchMap.keyWord">
<p>您要查询的是:{{searchMap.keyWord}}</p>
data: {
searchMap:{
keyWord: '测试测试'
}
}
2
3
4
5
6
7
8
9
10
11
# 事件
使用 v-on 进行数件处理,v-on:click 表示处理鼠标点击事件,事件调用的方法定义在 vue 对象声明的 methods 节点中
<!-- v-on 指令绑定事件,click指定绑定的事件类型,事件发生时调用vue中methods节点中定义的方法 -->
<button v-on:click="search()">查询</button>
<!-- v-on 指令的简写形式 @ -->
<button @click="search()">查询</button>
data: {
},
methods:{
search(){
console.log('search')
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# 条件渲染
v-if:条件指令
<input type="checkbox" v-model="ok">同意许可协议
<!-- v:if条件指令:还有v-else、v-else-if 切换开销大 -->
<h1 v-if="ok">if:Lorem ipsum dolor sit amet.</h1>
<h1 v-else>no</h1>
data: {
ok: false
}
2
3
4
5
6
7
8
# 列表渲染
v-for:列表循环指令
<!-- 2、遍历数据列表 -->
<table border="1">
<!-- <tr v-for="item in userList"></tr> -->
<tr v-for="(item, index) in userList">
<td>{{index}}</td>
<td>{{item.id}}</td>
<td>{{item.username}}</td>
</tr>
</table>
data: {
userList: [
{ id: 1, username: 'helen'},
{ id: 2, username: 'peter'},
{ id: 3, username: 'andy'}
]
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Vue 生命周期

<h3 id="h3">{{ message }}</h3>
data: {
message: '床前明月光'
},
created() { // 在渲染之前执行
console.log("created....")
},
mounted() { // 在渲染之后执行
console.log("mounted....")
},
methods: {
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# Vue 组件
组件(Component)是 Vue.js 最强大的功能之一。
组件可以扩展 HTML 元素,封装可重用的代码。组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树

# 定义组件
var app = new Vue({
el: '#app',
// 定义局部组件,这里可以定义多个局部组件
components: {
//组件的名字
'Navbar': {
//组件的内容
template: '<ul><li>首页</li><li>学员管理</li></ul>'
}
}
})
2
3
4
5
6
7
8
9
10
11
# 使用组件
<div id="app">
<Navbar></Navbar>
</div>
2
3
# 路由
Vue.js 路由允许我们通过不同的 URL 访问不同的内容。
通过 Vue.js 可以实现多视图的单页 Web 应用(single page web application,SPA)。
Vue.js 路由需要载入 vue-router 库
引入 js
<script src="vue.min.js"></script>
<script src="vue-router.min.js"></script>
2
编写 html
<div id="app">
<h1>Hello App!</h1>
<p>
<!-- 使用 router-link 组件来导航. -->
<!-- 通过传入 `to` 属性指定链接. -->
<!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
<router-link to="/">首页</router-link>
<router-link to="/student">会员管理</router-link>
<router-link to="/teacher">讲师管理</router-link>
</p>
<!-- 路由出口 -->
<!-- 路由匹配到的组件将渲染在这里 -->
<router-view></router-view>
</div>
2
3
4
5
6
7
8
9
10
11
12
13
14
编写 js
<script>
// 1. 定义(路由)组件。
// 可以从其他文件 import 进来
const Welcome = { template: '<div>欢迎</div>' }
const Student = { template: '<div>student list</div>' }
const Teacher = { template: '<div>teacher list</div>' }
// 2. 定义路由
// 每个路由应该映射一个组件。
const routes = [
{ path: '/', redirect: '/welcome' }, //设置默认指向的路径
{ path: '/welcome', component: Welcome },
{ path: '/student', component: Student },
{ path: '/teacher', component: Teacher }
]
// 3. 创建 router 实例,然后传 `routes` 配置
const router = new VueRouter({
routes // (缩写)相当于 routes: routes
})
// 4. 创建和挂载根实例。
// 从而让整个应用都有路由功能
const app = new Vue({
el: '#app',
router
})
// 现在,应用已经启动了!
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# axios
axios 是独立于 vue 的一个项目,基于 promise 用于浏览器和 node.js 的 http 客户端
- 在浏览器中可以帮助我们完成 ajax 请求的发送
- 在 node.js 中可以向远程接口发送请求
# 获取数据
<script src="vue.min.js"></script>
<script src="axios.min.js"></script>
var app = new Vue({
el: '#app',
data: {
memberList: []//数组
},
created() {
this.getList()
},
methods: {
getList(id) {
//vm = this
axios.get('data.json')
.then(response => {
console.log(response)
this.memberList = response.data.data.items
})
.catch(error => {
console.log(error)
})
}
}
})
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 显示数据
<div id="app">
<table border="1">
<tr>
<td>id</td>
<td>姓名</td>
</tr>
<tr v-for="item in memberList">
<td>{{item.memberId}}</td>
<td>{{item.nickname}}</td>
</td>
</tr>
</table>
</div>
2
3
4
5
6
7
8
9
10
11
12
13
# Node
Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境,基于 Google 的 V8 引擎,V8 引擎执行 Javascript 的速度非常快,性能非常好。
# NPM
NPM 全称 Node Package Manager,是 Node.js 包管理工具,是全球最大的模块生态系统,里面所有的模块都是开源免费的;也是 Node.js 的包管理工具,相当于前端的 Maven 。
Node.js 默认安装的 npm 包和工具的位置:Node.js 目录 \node_modules
npm -v
# 使用 npm 管理项目
1. 创建项目文件夹
2. 项目初始化
#建立一个空文件夹,在命令提示符进入该文件夹 执行命令初始化
npm init
#按照提示输入相关信息,如果是用默认值则直接回车即可。
#name: 项目名称
#version: 项目版本号
#description: 项目描述
#keywords: {Array}关键词,便于用户搜索到我们的项目
#最后会生成package.json文件,这个是包的配置文件,相当于maven的pom.xml
#我们之后也可以根据需要进行修改。
#如果想直接生成 package.json 文件,那么可以使用命令
npm init -y
2
3
4
5
6
7
8
9
10
11
12
2.3 修改 npm 镜像
NPM 官方的管理的包都是从 http://npmjs.com 下载的,但是这个网站在国内速度很慢。
这里推荐使用淘宝 NPM 镜像 http://npm.taobao.org/ ,淘宝 NPM 镜像是一个完整 npmjs.com 镜像,同步频率目前为 10 分钟一次,以保证尽量与官方服务同步。
#经过下面的配置,以后所有的 npm install 都会经过淘宝的镜像地址下载
npm config set registry https://registry.npm.taobao.org
#查看npm配置信息
npm config list
2
3
4
# npm install 命令的使用
#使用 npm install 安装依赖包的最新版,
#模块安装的位置:项目目录\node_modules
#安装会自动在项目目录下添加 package-lock.json文件,这个文件帮助锁定安装包的版本
#同时package.json 文件中,依赖包会被添加到dependencies节点下,类似maven中的 <dependencies>
npm install jquery
#npm管理的项目在备份和传输的时候一般不携带node_modules文件夹
npm install #根据package.json中的配置下载依赖,初始化项目
#如果安装时想指定特定的版本
npm install [email protected]
# 局部安装
#devDependencies节点:开发时的依赖包,项目打包到生产环境的时候不包含的依赖
#使用 -D参数将依赖添加到devDependencies节点
npm install --save-dev eslint
#或
npm install -D eslint
#全局安装
#Node.js全局安装的npm包和工具的位置:用户目录\AppData\Roaming\npm\node_modules
#一些命令行工具常使用全局安装的方式
npm install -g webpack
--global
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
其他命令
#更新包(更新到最新版本)
npm update 包名
#全局更新
npm update -g 包名
#卸载包
npm uninstall 包名
#全局卸载
npm uninstall -g 包名
2
3
4
5
6
7
8
# 模块化开发
模块化规范:
- CommonJS 模块化规范
- ES6 模块化规范
# ES5 模块化
每个文件就是一个模块,有自己作用域。在一个文件里定义的变量、函数、类,都是私有的,对其他文件不可见。
CommonJS 使用 exports 和 require 来导出、导入模块。
导出模块
编写 js
// 定义成员:
const sum = function(a,b){
return parseInt(a) + parseInt(b)
}
const subtract = function(a,b){
return parseInt(a) - parseInt(b)
}
2
3
4
5
6
7
导出模块中的成员
// 导出成员:
module.exports = {
sum: sum,
subtract: subtract
}
//简写
module.exports = {
sum,
subtract
}
2
3
4
5
6
7
8
9
10
11
导入模块
//引入模块,注意:当前路径必须写 ./
const m = require('./四则运算.js')
console.log(m)
const result1 = m.sum(1, 2)
const result2 = m.subtract(1, 2)
console.log(result1, result2)
2
3
4
5
6
# ES6 模块化
ES6 使用 export 和 import 来导出、导入模块。
导出模块
//方式一
export function getList() {
console.log('获取数据列表')
}
export function save() {
console.log('保存数据')
}
//方式二
export default {
getList() {
console.log('获取数据列表2')
},
save() {
console.log('保存数据2')
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
导入模块
//只取需要的方法即可,多个方法用逗号分隔
import { getList, save } from "./userApi.js"
getList()
save()
//方式二
import user from "./userApi2.js"
user.getList()
user.save()
2
3
4
5
6
7
8
9
注意:这时程序无法运行,因为 ES6 的模块化无法在 Node.js 中执行,需要用 Babel 编辑成 ES5 后再执行。
# Babel 转码工具
Babel 是一个广泛使用的转码器,可以将 ES6 代码转为 ES5 代码,从而在现有环境执行执行
安装命令行转码工具
Babel 提供 babel-cli 工具,用于命令行转码。它的安装命令如下:
npm install --global babel-cli
#查看是否安装成功
babel --version
2
3
配置.babelrc
Babel 的配置文件是.babelrc,存放在项目的根目录下,该文件用来设置转码规则和插件,presets 字段设定转码规则,将 es2015 规则加入 .babelrc:
{
"presets": ["es2015"],
"plugins": []
}
2
3
4
在项目中安装转码器
npm install --save-dev babel-preset-es2015
转码
# 整个目录转码
mkdir dist1
# --out-dir 或 -d 参数指定输出目录
babel src -d dist1
2
3
4