新起点-2018

image

2017年,这一年经历了太多的坎坷与不顺,面对铺天盖地的打击,从一开始的失落,一步一步把挫折当成一种习惯,可以说这一年是在跟自己作斗争。虽然到现在还没有完全走出挫折留下的阴影,但我坚信,终有一天会阳光普照,春暖花开!

回顾2017年,自己所做的事:

  • 创建自己的博客
  • 深入学习JavaScript核心知识
  • 学习物联网相关技术
  • 坚持听得到app的相关内容(确实提高了我的认知)

2018年,也给自己定个小目标:

  • 继续深入学习JavaScript核心技术
  • 以分享技术的形式,巩固理论知识
  • 英语,我的老大难,每天坚持翻译英文资料(哪怕只有一句)
  • 参加开源项目,提升自己
阅读更多

理解HTTP之Content-Type

About

查看 Restful API 报头插件:Chrome 插件 REST Console,以及发送 Restful API 工具:Chrome 插件 POST Man

在 HTTP 1.1 规范中,HTTP 请求方式有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT

通常我们用的只有 GET、POST,然而对于 Restful API 规范来说,请求资源要用 PUT 方法,删除资源要用 DELETE 方法。

例如发送个 DELETE 包:

http://example.com/my/resource?id=12345

阅读更多

深入理解JavaScript系列—全面解析Module模式

简介

Module模式是JavaScript编程中一个非常通用的模式,一般情况下,大家都知道基本用法,本文尝试着给大家更多该模式的高级用法。

首先我们来看看Module模式的基本特征:

  1. 模块化,可重用
  2. 分装了变量和函数,和全局的namespace不接触,松耦合
  3. 只暴露可用public的方法,其他私有方法全部隐藏

关于Module模式,最早是由YUI的成员Eric Miraglia在4年前提出了这个概念,我们将从一个简单的例子来解释一下基本的用法(如果你已经非常熟悉了,请忽略这一节)。

基本用法

阅读更多

深入理解JavaScript系列—编写高质量JavaScript代码的基本要点

良好的代码编写习惯,是减少bug,以及提升代码的可读性、扩展性都是非常有效的,这系列是在看汤姆大叔深入理解JavaScript系列做的一下总结。

书写可维护的代码(Writing Maintainable Code)

修改bug的代价是沉重的,随着时间的推移,这代价也会随之加重,要想了解历史遗留的某个bug你需要:

  • 花时间学习和理解这个问题
  • 花时间了解怎么解决这个问题

还有,对于大项目来说,修复bug和写代码的不是同一个人,这代价可想而知,谁都想学习新技能,有谁愿意一直围着一堆bug,因此可维护代码是非常有必要的,可维护代码意味着:

  • 可读性
  • 一致性
  • 可预测性
  • 看上去想一个人写的
阅读更多

Node.js module.exports与exports

折腾Node.js有些日子了,下面将陆陆续续记录下使用Node.js的一些细节。

熟悉Node.js的童鞋都知道,Node.js作为服务器端的javascript运行环境,它使用npm作为通用的包管理工具,npm遵循CommonJS规范定义了一套用于Node.js模块的约定,关于npm实现Node.js模块的更多细节请细读深入Node.js的模块机制,这里简单讲下书写Node.js代码时module.exportsexports的区别。

在浏览器端js里面,为了解决各模块变量冲突等问题,往往借助于js的闭包把所有模块相关的代码都包装在一个匿名函数里。而Node.js编写模块相当的自由,开发者只需要关注requireexportsmodule等几个变量就足够,而为了保持模块的可读性,很推荐把不同功能的代码块都写成独立模块,减少各模块耦合。开发者可以在“全局”环境下任意使用var申明变量(不用写到闭包里了),通过exports暴露接口给调用者。
我们经常看到类似export.xxx = yyy或者module.exports = xx这样的代码,可实际在通过require函数引入模块时会出现报错的情况,这是什么原因导致的呢?

Node.js在模块编译的过程中会对模块进行包装,最终会返回类似下面的代码:

1
2
3
(function (exports, require, module, __filename, __dirname) {
// module code...
});

