【翻译向】走进 Redux 之基础篇(一)

Create at 2016 04 2711 min read技术Redux学习笔记

Redux 的三个原则

  • 整个应用的状态都以一个对象树的形式保存在一个单一的 store 中
  • 唯一去改变这个对象树的方法就是通过去触发 action,一个用来描述发生了什么事情的对象
  • 通过编写纯函数 reducers,去描述这个 action 如何改变了整个对象树

Action

Action 就是承载了要从你的应用传送给 store 的信息。它们只是 store 的信息数据来源。可以通过 store.dispatch() 来传递 action. action 可能长这个样子:

const ADD_TODO = 'ADD_TODO'
{
    type: ADD_TODO,
    text: 'Bulid my first Redux App'
}

Actions 就是普通的 JavaScript 对象,但是必须有

JavaScript 中的类和继承

Create at 2016 03 229 min read技术JavaScriptinherit

我们都知道 JavaScript 是一门基于原型的语言。当我们调用一个对象本身没有的属性时,JavaScript 就会从对象的原型对象上去找该属性,如果原型上也没有该属性,那就去找原型的原型,一直找原型链的末端也就是 Object.prototype 的原型 null。这种属性查找的方式我们称之为原型链。

类的实现

由于 JavaScript 本身是没有的类的感念的。所以我们如果要实现一个类,一般是通过构造函数来模拟类的实现:

function Person(name, age) {
  //实现一个类
  this.name = name
  this.age = age
}
var you = new Person("you", 23) //通过 new 来新建实例

首先新建一个 Person 的构造函数,为了和一般的函数区别,我们会使用 Camel

Hexo部署到VPS并启用HTTPS

Create at 2016 03 114 min read技术网站建设hexo

上周买了个 VPS 玩 ,从板瓦工买的,一年的 19 刀。性价比还算合适,这是配置:

10 GB SSD RAID-10 Disk Space
256 MB RAM
500 GB Transfer
Gigabit port
Multiple locations

这是购买链接

买过来,先是搭了个 SS 解决科学上网的问题。然后想想要不要把博客也迁移过去算了,一个 ss 又用不了多少流量。于是说干就干,一番搜索查询后,达成成就。

简单的记录下操作的步骤:

客户端:

  1. 配置 ssh
  2. 本地部署 hexo

服务器:

  1. 安装所需软件 a. Git b. Nginx
  2. 为了安全与方便,新建专用与部署 hexo 的用户 git,并给予相应权限。

HTTP 缓存

Create at 2016 03 088 min read技术http缓存

下午意外的接到了阿里钉钉前端的面试,很是欣喜。 面试内容从做的项目,到使用的技术 Angular、React、Express 等,让我感觉到自己的理解还是不够深刻。 比如我说我喜欢 React,大项目中需要配合 Redux 来用处理数据,然后就问到 Redux 到底解决了哪些问题,我没能清楚的答上来。但是整体上,面试的前面部分,自我感觉还是很不错的。 但是到最后,面试官说问一个比较基础的问题:如何在 HTTP 协议中控制缓存? 我懵了,平时工作中根本接触不到。只能凭自己感觉说,从文件名的更改以及在 HTTP 的 header 中设置相应参数来设置,但具体怎样设置,设置的内容是什么,我完全答不上来。感觉肯定是要挂在这里。不过俗话说的好,人不能在同一个地方跌到两次,谨以此篇记录 HTTP 缓存的相应内容。

概览

HTTP 控制缓存主要有一下几种方式:

  1. Expires
  2. Cache-Control
  3. Last-Modified/If-Modified-Since
  4. Etag/If-

Postman 的简单使用

Create at 2016 02 272 min read技术Postman调试工具

Postman 是一款用来测试 WEB 接口的工具,可以简单的发送 GET 、POST、PUT、DELETE 等请求,可以在 chrome 商店里面搜索安装。 为了介绍它的功能,首先本地起一个服务器:

var http = require("http")
var url = require("url")
var querystring = require("querystring")

