Skip to content

lucianLY/Calculator

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

#ES6 实战 Tutorial

简述

这是一个简单的tutorial,旨在学习认识ES6。教程中会设计到一些基础理论知识,再此不做过多讲解。Tutorial的目的在于串联ES6中的语法特性,从而得到对知识的深入理解。 制作一个简单的按揭计算器,通过输入贷款金额、年份、利率获取一个明细表。 哪我们会涉及哪些知识呢? EMAScript6、Gulp、Webpack等 ----我们不生产知识、只做知识的搬运工。 ##1) let 变量 let Variables let是ES6 用来声明变量的,用法类似于var,但是let所声明的变量,只在let所在的代码块内有效。 首先我们需要一个html文件,用编辑器新建一个index.html文件和一个./js/main.js文件,准备开始我们的项目。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>按揭计算机</title>
    <link rel="stylesheet" href="./css/main.css">
  </head>
  <body>
    <div class="header">
      按揭计算器
    </div>
    <div class="table">
      <div class="row">
        Principal: <span><input type="text" id='principal' class="input"></span>
      </div>
      <div class="row">
        Years: <span><input type="text" id='years' class="input"></span>
      </div>
      <div class="row">
        Rate: <span><input type="text" id='rate' class="input"></span>
      </div>
      <div id="submit" class="button">Calculate</div>
    </div>
    <div id="Payment">
    </div>
    <script type="text/javascript" src='./js/main.js'></script>
  </body>
</html>

打开你的编辑器我们先在 ./js/main.js 文件里写入一个方法。暂定方法名叫做calculateMonthlyPayment。我们需要给calculateMonthlyPayment番薯配置三个参数,分别是页面中需要输入的principal、year、rate

var calculateMonthlyPayment = function (principal, year, rate) {
  if(rate){
    var monthlyRate = rate/100/12
  }
  var monthluPayment = (principal * monthlyRate)/(1-(Math.pow(1/(1 + monthlyRate), years * 12)))
  return monthluPayment
}
document.getElementById('submit').addEventListener('click', function () {
  var principal = document.getElementById('principal').value
  var years = document.getElementById('years').value
  var rate = document.getElementById('rate').value
  var monthlyPayment = calculateMonthlyPayment(principal, years, rate)
  document.getElementById('Payment').innerHtml = monthlyPayment
})

好吧,这个函数看起来没有什么别特的。请注意这里有三个var声明的变量,用let替换所有的var,这样我们的js文件就包含了ES6啦。 ##2) 变量的解构 Destructuring ES6的新语法,使得创建对象变得更加容易。我们再次打开 ./js/main.js,修改calculateMonthlyPayment的返回值

return {principal,year,rate,monthluPayment,monthlyRate}

ES6允许按照一个模式,从数组和对象中提取值,对变量进行赋值,这被称之为结构(Destructuring)

然后我们修改一下调用calculateMonthlyPayment方法的地方

let {monthlyPayment, monthlyRate} = calculateMonthlyPayment(principal, year, rate)

函数只能返回一个真,如果要返回多个值,只能将他们放在数组或者对象中返回,有了解够赋值取出来这些赋值就非常方便

##3) 函数的扩展 箭头函数 Arrow Functions ES6 允许使用箭头(=>)定义函数

var f = v =>v

上面箭头函数等价于

var f = function (v) {
  return v
}

我们再次编辑 ./js/main.js 文件,把function去掉用=>进行替换。

