node官网上的简介
- Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
- Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
- Node.js 的包管理器 npm,是全球最大的开源库生态系统。
模块化,commonJS
特点:
开发初期,需分模块开发,开发效率低。 BUT功能模块一定积累后,开发时降低了程序耦合性,利于后期维护,可复用,降低开发成本
使用:
通过require()函数引入外部模块,可传递一个文件的路径作为参数,如果使用相对路径必须以 . 或 .. 开头
require()引入模块后,该函数返回一个对象,此对象代表的是引入的模块
var md = require("./demo.js");
node中一个js文件就是一个模块,一个js文件中的js代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问。
通过exports向外部暴露变量和方法,将需要暴露的变量或方法设置为exports的属性即可
exports.x=a;
模块类别划分:(标识:require()参数)
1、核心模块
由node引擎提供的模块
核心模块的标识就是模块名字
2、文件模块
由用户自己创建的模块
文件模块的标识就是文件的路径(绝对,相对)
global 全局变量
全局变量在所有模块中均可使用,类似于浏览器中的window对象
在浏览器中,顶层作用域就是全局作用域。这意味着在浏览器中,var something
会定义一个新的全局变量。在 Node.js 中则不同,顶层作用域不是全局作用域,var something
的作用域只在模块内
var a = 0;
b = 1
console.log(global.a); // undefined
console.log(global.b); // 1
*****
证明:一个js文件中的js代码都是独立运行在一个函数中,而不是全局作用域
方法1、
利用arguments(伪数组对象):全局中不会有arguments,若存在则可证明
方法2、 利用arguments.callee(该属性保存当前执行的函数对象)
console.log(arguments.callee); // [Function]
由上图可知,node执行模块中代码时实际是将代码放在了一个函数中:
function (exports, require, module, __filename, __dirname) {
// 执行的代码
}
exports:该对象用来将变量或函数暴露到外部
require:
函数,用来引入外部模块
module:
代表当前模块本身
module.exports == exports
_filename:
当前模块的绝对路径
_dirname:
当前模块所在文件夹的绝对路径
*****
对象堆栈模型
引用数据类型:function object array
exports和module.exports用法区别
exports变量是在模块的文件级别作用域内有效的,它在模块被执行前被赋予module.exports的值。
(exports指向module.exports指向的堆)
通过exports向外暴露内部变量只能用 .
exports .xxx = xxx
通过module.exports向外暴露内部变量,既可以用 . 也可以用 =
module .exports .xxx = xxxx
module .exports = { x : "xxx"}
^^; so,为了避免这些麻烦,都用 module.exports 好了!
包
结构:
-package.json 描述文件
-bin 可执行二进制文件
-lib js代码
-doc 文档
-test 测试单元
NPM
常用命令:https://blog.csdn.net/zsy_snake/article/details/80815673
通过NPM下载的包都放到node_modules文件夹中,直接通过包名引入即可
node使用模块名引入模块时,会首先在当前目录的node_modules中寻找是否含有该模块,如果有直接使 用,如果没有则去上一级目录中寻找,直到找到或寻找到磁盘根目录路仍没有,报错。
Buffer(缓冲区)
官网地址:http://nodejs.cn/api/buffer.html
结构和操作方法与数组类似,数组中不能存储二进制文件,而Buffer专门用来存储二进制数据(无需引入模块 直接使用)。
buffer中的存储都是二进制的形式,但显示时都是以16进制的形式显示,在控制台输出为10进制;每个元素 范围从 00~ff,超过后会自动舍位(二进制)
Buffer的大小一旦确定不可更改,对底层内存的直接操作
将缓冲区中的数据转化为字符串用toString()