Node.js的特点和优势
- 他是一个JavaScript运行环境
- 依赖于Chrome V8引擎进行代码解析
- 事件驱动(event-driven)
- 非阻塞I/O(输入输出)
- 轻量、可伸缩、使用实时数据交互应用
- 单进程、单线程
Node.js安装
- 网址:https://nodejs.org/zh-cn/
- 一直点next
- 检测 : cmd中 node -v出现版本号
Path&快速体验node.js
// 导入node的核心模块
var http = require("http");
//创建一个web服务器
var server = http.createServer(function(req,res){
// res是一个响应对象,有一个res.end('')向浏览器返回一些文本。
res.end('asdas')
})
// 启动web服务器
// 第一个参数:端口号,
// 第二个参数:ip地址(不写默认本机)
// 第三个参数:服务器启动成功后回调函数
server.listen(3000,'localhost',function(){
console.log('服务器运行在localhost:3000')
});
启动
在cmd中
node 路径\文件名.js
REPL运行环境
在cmd中直接node 开启 Node的REPL环境。
全局变量和模块化作用域
在node中导入模块(文件)
require(‘文件路径/文件名.js’)
- 当模块中的变量用global.变量名时,创建了全局变量,存在全局变量污染,也不知道从哪个模块导出。不建议使用
Node提供的模块化机制
- module:表示一个模块
- require:用来导入模块
- exports和module.exports导出模块中的成员(向外暴露成员)
如 :
1.js:
exports.a = 10;
2.js:
exports.b = 'zcx';
main.js:
var m1 = require('./1.js');
var m2 = require('./2.js');
console.log(m1.a);
console.log(m2.b);
** exports和module.exports区别**
- 在node机制中,向外暴露成员永远都以module.exports指向的成员为准,而exports也是指向module.exports,当exports=111;相当于切断了exports指向module.exports,但是还是以module.exports为准,所以打印为{}。
- module.exports可以单独的定义,返回数据类型,而export只能是返回一个object对象。
module.exports=['劳黑炭','百度经验','module.exports']; //正确
exports=['劳黑炭','百度经验','module.exports']; //报错
全局作用域
// 用来输出当前文件所在绝对路径
console.log(__dirname);
// 用来输出当前文件所在绝对路径。包含名称
console.log(__filename);
node.js的全局函数
函数 | 描述 |
---|---|
setTimeout(cd, ms) | 在指定ms毫秒后执行一次函数cd,只执行一次 ,返回值可作为clearTimeout的参数 |
cleatTimeout(t) | 用于停止之前通过setTimeout()创建的定时器,t是setTimeout()函数创建的计算器 |
setInterval(cd,ms) | 在指定ms毫秒后执行一次cd,可反复执行,返回值可做为可以作为clearInterval的参数 |
clearInterval(t) | 用于停止setInterval函数。参数为setInterval的返回值。 |
setImmedidate(cd) | 用于延迟调用cd函数。cd将在I/O事件回调之后,setTimeout()和setInterval回调之前调用,返回值可以作为clearImmedidate(t)的参数 |
clearImmedidate(t) | 用于停止出发回调函数 |
console对象提供的函数
使用模块化重写计算器
将加减乘除分别写在一个模块中(一人一个文件夹),写一个统一封装的模块index,直接访问index模块。
// 加法模块
module.exports = function(x, y){
return parseInt(x) +parseInt(y);
}
// 封装统一暴露模块
module.exports = {
add:require('./add.js'),
sub:require('./sub.js'),
mul:require('./mul.js'),
div:require('./div.js')
};
//测试模块
// 导入计算器模块
var calc = require('./index.js');
console.log(calc.add(7,8));
console.log(calc.sub(7,8));
console.log(calc.mul(7,8));
console.log(calc.div(7,8));
require的模块加载规则和模块的缓存
- 文件模块:用户自己写的
- 核心模块:node自带的,看node.js的官方文档
文件模块加载规则
- 以路径标识符开头( ./ . / …/ 等)若无后缀名也无同名文件则,书序为–>.js–>.json–>.node 查找
核心模块加载规则
- 以os为模板
var os = require('os');
console.log(os.cpus());
文件的缓存
- 模块多次加载时,先从内存检查是否别加载过,若加载过,从内存中执行,只会执行一次。
- 缓存删除:delete require.cache[‘文件路径’] 将缓存中的文件路径删除
//1.js:
console.log("文件模块加载成功")
----------------------
require('./1');
require('./1');
require('./1');
require('./1');
//1.js:
delete require.cache[__filename];
console.log("文件模块加载成功")
----------------------
require('./1');
require('./1');
require('./1');
require('./1');