2016年11月10日星期四

Google Blog 11/11/2016 (a.m.)

    • 定义错误处理中间件时必须使用这 4 个参数
    • 有些路由方法名不是合规的 JavaScript 变量名,此时使用括号记法
    • app.all() 是一个特殊的路由方法,没有任何 HTTP 方法与其对应
    • 如果在路由句柄中一个方法也不调用,来自客户端的请求会一直挂起
    • 有助于创建模块化的路由,而且减少了代码冗余和拼写错误
    • 可使用 app.route() 创建路由路径的链式路由句柄
    • 所有文件的路径都是相对于存放目录的,因此,存放静态文件的目录名不会出现在 URL 中
    • 如果你的静态资源存放在多个目录下面,你可以多次调用 express.static 中间件
    • 会根据目录添加的顺序查找所需
    • 如果你希望所有通过 express.static 访问的文件都存放在一个“虚拟(virtual)”目录(即目录根本不存在)下面,可以通过为静态资源目录指定一个挂载路径的方式来实现

Posted from Diigo. The rest of my favorite links are here.

Google Blog 11/10/2016 (p.m.)

    • 在ES6之前,社区制定了一些模块加载方案,最主要的有CommonJS和AMD两种。前者用于服务器,后者用于浏览器
    • ES6模块不是对象,而是通过export命令显式指定输出的代码,输入时也采用静态命令的形式

Posted from Diigo. The rest of my favorite links are here.

2016年11月8日星期二

Google Blog 11/09/2016 (a.m.)

      • undefined:表示“未定义”或不存在,即此处目前没有任何值
      •  
      • null:表示空缺,即此处应该有一个值,但目前为空
    • 通常,我们将数值、字符串、布尔值称为原始类型(primitive type)的值
    • 对象称为合成类型(complex type)的值
    • 但本质上,浏览器仍是从服务器获取HTML的内容
      • 2008年的标准WEB应用构成
    • 不是从服务器发送HTML内容,而是只返回数据,数据到HTML的渲染步骤都发生在客户端
      • 2016年后的SPA构成
    • 掌握当前流行的JavaScript技术栈就是赌绝大多数的Web应用可能最终都将把服务器端客户端划分开来
    • ,React推出的命令行工具可以让你完全不必担心配置就初始化好应用
    • 不过React有一款很棒的工具Gatsby,一个React架构的静态站点生成器,可以让你体验React的所有优点

Posted from Diigo. The rest of my favorite links are here.

2016年11月7日星期一

Google Blog 11/07/2016 (p.m.)

Posted from Diigo. The rest of my favorite links are here.

2016年11月5日星期六

Google Blog 11/06/2016 (a.m.)

Posted from Diigo. The rest of my favorite links are here.

2016年11月4日星期五

Google Blog 11/05/2016 (a.m.)

Posted from Diigo. The rest of my favorite links are here.

2016年11月2日星期三

Google Blog 11/02/2016 (p.m.)

    • 如果没有指定其中一个属性则用另一个属性替代
    • 对于从服务器端输出的JSON的key必须用双引号
    • 注意默认传递的参数名称为term
    • 指向一个能返回 JSON 数据的 URL 资源
    • 通过一个 term 字段添加了一个查询字符串,用于服务器端脚本过滤结果
    • 例如,如果 source 选项设置为 "http://example.com",且用户键入了 foo,GET 请求则为 http://example.com?term=foo。数据本身的格式可以与前面描述的本地数据的格式相同
    • 一个 request 对象,带有一个 term 属性
    • 提供单个参数:建议给用户的数据。
    • 用于在请求期间提供自定义 source 回调来处理错误。
    • 当过滤本地数据时,您可以使用内置的 $.ui.autocomplete.escapeRegex 函数。
    • 如果搜索无结果或者禁用了 Autocomplete,导致菜单未显示,该事件一样会被触发

Posted from Diigo. The rest of my favorite links are here.

2016年10月31日星期一

Google Blog 11/01/2016 (a.m.)

