1.0什么是nodejs
1.1定义:
Node.js是Javascript除了浏览器之外可以运行的另一个环境(runtime)。可以为我们提供开启服务功能和提供文件读写功能
1.2特点:
1)基于google浏览器的v8引擎
2)事件驱动、非阻塞I/O
3)因为第二个特点,nodejs相比其它的后台语言要高效、轻量。
4)开源并且跨平台。
.net: 闭源,只能在window系统下面运行(非常尴尬)
java: 开源,跨平台
1.3学习网站:
1)nodejs.org
评价:nodejs的官网,主要作用是下载nodejs的版本,以及查看它的帮助文档
2)npmjs.com
评价:nodejs的开源包管理网站,将来如果某些功能在nodejs还不存在,可以直接去npm中找对应的开源包,或者自己有一些好的点子写成了代码,也可以放到npm上(缺点:是一个国外网站,而且是纯英文的)。
淘宝也通过将国外的网站所有包下载下来做了一个克隆版本(镜像地址:https://npm.taobao.org/),这个镜像版本仅仅只是为了提高国内开发人员的下载速度,并不是说它里面的内容是中文的。
3)github.com
评价:全球最大的开源托管库,可以在上面找各种程序的源代码以及分享源文件
4)*.com
评价:全球最大的问答社区
5)google.com
评价:搜索技术文章或者解决程序上的一些问题(一般建议上google)
2.0node的使用:
nodejs运行有两种模式:
1)REPL:交互式运行环境(给开发人员的测试的模式)
在shell中直接输入node敲击回车,会进入REPL模式。可以在这个模式下面自己写一些js代码来测试效果。
REPL环境中的常用指令:
- ctrl + c 两次:退出REPL环境
- ctrl + d 一次:退出REPL环境
- .exit 退出REPL环境
- ↑↓:查看RPEL的历史操作记录
- _: 得到上一次操作的结果
- tab(tab键):查看nodejs中的API
- .save fileName:以js文件的形式将当前REPL会话保存到硬盘中
- .load fileName: 将硬盘中的js文件以REPL的形式读取出来
2)正常开发模式(执行js文件)
使用步骤:
1)写好一个js文件
2)在js文件所在的位置打开powershell,输入指令node fileName.js能得到js的执行结果。
3)也可以在sublime中安装terminal插件(ctrl+shift+p ->package controll:install -->terminal)
案例:用nodejs写一个js文件去执行,再写一个服务器去给大家访问
3.0nodejs的常用API:
1)global对象:
作用:全局对象。类似于javascript中的window对象
什么是全局对象:在nodejs中,所有的js都有运行在node环境下的,在这个环境中可以直接使 用很多方法和属性,而管理这些方法和属性的对象就叫做全局对象。
golbal中的方法和属性:
1. global.setTimeout(function(){},time);
//异步执行的方法
2. global.setImmeditate(function(){})
//异步执行的方法(优先级要高于setTimeout)
对比:process.nextTick(function(){});//异步执行的另一个方法(优先级比上面两个都高)
总结:三个方法都是异步执行的代码,如果同时放在一起,nextTick优先级最高,setImmediate其次,setTimeout最低。常用的是setTimeout.
全局对象中的方法在任何js文件中都可以直接使用,不需要通过require方法再单独导包。而其它非全局对象中的方法如果要使用的话需要导包(如:要使用http中的方法需要require('http'))
3. __dirName:得到当前文件所在的路径(这个属性虽然是列在全局对象,但是它得到的却是具体某个js文件中的路径,也就是说每个文件都有一个。每个文件中都有的对象我们把他叫做伪全局对象)
对比:process.cwd:得到当前文件的执行路径:执行路径与文件所在路径不一样
4. __fileName: 得到当前文件的全路径(物理路径+文件名),它与__dirName一样,也是一个伪全局对象。
5. process对象:
process.abort()//立即结束js代码的运行,下面的代码不再执行
process.arch() //得到当前运行环境所在平台
porcess.argv() //得到当前文件的执行参数
返回值为一个数组,数组中的第一个值,第二个值为默认值,分别为当前repl环境的执行进程,以及当前node执行的js文件的绝对路径(__fileName)
如果将来执行js文件的时候手动传入了参数,那么这些参数会按顺序被添加到argv的数组中。
应用:写一个命令行版的小型计算器
process.env //得到当前操作系统中环境变量
应用:用于区别生产环境和正式环境(通过执行时传入set 变量值=变量名 && node 运行程序来执行。注意:powershell中不认识&&指令,必须要去cmd中执行)
process.stdout.write()//输出内容
console.log的底层其实就是通过这个方法来输出的。
process.stdout.write输出的只能是字符串,并且不带换行
应用:使用这个方法完成命令行的小动画
process.stdin //监控输入的对象
process.stdin.on('readable',function(){})//当输入内容敲击回车时会触发这个事件中的回调函数
process.stdin.read();
得到在输入回车前输入的内容(以二进制的形式得到的,如果直接输出会以buffer数组的形式输出,toString以后才会转为字符串)
2) root对象
这个对象与global对象是一样的都是一个全局函数(可以理解为root是global的别名)
小练习:在不引入其它的文件的基础上在一个文件中引入另一个文件中的变量
注意点: 在REPL环境中定义的所有的变量都会加载到全局对象中,在单个js文件的中定义的变量,只要不是定义在全局对象上,是不会加载到全局环境中。