模块化
每一个js文件 都是一个模块
使用require("")来导入模块()中写入地址,tips必须以./或…/开头 例如
require("./node.js");
require("./node");
///.js可以省略
闭包
在node中,每一个JS文件中的JS代码都是独立运行在一个函数中,并不是全局。
(相当于自调用的函数)
一个模块中的函数和
变量在其他模块中无法访问
可以通过exports 向外部暴露变量和方法
只需要想要暴露的变量或方法 只是为exports属性就行
exports.x = "我是ZLX";
exports.fun = function(){
//xxxx
};
不要随意向全局写变量,会污染空间
模块标识
路径就是一种标识,模块分为核心模块和文件模块
- 核心模块:node引擎提供的模块 ,核心模块的标识 就是模块名字
核心模块写名字 不用写路径
var fs = require("fs");
//fs 是核心模块
- 文件模块:由用户自己创建
全局变量
在node中有一个全局对象 global,作用和网页中的window类似
在全局中创建的变量都会作为global的属性保存
在全局中创建的函数都会作为global的方法保存
a = 10; //不加var 就是全局变量
var b = 20; //默认为局部变量 ,闭包
console.log(global.a); //不会报错
console.log(global.b); //报错
node是在一个函数里运行
当node在执行模块中的代码时,会在代码顶部添加
///开头
function(exports, require,module,__filename,__dirname){
在结尾添加
///结尾
}
其实就是把模块里的代码全都包装在一个函数中运行,并且在函数执行的时候,传入了五个实参
- exports 该对象用来将变量或函数暴露到外边
- require 函数,用来引入外部的模块
- module 指模块本身
exports 就是module的属性
既可以用exports导出,也可以用module.exports导出 - __filename 当前模块的完整路径
- __dirname 当前模块的所在的文件夹路径
直接赋值一个对象
module.exports = {
name:"猪八戒",
age:28,
sayname:function(){
pass;
}
};
exports 和Module.exports
通过exports只能使用 . 的方式来向外暴露内部变量
而 module.exports 既可以通过 . 的形式 也可以直接赋值
对象在堆内存中储存 引用
var obj = new object();
obj.name = "孙悟空";
var obj2 = obj;
console.log("obj = " + obj.name);
console.log("obj2 = " + obj2.name);
//孙悟空
//孙悟空
obj2.name = "猪八戒";
console.log("obj = " + obj.name);
console.log("obj2 = " + obj2.name);
//猪八戒
//猪八戒
包 package
包实际上就是一个压缩文件
- package.json 必备 描述文件
- bin 可执行的二进制文件
- lib js代码
- doc 文档
- test 单元测试
NPM (Node Package Manager)
npm帮助其完成了第三方模块的发布、安装和依赖等。借助NPM,Node与第三方模块之间形成了很好的一个生态系统。
安装Node 自带NPM
npm search 包名
npm install 包名
目录下最好创建package.json文件
npm init
可以自动创建package.json- 会装在node_modules文件夹中
npm install 包名 -g
全局安装 (全局安装的包一般都是一些工具,都是计算机里用到的 不是项目的)npm remove 包名
删除包npm install 包名 --save
安装并添加到依赖 可以自主修改package.json文件npm install
安装当前项目依赖的全部包
缓冲区
Buffer 的结构跟数组很像,操作方法也和数组很类似,数组不能存储二进制数据,buffer专门存储二进制文件
var str = "Hello Atguigu";
var buf = Buffer.from(str);
console.log(buf); //buffer 48 55 6c 6c 6f 20 41 74 67 75 69 67 75
//buffer 存储的都是二进制数据
buffer中每一个元素的范围是从00 - ff ; 0 - 255
一个元素占用一个字节 1byte
buf.length
占用内存大小
str.length
字符串长度
unicode 一个汉字三个字节
utf-8 一个汉字两个字节
var buf2 = Buffer.alloc(10)
创建一个10字节的缓冲区
buf2[0] = 88
buf2[1] = 255
buffer 大小一旦确定,不可修改 ,是对底层的修改
fs 文件系统 file system
通过Node操作系统文件
//fs 是核心模块 直接引入名字
var fs = require("fs");
//fs中同步方法(sync)和异步方法。同步会阻塞程序执行,除非执行完毕。异步不会阻塞 通过回调函数将结果返回
同步文件写入
-
打开文件
fs.openSync(path, flags[, mode] )
var fd = fs.openSync(“hello.txt”,“w”)
//path 要打开文件的路径
//flags 打开文件要做的类型
//r 只读
//w 可写
mode 设置文件的操作权限,一般不传
-
向文件写入内容
fs.wirteSync(fd, string[ , position[ , encoding]])
fs.wirteSync(fd , “今天天气真不错”)
fs.wirteSync(fd , “今天天气真不错”,num) //从num的位置开始写
encoding 写入的编码,默认utf-8
-
关闭文件
fs.closeSync(fd);
fs.closeSync(fd);
异步文件写入
fs.open(path ,flags[, mode], callback) // callback 回调函数
回调函数 参数
- err 错误对象 如果没有
- fd
var fs = require("fs");
fs.open ("hello2.txt","w",function(err,fd){
console.log("回调函数中的代码~~");
if(!err){
///如果没有出错 则对文件进行写入操作
fs.write(fd,"异步写入的文字",function(err){
if(!err){
console.log("写入成功~");
//关闭文件
fs.close(fd, function(err){
if(!err){
console.log("文件已关闭~");
}
});
}
});
}else{
console.log(err);
}
});
//关闭文件
简单文件写入
var fs = require("fs");
///直接写路径也可以c:/desktop/hello3.txt
fs.wirteFile("hello3.txt","这是要写入的内容",{flag:"w"},function(err){ //flag可以不写,w会全覆盖 ,a可以追加(继续写,不覆盖)
if(!err){
console.log("写入成功~");
}
});
流式文件写入
同步、异步、简单文件写入都不适合大文件,性能较差,容易导致内存溢出
var fs = require("fs");
//流式文件写入
//创建一个可写流
//fs.creatWriteStream(path[,options])
var ws = fs.creatWriteStream("hello3.txt");
//可以通过监听流的open 和 close 事件来监听流的打开和关闭
//on 持续绑定,once 绑定一次性,触发一次自动失效
ws.once("open",function{
console.log("水龙头被打开~")
})
ws.once("close",function{
console.log("水龙头被关闭~")
})
ws.write("通过可写流写入文件内容");
ws.end(); //end()关闭源头,已经进入水管的不会消失 close()拔出水管,水管中的也会消失
//可以通过监听流的open 和 close 事件来监听流的打开和关闭
简单文件的读取
fs.readFile(path[,options],callback)
var fs = require("fs");
fs.readFile("hello.txt",function(err,data ){
if(!err){
console.log(err);
//data 是一个buffer 关于hello.txt的二进制
fs.writeFile("hello.jpg",data,function(err){
if(!err){
console.log("文件写入成功");
//通过readfile读取文件,信息存入data,然后writefile 把data 写入hello.jpg中
}
});
}
});