http
  .createServer(function (req, res) {
    res.writeHead(200, { "content-type": "text/json" })
    if (req.method === "GET") {
      var params = url.parse(req.url, true).query
      res.write(params.name + " is " + params.age + " years old")
      res.on("error"

用ES6重构fullPage

Create at 2016 02 224 min read技术JavaScript

用 ES6 重写了 fullpage-light.js。 主要做了一下修改:

  • 模块化:将整个文件问个成多个独立的模块,每个模块负责一个功能
  • 新语法:替换一些新的语法,比如变量声明的 let,const,Object.assign 等
  • 转码:因为目前浏览器还并不支持 ES2015,所以还需要用 Babel 做一下转码

模块化

根据功能,将整个文件分割成为了五个模块。

-bootstrap.js   //方法和功能
-constant.js    //一些常量
-event.js       //绑定的事件
-index.js       //入口
-utils.js       //工具函数

这样原来一个很大文件就被分割成为了五个独立的模块,每个模块只负责自己的功能就好,维护起来会方便很多。

新语法

做手机商城接到一个需求。 具体大概是这样子的,要求用户点击购买按钮后,直接显示输入密码的弹窗并弹出键盘。 拿到需求一想,这挺简单的。 就麻利的写了个模拟的密码输入框,然后在用户点击购买按钮的时候让他弹出来,并且让焦点 focus 在 input 框上。 Chrome 上一试,完全没问题,觉得自己简直太棒了有没有。可是拿出自己的手机一试,oh no ~,键盘直接把页面给推了上去,导致完全看不到弹窗弹的是个什么东西。 解决前 但是在 Android 上是没有任何问题的。观察了下是因为 Android 和 ios 上键盘弹出的行为是不一样的,Android 上键盘弹出来,直接覆盖在原来的页面上,而 ios 上键盘弹出来的时候会直接把整个页面推上去。 怎么解决呢?其实也挺好解决,就是针对不同系统 hack 一下。

购买页面这个弹窗的定位是这么定位的:

// 后面的遮罩
.dialog-wrap {
  width: 100

2015年终总结

Create at 2015 12 318 min read随笔年终总结杭州

来到杭州

回想一下二月二十八号怀着忐忑的心来到杭州。

那天天还下着大雨,我从机场出来一路大巴加地铁到滨江区。出了地铁站,站口一个三轮师傅一看我拉一个行李箱,明显外地人,隔老远就吆喝,走不走!想想我怎么也是有导航的人,怎么能让你们坑。然后就跟着导航找酒店,结果怎么找也找不到,就在目的地旁边转来转去,问路人也没人听过酒店名,我一度认为是不是订的酒店有问题。最后无奈,又跑回地铁口,掏了二十块上了三轮,结果五分钟就开到了,其实那酒店距离地铁口也就不到一公里,因为下雨视线不好所以我一直找不到。到了酒店,收拾了一下发现行李箱都被雨水打湿了,赶紧打开看了一下,还好,只有基本放在外面的书有点潮,衣服什么的还是干的。洗了个澡,就出去感受这个被誉为人间天堂的陌生城市了。不得不说,杭州城市真的很干净,而且绿化也很好,但是雨真的真的太多了

找房子

到一个新的城市工作,首要的事情就是找房子。说道找房子,不得不说这是一个非常痛苦的过程。

从好友三月初来到杭州开始找房子,找了差不多一星期的时间,最后还是在没办法,两个人第二天都要上班

react-v2ex

Create at 2015 12 265 min read技术JavaScriptReact

为了练手,用 react 写了个 v2ex 的首页: 页面地址 项目地址

整个项目基础 react 搭建,样式本来打算用 inlineStyle 来写的,但是发现写起来太累,于是还是用回到 sass,最后用 webpack 来编译。本来想着看能不能直接调用 V 站的 API 来做一个纯前端的首页,所有的数据都用 ajax 来调,但是发现因为跨域的问题,前端无法拿到数据,也就放弃了,最终也只能是一个静态页面。

说一下写代码中遇到的一些问题吧,首先整个项目的文件结构如下:

│  .babelrc
│  .editorconfig
│  .eslintrc
│  .gitignore
│  index.html
│  index.js
│  package.js

为什么要搭这么一套框架

公司 Pc 端以前遗留的项目,都是基于 jekyll+ruby-sass 这一套比较老的技术搭建的。不过 jekyll 的模版继承加上 sass 强大预处理能力,同时配合 Grunt 做任务管理,一切还是很得心应手的。

然而随着项目规模的急剧增大,这一套东西的速度是在是太慢了,一至于后来一旦这个项目有需要求要改我就头疼,倒不是说头疼需求怎么改,而是你随便改一个文件,从 jekyll 检测到改动到编译完 sass 到浏览器自动刷新,基本需要 40+ s,这完全不能接受。

于是一直就打算新搭一套开发环境,刚好前段时间有个新项目,我就拿来操刀动手了,目前已经用它做了俩个项目下来,在原有基础上做了一些修改之后,已经完全可以替代原来那一套懂了。

性能

得益于 node-sass 对 ruby-sass 在编译速度上的碾压以及被 jade 完爆的 jekyll。现在项目中从文件变动=>编译完成=>浏览器自动刷新,整个过程在 1s 左右,可以说速度提升了几十倍。 而且整个过程都是全自动的,无论