Posted from Diigo. The rest of my favorite links are here.

2016年10月30日星期日

Google Blog 10/31/2016 (a.m.)

    • 用来移动文件或者将文件改名
    • 当第二个参数类型是文件时,mv命令完成文件重命名
    • 在跨文件系统移动文件时,mv先拷贝,再将原有文件删除,而链至该文件的链接也将丢失
    • 目标目录在前,源文件在后
    • 该选项适用于移动多个源文件到一个目录的情况
    • -f 这是个危险的选项,使用的时候一定要保持头脑清晰,一般情况下最好不用加上它
      • -force 一般情况不要随便用
    • 如果目录dir2不存在,将目录dir1改名为dir2;否则,将dir1移动到dir2中
    • 移动当前文件夹下的所有文件到上一级目录
      • mv * ../

Posted from Diigo. The rest of my favorite links are here.

Google Blog 10/30/2016 (p.m.)

Posted from Diigo. The rest of my favorite links are here.

2016年10月28日星期五

Google Blog 10/29/2016 (a.m.)

    • 使用which git查看 git 发现位于/usr/bin/git目录下
      • /usr/bin/是系统默认自带的一些套件的存放点
    • /usr/local/git
      • homebrew是存放在这里
    • 建议修改~/.bash_profile,加入以下内容:
      export PATH=/usr/local/bin:/usr/local/sbin:${PATH}
    • 要获取最新的包的列表,首先得更新 Homebrew 自己
    • Mac 的最大优势是 GUI 和命令行的完美结合
    • Shell是Linux/Unix的一个外壳,你理解成衣服也行
    • 它负责外界与Linux内核的交互,接收用户或其他应用程序的命令,然后把这些命令转化成内核能理解的语言,传给内核,内核是真正干活的,干完之后再把结果返回用户或应用程序
    • 能够让你快速上手的zsh项目,叫做「oh my zsh」,Github 网址是:https://github.com/robbyrussell/oh-my-zsh
    • 相关的文件在~/.oh-my-zsh/plugins目录
    • 系统默认加载 git ,你可以在后面追加内容
      • 如果需要新增插件,可以这样做
    • 熟练使用可以大大减少 git 的命令长度,命令内容可以参考~/.oh-my-zsh/plugins/git/git.plugin.zsh
    • autojump:zsh 和 autojump 的组合形成了 zsh 下最强悍的插件
      • 智能跳转(基于autojump)j 目录名(支持模糊匹配和自动补全)d (列出当前会话中访问过的目录列表,输入列表前的序号可以直接跳转)..(跳转到父目录)... (跳转到父目录的父目录)直接输入目录名即可跳转 (省略了cd命令)## 修改默认的shell为zshchsh -s /bin/zsh

Posted from Diigo. The rest of my favorite links are here.

2016年10月27日星期四

Google Blog 10/27/2016 (p.m.)

    • 如果用git diff的时候看到^M字符,就说明两个文件在换行符上有所差别
    • 由于文件多了CR后造成的
    • git config --global core.whitespace cr-at-eol  
      • 可以让git diff的时候忽略换行符的差异
    • 更好的方法是每个项目都有一个.gitattributes文件,里面配好了换行符的设置
  • tags: javascript es6

    • ECMA-262标准的描述如下:“ ECMAScript 可以为不同种类的宿主环境提供核心的脚本编程能力,因此核心的脚本语言时与任何特定的宿主环境分开进行规定的。
      • 为不同种类的宿主环境提供核心脚本编程能力
    • 如果你使用var ,请总是在顶部声明你的变量
      • 最佳实践
    • “暂时性死区”是指从代码块开始直到变量被声明的区域。
    • 始终使用class语法,并避免直接操作 prototype
    • 避免使用空的构造函数。
    • 使用extends内置继承方式来实现继承。

Posted from Diigo. The rest of my favorite links are here.

2016年10月22日星期六

Google Blog 10/23/2016 (a.m.)

    • 加载的时候,浏览器会停止网页渲染,加载文件越多,网页失去响应的时间就会越长
    • 由于js文件之间存在依赖关系,因此必须严格保证加载顺序
    • 当依赖关系很复杂的时候,代码的编写和维护都会变得困难
    • 解决办法有两个,一个是把它放在网页底部加载,另一个是写成下面这样
      • 解决办法二:<script src="js/require.js" async="true" defer></script>
    • data-main属性的作用是,指定网页程序的主模块。
    • require()函数接受两个参数。第一个参数是一个数组,表示所依赖的模块
    • 第二个参数是一个回调函数,当前面指定的模块都加载成功后,它将被调用。加载的模块会以参数形式传入该函数,从而在回调函数内部就可以使用这些模块。
    • 通行的Javascript模块规范共有两种:CommonJSAMD
    • 大家就想要客户端模块。而且最好两者能够兼容,一个模块不用修改,在服务器和浏览器都可以运行
    • 但是,由于一个重大的局限,使得CommonJS规范不适用于浏览器环境
      • 引入的模块可能加载时间过程导致整个Application都停留在那里,在浏览器的环境中经常遇到这个问题,但是在服务器上一般都不是个问题,因为模块就在本地
    • 浏览器端的模块,不能采用"同步加载"(synchronous),只能采用"异步加载"(asynchronous)。这就是AMD规范诞生的背景
    • AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"
    • 所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行
    • AMD比较适合浏览器环境
    • 主要有两个Javascript库实现了AMD规范:require.jscurl.js
    • "污染"了全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间看不出直接关系
      • 原始写法:将不同的函数以及变量简单地放在一起原始写法的缺陷
    • 会暴露所有模块成员,内部状态可以被外部改写
      • 将模块写成一个对象,将所有的模块成员都放在这个对象里面这样的写法缺点是:
    • 使用"立即执行函数"(Immediately-Invoked Function Expression,IIFE),可以达到不暴露私有成员的目的
      • 这种写法可以保证外部的代码无法取得内部的状态变量,从而避免被外部改写
    • 如果一个模块很大,必须分成几个部分,或者一个模块需要继承另一个模块,这时就有必要采用"放大模式"(augmentation)
      • 将模块model1当做参数传入一个IIFE中,就可以对这个模块进行扩展,然后返回一个model1模块
    • 在浏览器环境中,模块的各个部分通常都是从网上获取的,有时无法知道哪个部分会先加载
      • 使用宽方法的原因就是因为模块加载顺序不确定,单纯使用放大模式可能会导致加载了一个空对象其实宽放大模式就是在IIFF函数中设置参数可以是空对象,避免报错
    • 模块内部最好不与程序的其他部分直接交互

Posted from Diigo. The rest of my favorite links are here.

2016年10月21日星期五

Google Blog 10/22/2016 (a.m.)

    • let声明的变量只在它所在的代码块有效
    • 如果使用let,声明的变量仅在块级作用域内有效
    • 上面代码中,变量ilet声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6
      • var a = [];for (var i = 0; i < 10; i++) { a[i] = function () { console.log(i); };}a[6](); // 10
    • let不像var那样会发生“变量提升”现象
      • 我把这章的代码都放到了最新的babel 6.7.7 try it out 里面去转码,并且打开了全部特性,结果发现文中所讲的变量提升和暂时性死区与babel的行为并不相符, 我们需要明确的是现在最终运行的代码还是es5, 没必要死扣规范,建议看的过程中都把文中的es6代码用babel的官方工具去试试,看看最终是怎么转换成es5的,一来可以看看es6到底对es5增强了什么,二来可以避免一些预想不到的错误
    • 只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响
      • 这个问题和变量提升是一样的 我们在ES6/Babel是看不到预想的结果的
    • 在代码块内,使用let命令声明变量之前,该变量都是不可用的

Posted from Diigo. The rest of my favorite links are here.

Google Blog 10/21/2016 (p.m.)

Posted from Diigo. The rest of my favorite links are here.