Node.js介绍
- Node.js 诞生于2009年,Node.js采用C++语言编写而成,是 一个Javascript的运行环境。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境 ,让JavaScript的运行脱离浏览器端,可以使用JavaScript语言 书写服务器端代码。
安装Node.js
Node.js官网下载稳定版本,node偶数版本为稳定版本,奇数版本为非稳定版本。
-
mac 直接安装 或者 brew来安装
-
安装完Node.js会自动安装NPM(Node Package Manager):包管理工具;
-
通过指令 node -v 来查看是否安装完成和查看node版本号;npm -v 来查看npm版本。
###使用Node.js实现第一个服务器
初步感受Node.js
//引入http模块
let http = require("http");
//创建一个服务器
let serve = http.createServer((req,res)=>{
console.log("hello");
res.end("hello world");
})
//设置端口号
serve.listen(3000);
- 安装 nodemon工具, 自动重启node服务 npm i nodemon -g
- 在cmd中, 输入ipconfig, 显示本机ip地址
- 安装 nodemon工具, 自动重启node服务 npm i nodemon -g
- 在cmd中, 输入ipconfig, 显示本机ip地址
模块化
一、为什么会有模块化
-
在JavaScript发展初期就是为了实现简单的页面交互逻辑,寥寥数语即,如今随着前端代码日益膨胀
这时候JavaScript作为嵌入式的脚本语言的定位动摇了,JavaScript却没有为组织代码提供任何明显帮助,JavaScript极其简单的代码组织规范不足以驾驭如此庞大规模的代码;
- 使代码的结构更加清晰,便于后期维护
- 避免变量污染,每一个模块 都有自己独立的命名空间
- 可以按需加载, 提升性能
二、Node.js中的模块化 commonjs规范
-
CommonJS就是为JS的表现来制定规范,因为js没有模块的功能所以 CommonJS应运而生,它希望js可以在任何地方运行,不只是浏览器中。
1、创建自定义模块
-
引入一个文件 形式模块
home.js执行文件
//通过require来引入 require("./aModule"); //注意一定要有"./",文件后缀可加可不加。
amodule.js文件
console.log("我是amodule模块111");
-
引入文件夹形式模块
- home.js执行文件
require("./aModuledir"); //必须加"./"
aModuleDir里的index.js文件,会自动查找文件夹下的index.js文件执行
console.log("我是aModule模块文件夹");
- 当然也可以配置默认启动文件,在文件夹内新建package.json来指定执行文件
{ "name":"aModule", "version":"1.0.0", "main":"test.js" }
-
-
自定义模块的按需导出
通过module.exports 导出; ___dirname , __filename
module.exports = { a:"我是a的值", b(){ console.log("我是导出的b函数"); } }
引入导出文件
let mymodule = require("bModule"); console.log(mymodule.a); mymodule.b();
或者 通过 exports来导出
exports.fn = function(){ console.log("我是fn函数"); }
导入文件
let myfn = require("bModule").fn; myfn(); // 或者 通过解构赋值 let { fn } = require("bModule"); fn();
-
模块加载的优先级 ,先文件再目录;
2、内置模块;
nodejs内置模块有:Buffer,C/C++Addons,Child Processes,Cluster,Console,Cr
ypto,Debugger,DNS,Domain,Errors,Events,File System,
Globals,HTTP,HTTPS,Modules,Net,OS,Path,Process,P unycode,Query Strings,Readline,REPL,Stream,String De coder,Timers,TLS/SSL,TTY,UDP/Datagram,URL, Utilities,V8,VM,ZLIB;内置模块不需要安装,外置模块需要安装;
node模块: 1 自定义模块: 不需要安装,自行定义使用, 同级目录必须加 “./”
– 位置是自定义的
– 导入时,前缀添加./
2. 内置模块: 由node自带,直接导入使用即可
-- 位置是: node_modules
-- 导入时,直接写模块名称
3. 外置模块: 使用npm 通过指令 按需安装
-- 位置是: node_modules
-- 导入时,直接写模块名称
npm包管理器: 别名: 模块管理器
NPM(Node Package Manager) 官网的地址是 npm官网
- npm常用指令;
- npm init:引导创建一个package.json文件
- npm help(npm -h) :查看npm帮助信息
- npm version (npm -v) : 查看npm版本;
- npm search:查找
- npm install (npm i):安装 默认在当前目录,如果没有node_modules 会创建文件夹,如果node_modules中没有 package.json文件中对应的模块,会自动补全。
- npm install module_name -S 或者–save 即 npm install module_name --save 写入dependencies : 运行依赖
- npm install module_name -D 或者 —save-dev 即 npm install module_name --save-dev 写入devDependencies: 开发依赖
- npm install module_name -g 全局安装(命令行使用)
- 指定版本安装模块 npm i module_name @1.0 通过 "@"符号指定;
- npm update(npm -up):更新
- npm remove 或者 npm uninstall:删除
- npm root 查看当前包安装的路径 或者通过 npm root -g 来查看全局安装路径;
fs模块
-
fs是文件操作模块,所有文件操作都是有同步和异步之分,特点是同步会加上 “Sync” 如:异步读取文件 “readFile”,同步读取文件 “readFileSync”;
文件操作
-
文件读取:
- 异步读取
let fs = require("fs"); fs.readFile("1.txt",(err,data)=>{ if(err){ return console.log(err); } console.log(data.toString()); })
- 同步读取文件
let fs = require("fs"); let res = fs.readFileSync("1.txt"); console.log(res.toString());
-
文件写入:
let fs = require("fs"); //flag配置 "a":追加写入,"w":写入,"r":读取 fs.writeFile("2.txt","我是要写入的内容",{flag:"w"},err=>{ if(err){ return console.log(err); } console.log("写入成功"); })
-
文件删除
fs.unlink("2.txt",err=>{ if(err){ return console.log(err); } console.log("删除成功"); })
-
复制文件
- 先读取文件再写入文件
function mycopy(src,dest){ fs.writeFileSync(dest,fs.readFileSync(src)); } mycopy("1.txt","4.txt");
-
修改文件名,目录也可以通过rename来操作
fs.rename(“1.txt”,“5.txt”,function (err) {
if(err){
console.log(err);
}else{
console.log(“修改成功”);
}
});- 判断文件是否存在
fs.exists(“4.txt”,function (exists) {
console.log(exists);
}) -
buffer缓冲区
buffer : 数据的缓冲区 , 也是一个类,不是模块
十进制 -> 二进制
0 -> 0
1 -> 1
2 -> 10
3 -> 11
4 -> 100
5 -> 101
6 -> 110
7 -> 111
8 -> 1000
buffer创建:
// node 6.0 之前的方式
// new Buffer();
// 现在的创建方式
// 参数: 是内容的大小, 单位是字节 b
// let buffer = Buffer.alloc(10);
// console.log(buffer);
buffer会把数据(不限) 转换成二进制, 然后以十六进制的方式展示出来
// let buffer = Buffer.from(“大家好”);
// console.log(buffer); //这里不识别
// console.log(buffer.toString());
解决方法
// let buffer1 = Buffer.from([0xe5,0xa4,0xa7,0xe5,0xae,0xb6,0xe5,0xa5,0xbd]); // 0x 是对16进制的标识,16进制用到啊a,b,c,d,e
// console.log(buffer1.toString());
如果文件断开,断流了
解决方法一
let buffer1 = Buffer.from([0xe5,0xa4,0xa7,0xe5]);
let buffer2 = Buffer.from([0xae,0xb6,0xe5,0xa5,0xbd]);
//合并返回一个新的数组
// let newbuffer = Buffer.concat([buffer1,buffer2]);
// console.log(newbuffer.toString());
解决方法二
// StringDecoder: 固定名称 ,是一个class类
//结构赋值一个类
let { StringDecoder } = require(“string_decoder”); //模块
//实例化出来
let decoder = new StringDecoder();
let res1 = decoder.write(buffer1);
let res2 = decoder.write(buffer2);
console.log(res1+res2);
stream流
stream: 流,把数据切割开
const fs = require(“fs”);
//读取了数据
let rs = fs.createReadStream(“11.txt”);
console.log(rs);
//将数据写入
let ws = fs.createWriteStream(“22.txt”);
//管道
rs.pipe(ws);
//流,会把数据分成64kb的小文件传输
let num = 0;
let str = “”;
// 数据传输时, 触发的方法
rs.on("data",chunk=>{
num++;
str += chunk;
console.log(chunk); //把执行的数据穿出来
// console.log(num);
});
// 数据传递完成后
// rs.on("end",()=>{
// console.log(str);
// });
// 1k = 1024kb
// let buffer = Buffer.alloc(65*1024); //创建一个65kb大小的内容
// fs.writeFile("65kb",buffer,err=>{
// if(err){
// return console.log(err);
// }
// console.log("写入成功");
// });