var calculateMonthlyPayment = function (principal, years, rate) {
var calculateMonthlyPayment = (principal, years, rate) => {

是时候,修改一下 ./js/main.js 紧接着我们写一个 calculateAmortization 方法当然啦,还是要用箭头定义的。 分别这只principal, years, rate这三个参数,并在函数内调用calculateMonthlyPayment对结果进行进一步计算。

let calculateAmortization = (principal, years, rate) => {
  let {monthlyPayment, monthlyRate} = calculateMonthlyPayment(principal, years, rate)
  let balance = principal
  let amortization = []
  for (let y = 0; y < years; y++) {
    let interestY = 0
    let principalY = 0
    for (let m = 0; m < 12; m++) {
      let interestM = balance * monthlyRate
      let principalM = monthlyPayment - interestM
      interestY = interestY + interestM
      principalY = principalY + principalM
      balance = balance - principalM
    }
    amortization.push({principalY, interestY, balance})
  }
  return {monthlyPayment, monthlyRate, amortization}
}

修改calculateMonthlyPayment调用的地方。

let {monthlyPayment, monthlyRate, amortization} = calculateAmortization(principal, years, rate)

ok~~我们的Tutorial基本完成了。 ##4) ES6里的Fetch 首先我们先要从XMLHttpRequest开始谈起,XMLHttpRequest作为了当前WEB应用与远程资源进行通信的基础,本段介绍的内容则是XMLHttpRequest的替代技术Fetch API。 Fetch API 提供了一个fetch()方法,可以使用它来发起远程资源请求,并返回一个Promise对象,让我们能够对请求的返回结果进行检索,

function fetch () {
  fetch(url).then(function (response) {

  }).then(function (json) {

  })

首先构造请求的URL,然后将对URL传递给全局的fetch()方法,他会立刻返回一个Promise,当Promise被通过,他就会返回一个Response对象,通过该对象的json()方法就可以将结果作为JSON对象返回。同样response.json()会返回一个Promise对象,因此在我们的例子中可以继续链接一个then()方法。 为什么要替代XMLHttpRequest? 对于传统的XMLHttpRequest而言,你必须使用它的一个实例来执行请求和检索返回的响应,但是通过Fetch API我们还能明确配置的请求对象。通过Request构造器函数创建一个新的请求,第一个参数是请求的url,第二个参数是选项用于配置请求

var req = new Request(URL, {method: 'GET', cache: 'reload'});
fetch(req).then(function(response) {
  return response.json()
}).then(function(json) {
  insertPhotos(json)
});

Fetch 常见坑 Fetch 请求默认不带cookie,需要设置 fetch(url, {credentials: 'include'}) ##5) 使用 Gulp 对代码进行转换压缩 首先我们新建一个gulpfile.js文件将其存放在根目录下。 安装全局gulp和项目开发依赖的devDependencies

npm install --global gulp
npm install --save-dev gulp

安装完成之后打开gulpfile.js文件

var gulp = require('gulp')
gulp.task('default', function () {
  // 这里写任务
})

然后我们继续安装gulp的包 gulp-rename,gulp-uglify,gulp-es6-transpiler,cssnano 分别是处理重命名、压缩js、es6转换es5、cs压缩任务

npm install gulp-rename
npm install --save-dev gulp-uglify
npm npm install --save-dev gulp-es6-transpiler
npm install cssnano
npm install gulp-html-minify

全部安装完毕之后,我们就可以写任务了,我们继续编辑gulpfile.js

var gulp = require('gulp')
var rename = require('gulp-rename')
var uglify = require('gulp-uglify')
var es = require('gulp-es6-transpiler')
var htmlminify = require('gulp-html-minify')
gulp.task('js', ['transpiler'],function () {
  return gulp.src('dist/*.js')
  .pipe(uglify())
  .pipe(rename({extname: '.min.js'}))
  .pipe(gulp.dest('./resource'))
})
gulp.task('transpiler', function () {
  return gulp.src('./js/main.js')
  .pipe(es())
  .pipe(rename({extname: '.min.js'}))
  .pipe(gulp.dest('./resource/'))
})
gulp.task('html', function () {
  return gulp.src('js/m.html')
  .pipe(htmlminify())
  .pipe(gulp.dest('./dist'))
})
gulp.task('css', function () {
  return gulp.src('css/*.css')
  .pipe(postcss([require('cssnano')]))
  .pipe(gulp.dest('./resource'))
})
gulp.task('default', ['transpiler','js','css','html'])

未完待续

About

es6 实战 Tutorial

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages