什么是nodejs
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
tips:nodejs不是一个框架,也不是一门编程语言。
nodejs的作用
- nodejs一般用于服务器开发。解决和创建高性能的网络应用程序,这里就不得不提到nodejs的几个特点了。
- 事件驱动
- 简单的来说就是有事情触发在执行,如果你学习过java,那么你或多或少会知道观察者模式,nodejs就相当于观察者模式。
由于JavaScript是单线程的,利用事件轮询、任务队列的异步操作来执行。生动的说就像有一个死循环,当有事物触发循环中的某个条件时,再执行该条件对应的逻辑。
- 简单的来说就是有事情触发在执行,如果你学习过java,那么你或多或少会知道观察者模式,nodejs就相当于观察者模式。
- 非阻塞 IO(异步) 模型
- 了解JavaScript就一定知道异步操作,回调函数这是JavaScript语言的一种特性。tips:es6 promise链式编程者的福音。
- 单线程
- 这个没得说JavaScript本生就是单线程。
- 跨平台
- 只要有node环境就能运行node程序了。
- 事件驱动
- 命令行工具
- 爬虫
- ......
nodejs的发展历史
-
node之父是Ryan Dahl
tips: 现在去搞
go
了- 2009年,Ryan Dahl发布了最初的 Node 版本
- 2010年,Ryan Dahl 全职负责 Node 的发展
- 2011年,Node 在微软的支持下发布了 Windows 版
- 2012年,Ryan Dahl 将node转交给了 Isaac Z.Schlueter
- 2015年,Node 与 io.js 合并,Node 的版本从 0.12.7 升级到了 4.0.0
- 合并后的 io.js 和 Node 在 Joyent 公司的维护下并行了两个版本:
- 一个是4.x.x 还是原来的 Node,这个版本是稳定版
- 一个是5.x.x,目前已经更新到了 6.8.1,其实就是 io.js,最新特性版,不建议生产环境使用
- Node 计划在 2016 年 10月底正式发布 Node 7.0
- 7.0 已经最大限度的支持了很多的 ES6 新语法
- 而且提高了整体的执行性能,提供了一些别的API
tips:要学就用最新版本
安装node环境
- 下载后一直点下一步,下一步就能安装成功
- 安装成功后打开命令行输入
node --version
,能显示相应的版本表示安装成功。
- 安装成功后打开命令行输入
这时候我们可以试试nodejs的作用,你可以直接在命令行输入node
,这就相当于一个编写页一样,你可以试着写console.log('hello')
,回车控制台输出 hello。
-
其实
node
不仅可以跟命令还可以接js文件执行- 你可以将代码写到文件中,
node hello.js
也是同样的效果,前提是你当前路径必须包含此文件,不然报错
- 你可以将代码写到文件中,
-
common.js
- nodejs是采用了commonJS规范的。
- 为什么会有这个规范呢,因为
JavaScript
天生就不支持模块化。还没有块级作用域。
- 为什么会有这个规范呢,因为
本java程序员表示非常不解。
* 所以浏览器的JavaScript和node中的JavaScript不是一样的。
+ nodejs的模块化
* nodejs中使用require
关键字来加载模块,使用exports
来导出模块。
* nodejs中内置了一些核心模块,我们可以使用fs这个读写文件的模块来简单了解nodejs。 - nodejs是采用了commonJS规范的。
//引入fs模块
var fs = require('fs');
//假设我要读取一个名字问hello.txt的文件
fs.readFile('./hello.txt',function (err, data) {
//如果读取失败
if (err) {
console.log('读取文件失败!');
return;
}
console.log(data);
})
这是一个简单的异步的读取文件
其实fs模块还有写文件等功能,这里就不一一说明。
- 我们可以了解到
var fs = require('fs');
可以引入一个核心模块,它也可以引入一个第三方模块,还可以引入自己写的模块。- 假设我有个模块叫hello.js那么它就是这样。
//后缀的.js可以省略,也可以不省,随你的性子来,但是99%人都省了所以.... var hello = require('./hello');
- 加载的时候会执行hello.js内的所有代码。但是如果hello.js中没有
exports
的话那这个hello就是空的。
- nodejs中的模块导出。
- 你可以这样写hello.js来返回内容
exports.say = function () { console.log('hello'); }
- 那么调用这个模块的人就可以这样用
var hello = require('./hello'); hello.say();
- 这是导出一个say,当然你也可以导出任何js支持的数据格式
- 但是这不是单个成员的时候
var num = 1; exports.num = num; exports.fun = function () { } //........
exports我们不导出单个成员时能这么写,导出单个成员就不能这么写了。
- exports的导出原理
- 其实可以这样理解
- 很简单我相信你一看代码就懂了
//相当于每个模块最前方有这几句代码
var module = {
exports:{}
}
// 模块中同时还有一个成员 exports 等价于 module.exports
var exports = module.exports;
/**
* 你写的代码其实都在这里,懂了吗?
* 其实实际返回的是module.exports。exports只是module.exports的简写。
* 当exports=时引用地址变了,而module.exports的引用地址没有改变。
* 实际返回的是module.exports
**/
return module.exports;
+ 所以要返回单个成员必须这样
```javascript
module.exports = xx;
```
ok,今天就写到这。
网友评论