Node.js学习笔记
Node的重要特性
- 单线程
- 异步
- 事件回调
- 在Node里面路径都是假的,他就是个WEB容器。他找的路径可能是一个文件夹也可能是一个文件
Node的安装
- 从官网上现在Node,然后安装
- 然后打开webstrom里面的setting搜索node
- 最后配置路径和属性
(一)Node的模块使用和加载机制
var a = 100;
console.log(a); //100
console.log(global.a); //undefined 这是因为这个a是定义在模块下面的变量,不属于全局变量
(i)全局变量和什么是模块
在NODE里面全局变量不是window了而是global
一个文件就是一个模块,同时每个模块都有自己的作用域.
我们用var声明的变量并不是全局的而是属于当前模块下面的
var a = 100;
console.log(a); // 100
global.a = 200;
console.log(a); //还是100
console.log(global.a) //则是200
一些看似全局其实属于当前模块的变量
__filename 当前文件被解析后的绝对路径,其实这个变量是属于当前模块的(即属于每一个文件的)
console.log(__filename);
(ii)模块加载机制-require方法
require("模块路径");
require("./2.js");
require方法中的路径可以填写相对路径和绝对路径
当前模块在硬盘中的绝对路径
- require('D:\phpStudy\WWW\Node\index.js'); //没问题(绝对路径)
- require('./2.js');这里千万注意的是不能写成require('2.js')因为他会加载Node的核心模块也就是从node_models里面找
- 所以要是加载自己写的模块,必须找到父级目录然后在获取同级。
模块的文件查找机制:
- 首先按照加载的模块文件名进行查找->如果没找到,会自动在模块文件名称后面加上.js文件进行查找
- 要是还没找到,则会在文件名称后面加上.json的后缀进行查找
- 要是在没有找到则会在文件名称后面加上.node后缀进行查找。
- 要是在没有找到则直接弹出错误.
模块之间想调用变量怎么办?
- 在一个模块中通过var定义的变量,其作用域范围是当前模块,外部模块不能直接访问。如果一个模块访问另一个模块定义的变量有2种办法
- 方法一:(不推荐)把变量作为global对象的一个属性,这样就变成全局变量
当前模块是4(4.js)
在模块5种为global对象添加一个属性global.a = 100;
require('./5.js');
console.log(a); //100
- 方法二:使用一个模块对象module对象(也是模块作用域下的,而不是全局的)
- module保存并提供与当前模块相关的一些信息(可以用console.log(module))把他打印出来
- 在module对象里面有一个子对象就是exports我们可以通过这个对象把一个模块中的局部变量对象进行对外提供访问
模块5
var a = 100;
module.exports.a = a;
模块4
//require('./5.js') 返回值就是被加载模块当中的exports
var m5 = require('./5.js');
console.log(m5.a); //100;
exports与module.exports区别
exports 用于变量,方法不需要使用new对象的
module.exports.适用于new一个对象。这样新的加载页面可以new一个对象
var People = require("./People.js");
var xiaoming = new People("小明");
console.log(xiaoming.name);
- 在模块作用域内,还有一个内置的模块对象--exports--它其实就是module.exports
5模块
var a =100;
console.log(module.exports === exports); //true;
exports.a = a;
- exports与module.exorts指向相同,在使用的时候,尽量不要破坏两者的指向关系
module.exports = [1,2,3]; //直接这样对module.exports进行操作,这时候exports与module.exports的指向关系已经断开了
exports.a = 200; //这个时候这个a已经加不到module.exports中了,所以其他模块中引用它也引用不到了,因为这个模块的值已经变成[1,2,3]