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 22 • 9 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
上周买了个 VPS 玩 ,从板瓦工买的,一年的 19 刀。性价比还算合适,这是配置:
10 GB SSD RAID-10 Disk Space
256 MB RAM
500 GB Transfer
Gigabit port
Multiple locations
这是购买链接。
买过来,先是搭了个 SS 解决科学上网的问题。然后想想要不要把博客也迁移过去算了,一个 ss 又用不了多少流量。于是说干就干,一番搜索查询后,达成成就。
简单的记录下操作的步骤:
客户端:
- 配置 ssh
- 本地部署 hexo
服务器:
- 安装所需软件 a. Git b. Nginx
- 为了安全与方便,新建专用与部署 hexo 的用户 git,并给予相应权限。
下午意外的接到了阿里钉钉前端的面试,很是欣喜。 面试内容从做的项目,到使用的技术 Angular、React、Express 等,让我感觉到自己的理解还是不够深刻。 比如我说我喜欢 React,大项目中需要配合 Redux 来用处理数据,然后就问到 Redux 到底解决了哪些问题,我没能清楚的答上来。但是整体上,面试的前面部分,自我感觉还是很不错的。 但是到最后,面试官说问一个比较基础的问题:如何在 HTTP 协议中控制缓存? 我懵了,平时工作中根本接触不到。只能凭自己感觉说,从文件名的更改以及在 HTTP 的 header 中设置相应参数来设置,但具体怎样设置,设置的内容是什么,我完全答不上来。感觉肯定是要挂在这里。不过俗话说的好,人不能在同一个地方跌到两次,谨以此篇记录 HTTP 缓存的相应内容。
概览
HTTP 控制缓存主要有一下几种方式:
- Expires
- Cache-Control
- Last-Modified/If-Modified-Since
- Etag/If-
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 22 • 4 min read • 技术 • JavaScript
用 ES6 重写了 fullpage-light.js。 主要做了一下修改:
- 模块化:将整个文件问个成多个独立的模块,每个模块负责一个功能
- 新语法:替换一些新的语法,比如变量声明的 let,const,Object.assign 等
- 转码:因为目前浏览器还并不支持 ES2015,所以还需要用 Babel 做一下转码
模块化
根据功能,将整个文件分割成为了五个模块。
-bootstrap.js //方法和功能
-constant.js //一些常量
-event.js //绑定的事件
-index.js //入口
-utils.js //工具函数
这样原来一个很大文件就被分割成为了五个独立的模块,每个模块只负责自己的功能就好,维护起来会方便很多。
新语法
手机上键盘弹出时的一些问题
Create at 2016 01 13 • 4 min read • 技术 • JavaScript手机开发ios
做手机商城接到一个需求。 具体大概是这样子的,要求用户点击购买按钮后,直接显示输入密码的弹窗并弹出键盘。 拿到需求一想,这挺简单的。 就麻利的写了个模拟的密码输入框,然后在用户点击购买按钮的时候让他弹出来,并且让焦点 focus 在 input 框上。 Chrome 上一试,完全没问题,觉得自己简直太棒了有没有。可是拿出自己的手机一试,oh no ~,键盘直接把页面给推了上去,导致完全看不到弹窗弹的是个什么东西。 但是在 Android 上是没有任何问题的。观察了下是因为 Android 和 ios 上键盘弹出的行为是不一样的,Android 上键盘弹出来,直接覆盖在原来的页面上,而 ios 上键盘弹出来的时候会直接把整个页面推上去。 怎么解决呢?其实也挺好解决,就是针对不同系统 hack 一下。
购买页面这个弹窗的定位是这么定位的:
// 后面的遮罩
.dialog-wrap {
width: 100
来到杭州
回想一下二月二十八号怀着忐忑的心来到杭州。
那天天还下着大雨,我从机场出来一路大巴加地铁到滨江区。出了地铁站,站口一个三轮师傅一看我拉一个行李箱,明显外地人,隔老远就吆喝,走不走!想想我怎么也是有导航的人,怎么能让你们坑。然后就跟着导航找酒店,结果怎么找也找不到,就在目的地旁边转来转去,问路人也没人听过酒店名,我一度认为是不是订的酒店有问题。最后无奈,又跑回地铁口,掏了二十块上了三轮,结果五分钟就开到了,其实那酒店距离地铁口也就不到一公里,因为下雨视线不好所以我一直找不到。到了酒店,收拾了一下发现行李箱都被雨水打湿了,赶紧打开看了一下,还好,只有基本放在外面的书有点潮,衣服什么的还是干的。洗了个澡,就出去感受这个被誉为人间天堂的陌生城市了。不得不说,杭州城市真的很干净,而且绿化也很好,但是雨真的真的太多了
找房子
到一个新的城市工作,首要的事情就是找房子。说道找房子,不得不说这是一个非常痛苦的过程。
从好友三月初来到杭州开始找房子,找了差不多一星期的时间,最后还是在没办法,两个人第二天都要上班
react-v2ex
Create at 2015 12 26 • 5 min read • 技术 • JavaScriptReact
为了练手,用 react 写了个 v2ex 的首页: 页面地址 项目地址
整个项目基础 react
搭建,样式本来打算用 inlineStyle 来写的,但是发现写起来太累,于是还是用回到 sass
,最后用 webpack
来编译。本来想着看能不能直接调用 V 站的 API 来做一个纯前端的首页,所有的数据都用 ajax 来调,但是发现因为跨域的问题,前端无法拿到数据,也就放弃了,最终也只能是一个静态页面。
说一下写代码中遇到的一些问题吧,首先整个项目的文件结构如下:
│ .babelrc
│ .editorconfig
│ .eslintrc
│ .gitignore
│ index.html
│ index.js
│ package.js
基于 Express+Gulp+BrowserSync 搭建高性能的前端开发环境
Create at 2015 11 03 • 6 min read • 技术 • ExpressJavaScript开发环境
为什么要搭这么一套框架
公司 Pc 端以前遗留的项目,都是基于 jekyll+ruby-sass 这一套比较老的技术搭建的。不过 jekyll 的模版继承加上 sass 强大预处理能力,同时配合 Grunt 做任务管理,一切还是很得心应手的。
然而随着项目规模的急剧增大,这一套东西的速度是在是太慢了,一至于后来一旦这个项目有需要求要改我就头疼,倒不是说头疼需求怎么改,而是你随便改一个文件,从 jekyll 检测到改动到编译完 sass 到浏览器自动刷新,基本需要 40+ s,这完全不能接受。
于是一直就打算新搭一套开发环境,刚好前段时间有个新项目,我就拿来操刀动手了,目前已经用它做了俩个项目下来,在原有基础上做了一些修改之后,已经完全可以替代原来那一套懂了。
性能
得益于 node-sass 对 ruby-sass 在编译速度上的碾压以及被 jade 完爆的 jekyll。现在项目中从文件变动=>编译完成=>浏览器自动刷新,整个过程在 1s 左右,可以说速度提升了几十倍。 而且整个过程都是全自动的,无论