On Github GuoYongfeng / reveal
Created by @郭永峰
就像是隧道终点前的光明,JS生态的最佳实践不再剧烈变更着,现在关于需要学什么也越来越明确了
我们将从语言特性、代码风格、构建工具、依赖管理、路由管理、核心类库、状态管理、API 工具库、测试工具等前端开发的方方面面进行技术梳理,为你挑出这些最佳实践并规划面向未来的技术学习之路。
在2016年,不能使用ES2015/ES2016进行开发的前端技术栈,会是最先停止增长并且走下坡路的!
解决变量提升的问题,给JS新增块级作用域
console.log( n );
function f1() {
  let n = 5;
  if (true) {
    let n = 10;
  }
  console.log(n);
}
const PI = 3.1415;
console.log(PI);
						
					让我们可以更便捷的定义字符串模板
let name = '信';
let word = `我是歌手:\n
是${name}.`;
console.log( word );
						
					箭头函数,不止是简化了function的定义,还解决了function内this关键字指向的问题
drink(type = 'water'){
	// 使用了箭头函数
	setInterval( () => {
		// 模板字符串
		console.log(`${this.name} want to drink ${type}`)
	}, 1000)
}
						
					Babel 是一个 JavaScript 编译器,用于转化你的 JavaScript 代码
ES6 源码
import path from 'path';
console.log(path.resolve(__dirname, './src'));
const fn = a => {
    alert(a);
}
Babel 编译后
'use strict';
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
console.log(_path2.default.resolve(__dirname, './src'));
var fn = function fn(a) {
  alert(a);
};
webpack是一款强大的模块加载器兼打包工具,它能把各种资源,例如JS(含JSX)、coffee、样式(含less/sass)、图片等都作为模块来使用和处理。
Webpack 的学习曲线也有点陡峭,但一旦掌握,会发现很好用。
框架间的竞争并不是零和游戏,主流并不一定只有一个赢家
使用ESlint配合Airbnb指南来保持我们团队的代码风格。
使用 Lint 工具和代码风格检测工具,则可以辅助编码规范执行,有效控制代码质量。
install
npm install --save-dev eslint eslint-config-airbnb
.eslintrc
{
    "extends": "airbnb/base",
    "globals": {
    "_id": true,
    "Swipe": true,
  }
}
单页应用时代的到来,为之服务的前端路由系统是不可获取的一部分; 有独立的director,比较轻量,Backbone、Angular、React、Vue等都有其各自的路由 React-router针对React做了很多UI展示的优化
简单示例:
import React from 'react';
import { Route, IndexRoute } from 'react-router';
import { App, Home, Profile } from '../containers';
export default (
    <Route path="/" component={App}>
        <Route path="profile/:username" component={Profile} />
        <IndexRoute component={Home} />
    </Route>
)
我们有了视图和组件层,应用程序还需要管理数据状态和应用的生命周期。Redux也是毋容置疑的优胜者。
除了React,Facebook展示了名叫Flux的单向数据流的设计模式。Flux最早用来解决和简化应用的状态管理,但是随之而来,很多开发者提出了不少新的问题如如何存储数据状态和从哪发送Ajax请求。
为了解决这些问题,不少基于Flux模式之上的框架诞生了:Fluxible, Reflux, Alt, Flummox, Lux, Nuclear, Fluxxor 还有很多。
这其中的类Flux的优雅实现最终赢得了社区的关注,它就是Redux。
基础示例:
import { createStore } from 'redux'
// reducer
const todos = (state = [''], action) => {
    switch (action.type) {
        case 'ADD_TODO':
            return Object.assign([], state, [action.text]);
        default:
            return state;
    }
}
let store = createStore(todos, [ 'Use Redux' ])
// action creator
function addTodo(text) {
    return {
        type: 'ADD_TODO',
        text
    }
}
const handleChange =  () => {
    console.log(store.getState());
}
let unsubscribe = store.subscribe(handleChange)
handleChange()
// dispatch
store.dispatch(addTodo('Read the docs'))
mocha 是一个功能丰富的javascript测试框架,可以运行在nodejs和浏览器环境,使异步测试变得简单有趣。mocha 串联运行测试,允许灵活和精确地报告结果,同时映射未捕获的异常用来纠正测试用例。
支持TDD/BDD 的 开发方式,结合 should.js/expect/chai/better-assert 断言库,能轻松构建各种风格的测试用例。
//模块依赖
var assert = require("assert");
//断言条件
describe('Array', function(){
  describe('#indexOf()', function(){
    it('当值不存在时应该返回 -1', function(){
      assert.equal(-1, [1,2,3].indexOf(5));
      assert.equal(-1, [1,2,3].indexOf(0));
    });
  });
});
什么是immutable.js,为什么需要它。
有人说 Immutable 可以给 React 应用带来数十倍的提升,也有人说 Immutable 的引入是近期 JavaScript 中伟大的发明,因为同期 React 太火,它的光芒被掩盖了。
看以下代码
foo={a: 1};
bar=foo;
bar.a=2;
console.log(foo.a); // 2
这样做可以节约内存,但当应用复杂后,这就造成了非常大的隐患,Mutable 带来的优点变得得不偿失。而一般大家会使用深拷贝或是浅拷贝的方式来解决这个问题,但同时也带来了内存的消耗。
几个重要的数据结构: