Node was installed at
/usr/local/bin/node
npm was installed at
/usr/local/bin/npm
Make sure that /usr/local/bin is in your $PATH.
node:硬件V8,软件语言JS。
异步I/O:效率提高,使用回调函数。
node是高性能的单线程的跨平台的。适合I/O(异步)密集和cpu密集型场景(V8)。
B/S ,C/S:联系阿里思考。
使用require()方法引入模块,模块标识:小驼峰字符串或者以·或··开头的相对路径,或者/开头的绝对路径。模块:核心模块,文件模块。
文件模块:路径分析,文件定位,编译执行。
对于核心模块:不用文件定位和编译执行,在node源代码编译已经完。而且对于任何模块都有一个相当于是浏览器缓存的概念。
优先级:缓存》核心》路径》自定义模块
文件定位:可以不要扩展名。
编译的时候对于不同类型的文件编译方式不一样。.js,.json,.node三种,其他文件当做.js处理。
require,exports,module三个关键字!
http://blog.csdn.net/cike110120/article/details/12753253
http://www.2cto.com/kf/201401/274825.html
然后是不同语言的编译:JS,C/C++。
JS:node会对代码进行包装,加上必须要的一些属性,所以也就造成了exports和module.exports共存的情况,实际上两者的值大多数情况是相同的。
c++执行效率更高,但是编程门槛高,这里不多做介绍。
json文件最简单,json.parse一个方法即可。
JS代码:首先是转化为C++代码,然后编译JS核心模块。node的常见方式之一就是C++完成核心,JS实现封装。node这种复合模式的优势得到体现。node的核心内建模块都是由C++编写的。内建模块(C++)——→核心模块(JS)—→文件模块(用户自定义)
C++在运算方面的效率比JS效率高太多了,所以我们很多时候需要写C++扩展模块.node文件,值得注意的是,各个平台下的.node文件编译出来是不一样的,需要重新编译。P28页图是不同平台的详细编译过程。
C++扩展工具:GYP项目生成工具,V8引擎C++库,libuv库,node内部库。
接下来是第三方模块,包和NPM是将各种模块联系在一起的一种机制。PS:require是这之中很关键的方法。包就是一个存档文件,里面有关于这个包得各种信息。这里不想追究太深。NPM可以理解为node的一种工具,gem和ruby,pear和php一样的关系。目前NPM已经是一个共享平台。到这里NODE规范就不看啦。
异步I/O:产生的原因就是比如PHP这种同步阻塞的语言在复杂的环境中不能很好的并发,用户体验就不好了。从M+N到max(M,N)的进化,有一句话,只有后端快速响应,前端体验才能更好。
一个关键词:轮询。
轮询的方式:
read→select→poll→epoll
linux原生:AIO支持面太小,不能利用系统缓存。
NODE的异步I/O的实现:事件循环,tick,观察者。类比与饭馆的流程:厨房,服务员,客户。
windows:IOCP,请求对象,
一些异步API:setTimeout,setInterval,setImmediate和process.nextTick
异步编程:函数式编程:高阶函数:把别的函数作为自己函数的参数类似于f(f(x)).
偏函数用法。
优点:异步,V8基础上性能十分优越。
缺点:
1,异常处理上,由于是异步的,所以在出现异常的情况下,难以解决,这里有两个原则,
1,必须执行调用者传入的回调函数。2,正确传递回异常供调用者判断。
2,函数嵌套过深。
3,阻塞代码
4,多线程编程
5,异步转同步。
4.3解决方案:为了解决上面的五个问题,下面介绍一些解决方案。
1事件监听模式:events模块,监听模式本身没有异步同步的问题,只是发布调用多是伴随事件循环异步触发,所以广泛应用于异步编程。