Node 学习笔记
一 Node 基础
- node 执行外部js 文件, cd 到所在文件夹, node hello.js ;
- 文件路径复杂, 可以在文件路径拦输入: cmd , 直接打开终端并带有路径;
- Node 是js 编写, 最初是为了高性能web服务器
二 模块化
- Node中, 一个js 文件就是一个模块,, 每一个js文件都是独立运行在一个函数中,不是全局作用域,一个模块中的变量喝函数在其他模块中无法访问
- ES5 有模块化, ES5 没有模块化系统,ES6 有模块化系统
- 引入外部模块: require()函数 , 传递路径作为参数, 必须以 ./ 或 …/ 开头, 该函数会返回一个对象, 这个对象代表引入的模块; module.js 的 .js 可以省略
var md = require( ' ../module.js ' )
- 向外暴露属性或方法 exports
exports.x = '我是01module.js 中的 X '
exports.Y = '我是01module.js 中的 Y '
exports.fn= function(){ }
- 模块分为核心模块和文件模块。引入外部模块时,核心模块(npm,node提供)直接引入名字就好, 不需要写路径; 文件模块: 由用户创建的模块,文件模块的标识就是文件的路径(绝对路径, 相对路径)
- 在node 中有一个全局对象,作用和网页中的window类似, 在全局中创建的变量都会global的属性保存; 在全局中创建的函数都会作为global的方法保存;
- 怎么证明每一个js文件都是独立运行在一个函数中
当node 执行模块中的代码时,
会首先在代码的最顶部,添加如下代码
function(exports,require,module,_filename,_dirname){
代码的最顶部,添加如下代码
}
实际上模块中的代码都是包装在一个函数中执行的, 并且在函数执行时, 同时传递进来了5个实参:
exports
- 该对象用来将变量和函数暴露到外部
require
- 是一个函数, 用来引入外部的模块
module
- module代表当前模块本身
- exports 就是module的属性
- 既可以使用exports 导出, 也可以使用module.exports导出 ; module.exports === exports
_filename
- 当前模块的完整路径
- ../hello/hello.js
_dirname
- 当前模块所在文件夹的完整路径
- ../ hello
怎么证明js 文件中的a 不是全局变量
var a = 10;
console.log(global.a).
此时a 不是全局变量
------------------------------
怎么让a 全局变量
a = 10 ;
console.log(global.a)
此时a 是全局变量
------------------------------
怎么证明每一个js文件都是独立运行在一个函数中,在js 文件中打印形参:
console.log(arguments)
arguments.callee 属性保存的是当前执行的函数对象
console.log(arguments.callee)
- module.exports 和 exports ,本质上是一个对象, 但是通过 exports 只能使用 . 的方式 向外暴露内部变量;module .exports 既可以通过 . 的形式, 也可以直接赋值。栈内存 和堆内存,基本数据类型保存在栈内存,引用类型放在堆内存
- 这样可以,在修改对象
module.exports = {
name:'' 孙悟空 "
}
- 这样不行,在改变量
exports ={
name:" 孙悟空 "
}
- 包结构:
package.json --整体描述文件(必不可少);
bin: --可执行二进制文件;
lib: --库, js代码 ;
doc: --文档-功能性的说明;
test: --单元测试;
- json 文件不能写注释
- NPM (node package manager)
npm -v 查看npm版本
npm version 查看所有模块版本
npm search 包名 搜索包
npm install / i 包名 安装包
npm remove / r 包名 删除包
npm install 包名 --save 安装包 并添加到依赖中 ****
npm install 下载当前项目所依赖的包
npm install 包名 -g 全局安装 -- 全局安装的包一般都是一些工具
- CNPM
npm install -g cnpm --registry-https://register.npm.taobao.org
-
Node 在使用模块名字(核心模块)来引入模块时, 他会首先在当前目录的node_modules中寻找是否含有该模块;如果有就使用, 如果没有则去上一级目录寻找;如果有则直接使用, 如果没有则再去上一级寻找,直到找到为止;知道找到磁盘的根目录, 如果依然没有, 报错;
-
Buffer(缓冲区) 结构和数组很像,操作的方法和数组也很类似,数组中不能存储二进制文件, buffer就是用来存储二进制数据;使用buffer不需要引入模块, 直接使用即可;在buffer中存储的都是二进制数据,但是显示时, 都是16进制显示;buffer中每一个元素的范围: 00-ff,十进制:0-255,00000000-11111111; 计算机中,一个0,或一个1 ,我们称为一位 (1bit); 8bit = 1btye(z字节);1024byte = 1kb, 1024kb = 1mb ; buffer 中的一个元素占用内存1字节;一个英文字母1字节, 1个汉字3个字节;
buffer的长度不可以修改 ,是对底层内存的分配;只要数字在页面或者控制台输出就是十进制,除非转换成其他类型 toString(16)
-
file system (文件系统)通过node操作系统中的文件,使用fs 需要先引入fs;fs 核心模块直接引入, 不用下载;fs 中的两种方法:同步和异步;同步会阻塞程序运行,只有在运行完成,才会继续向下执行; 异步不会阻塞, 执行完成后会通过回调函数返回;
-
简单文件写入
-
流式文件写入 ; 可写流 ; 同步异步简单文件写入都不适合打文件写入,性能较差,容易导致内存溢出
-
流式文件读取
流式文件读取适用于大文件
简单方式: pipe
-
fs 的其他方法
21.