其中,module就是这个模块本身,require是对Node.js实现查找模块的模块Module._load实例的引用,filename和dirname是Node.js在查找该模块后找到的模块名称和模块绝对路径,这就是官方API里头这两个全局变量的来历。
关于module.exportsexports的区别,了解了下面几点之后应该就完全明白:

阅读更多

git 使用规范流程

团队开发,需要遵循一个 git 使用规范,方便项目的协调和维护。

git 操作需遵循以下步骤:

  • 新建分支
  • 提交分支 commit
  • 编写提交信息
  • 与主干同步
  • 合并 commit
  • 推送到远程仓库
  • 发出 Pull Request

新建分支

每次开发新功能都应该新建一个单独的分支。

1
2
3
4
5
6
# 获取主干最新代码
$ git checkout master
$ git pull

# 新建一个开发分支myfeature
$ git checkout -b myfeature
阅读更多

nginx-proxy 使用说明

这是使用 docker-gen 自动化的 Docker 容器的 nginx 代理,减少手动配置 nginx。

GitHub 地址里面有具体的使用教程。

我的项目使用 docker 部署并使用 nginx-proxy 做的反向代理,在使用过程中碰到两个问题:

  • 如何在 nginx-proxy 中使用 SSL
  • 在代理多个 nginx 项目的情况下,如何对指定的项目进行 https 访问

我在阿里云 CA 证书中心给我的域名 申请了免费版的 SSL https://rnode.me,该证书针对单域名有效,因此我只希望我的主域名通过 https 访问,其他二级域名通过 http 访问。

现在针对以上两个问题做个总结。

阅读更多

react native系列——环境搭建

安装步骤参考reactnative.cn,由于window环境下安装比较麻烦,下面我将进行逐步安装。
根据reactnative.cn的提示第一步安装Chocolatey工具,不知道什么原因安装失败了,如图:

Chocolatey只是一个包管理器,其安装的目的就是为了很方便的安装必备软件(python2、node),安装失败的同学,我们手动安装。

python 安装及配置

  1. 下载地址

  2. 开始安装……安装成功如下:

  3. 配置环境变量

  4. 验证

node 安装及配置

  1. 下载地址
  2. 开始安装……安装成功如下:
  3. 验证

安装完node后建议设置npm镜像以加速后面的过程(或使用科学上网工具)。注意:不要使用cnpm!cnpm安装的模块路径比较奇怪,packager不能正常识别!

1
2
npm config set registry https://registry.npm.taobao.org --global
npm config set disturl https://npm.taobao.org/dist --global

阅读更多

react native系列——介绍

react native是什么?

来自百度百科的介绍

React Native (简称RN)是Facebook于2015年4月开源的跨平台移动应用开发框架,是Facebook早先开源的UI框架 React 在原生移动应用平台的衍生产物,目前支持iOS和安卓两大平台。RN使用Javascript语言,类似于HTML的JSX,以及CSS来开发移动应用,因此熟悉Web前端开发的技术人员只需很少的学习就可以进入移动应用开发领域。

react native能干什么?

React Native使你能够在Javascript和React的基础上获得完全一致的开发体验,构建世界一流的原生APP。

React Native着力于提高多平台开发的开发效率 —— 仅需学习一次,编写任何平台。(Learn once, write anywhere)

阅读更多

package.json中^符号的含义

版本号 x.y.z :其中z 表示一些小的bugfix, 更改z的号,

y表示一些大的版本更改,比如一些API的变化

x表示一些设计的变动及模块的重构之类的,会升级x版本号

在package.json里面dependencies依赖包的版本号前面的符号有两种,一种是~,一种是^。

~,^的区别是:
~的意思是匹配最近的小版本 比如~1.2.3将会匹配所有的1.2.x版本,但不匹配1.3.0, 1.2.0 <= ~1.2.3 <1.3.0
^的意思是最近的一个大版本 比如^1.2.3 将会匹配 所有 1.x.x 包括1.3.0 但不包括2.0 1.0.0 <= ^1.2.3 < 1.x.x