node.js
nvm 常用命令
- nvm list 查看当前安装的 Node.js 所有版本
- nvm install 版本号 安装指定版本的Node.js
- nvm uninstall 版本号 卸载指定版本的Node.js
- nvm use 版本号 选择指定版本的Node.js
模块化相关规则
-
如何定义模块:一个js 文件就是一个模块,模块内部的成员都是相互独立
-
模块成员的导出和引入
- 使用exports 对象(方法1)
// test1文件.js var sum = function(a,b){ return parseInt(a) + parseInt(b); } // 导出模块成员方法1 exports.sum = sum; exports.str = "hello"; exports.hello = function(){ console.log("hello") } // test2文件.js var sum = require('./test1文件.js'); console.log(sum(4,4)); conosle.log(sum.str); console.log(sum.hello())
-
将模块定义为类变量和类函数
// 返回一个JSON Object // test1文件.js var app = { name:'app', version:'1.0.0.0', satName:function(name){ console.log(this.name0) } } module.exports = app; // test2文件.js var app = require('./test1文件.js'); app.sayName("hello"); // hello
运用API 实现文件(文件夹)的写入
var path = require("path");
var fs = require("fs");
var root = "C:\\uers\\158358\\Desktop";
var fileContent = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div>Hello Node.js</div>
</body>
</html>
`
var initData = {
projectName:"mydemo",
data:[
{name:"img",type:"dir"},
{name:"js",type:"dir"},
{name:"css",type:"dir"},
{name:"index.html",type:"dir"}
]
}
fs.mkdir(path.join(root,initData.projectName),(err) => {
if(err) return;
// 创建子目录和文件
initData.data.forEach((item) => {
if(item.type == "dir"){
// 创建子目录
fs.mkdirSync(path.join(root,initData.projectName,item.name));
}else if(item.type == "file"){
// 创建文件并写入内容
fs.writeFileSync(path.join(root,initData.projectName,item.name),fileContent);
}
})
});
Buffer(缓冲区)
-
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。
但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
-
它是Node原生提供的全局对象,可以直接使用不需要require(“buffer”)
Buffer 的基本操作
- Buffer本质上是字节数组
- 构造方法(类)
- 静态方法
- 实例方法
var buf = Buffer.alloc(5);
console.log(buf);
- 实例化
- Buffer.from(array)
- Buffer.alloc(size)
- 功能方法
-
Buffer.isEncoding()判断是否支持该编码
-
Buffer.isBuffer() 判断是否为Buffer
-
Buffer.byteLength() 返回指定编码的字节长度,默认utf8
-
Buffer.concat() 将一组Buffer对象合并为一个Buffer对象
var buf = Buffer.from("Buffer"); var buf2 = Buffer.from("hello"); console.log(Buffer.isBuffer(buf)); // true var buf3 = Buffer.concat([buf,buf2]); // 数组【】 console.log(buf3); // <Buffer 68 65 6c 6c 6f 42 75 66 66 65 72> console.log(buf3.toString()); // Bufferhello console.log(Buffer.isEncoding(buf,"utf8")); // false console.log(Buffer.isEncoding("utf8")); // true
-
- 实例方法
-
write() 向Buffe对象中写入内容
-
slice() 截取新的Buffer对象
-
toString() 把buf对象转成字符串
-
toJson() 把 buf 对象转成 json 形成的字符串
// write() var buf = Buffer.alloc(5); console.log(buf); // <Buffer 00 00 00 00 00> buf.write("hello", 1); console.log(buf); // <Buffer 00 68 65 6c 6c> console.log(buf.toString()); // hell console.log("====================="); buf.write("hello", 1, 2); console.log(buf); // <Buffer 00 68 65 6c 6c> console.log(buf.toString()); // hell // slice() var buf = Buffer.from("hello"); var buf2 = buf.slice(); console.log(buf2.toString()); // hello console.log(buf2 == buf); // false var buf3 = buf.slice(1, 2); console.log(buf3.toString()); // e // toJSON() // toJSON 方法不需要显式调用,当 JSON.stringify 方法调用时会自动调用 toJSON 方法 var buf = Buffer.from("hello"); var json = JSON.stringify(buf); console.log(json); // {"type":"Buffer","data":[104,101,108,108,111]}
-
Path 路径操作
-
获取路径的最后一部分
console.log(path.basename("/foo/bar/index.html")); // index.html console.log(path.basename("/foo/bar/index.html",".html")); // index
-
获取路径 【__dirname 返回的是当前文件的相对路径】
console.log(__dirname); // F:\前端演示\node\review console.log(path.dirname("./foo/bar/www")); // ./foo/bar
-
获取扩展名
console.log(path.extname("index.html")); // .html
-
路径的格式化处理
- path.format() 将对象转成字符串类型 obj -> string
- path.parse() 将字符串转成对象 string -> obj
var obj = path.parse(__filename); console.log(obj); /* { root: 'F:\\', 文件的根目录 dir: 'F:\\前端演示\\node\\review', 文件的全路径 base: 'Path路径操作.js', 文件名 ext: '.js', 文件扩展名 name: 'Path路径操作' 文件的名称 } */ // path.format() var objpath = { root:'D:\\', dir:'D:\\test\review', ext:'.js', name:'test', base:'test.js' } var strpath = path.format(objpath); console.log(strpath); // D:\test\review\test.js
-
拼接路径
console.log(path.join("/far", "boo", "/test", "/review", "work", "..")); // \far\boo\test\review console.log(path.join("/far", "boo", "/test", "/review", "work", "../../")); // \far\boo\test console.log(path.join("/far", "boo", "/test", "/review", "work", "./")); // \far\boo\test\review\work\
-
规范化路径
console.log(path.normalize('/foo/bar/baz/test/..')); // \foo\bar\baz Linux路径 console.log(path.normalize('C:\\foo\\bar\\\\baz\\test\\..\\')); // C:\foo\bar\baz\ Windows路径
-
计算相对路径
console.log(path.relative('/data/orandea/test/aaa','/data/orandea/impl/bbb')); // ..\..\impl\bbb Linux路径 console.log(path.relative('C:\\orandea\\test\\aaa','C:\\orandea\\impl\\bbb')); // ..\..\impl\bbb Windows路径
-
解析路径
console.log(path.resolve('/foo/bar','./baz')); // F:\foo\bar\baz console.log(path.resolve('/foo/bar','/tmp/file/')); // F:\tmp\file console.log(path.resolve('wwroot','static_files/png/','../gif/image.gif')); // F:\前端演示\node\review\wwwroot\static_files\gif\image.gif console.log(path.resolve('nodes/test/path.js')) // F:\前端演示\node\review\nodes\test\path.js
-
两个特殊属性
console.log(path.delimiter); // 表示路径分隔符(Windows是\ Linux是 / // ; console.log(path.sep); // 环境变量分隔符(Windows中使用 ; Linux中使用 : // \
文件操作
-
读文件操作
// add.js 文件 var path = require("path"); var fs = require("fs"); var pathFile = path.join(__dirname, "data.txt"); fs.readFile(pathFile, (err, data) => { if (err) return; console.log(data); // <Buffer 32 35 35 34 33 36 32 34 33 35> console.log(data.toString()); // 2554362435 }); // 第二种,定义编码 // 如果没有第二个参数,那么得到的就是Buffer实例对象 // 如果有第二个参数并且是编码,那么回调函数获取到的数据就是字符串 fs.readFile(pathFile,'utf8',(err,data) => { if(err) return; console.log(data); // 2554362435 }) // data.txt 文件 // 2554362435
-
类与继承
function Animal(name) { this.name = name; } Animal.prototype.showName = function () { console.log(this.name); }; var a = new Animal("Toom"); a.showName(); // Toom var a1 = new Animal("Jerry"); a1.showName(); // Jerry // =================在Es6中===================================== class Animal { // 静态方法(静态方法只能通过类名调用,不可以使用实例对象调用) static showInfo() { console.log("hi"); } // 构造函数 constructor(name) { this.name = name; } showName() { console.log(this.name); } } var a = new Animal("Spike"); a.showName(); // Spike Animal.showInfo(); // hi // 类的继承extends class Dog extends Animal{ constructor(name,color){ super(name); this.color = color; } showColor(){ console.log(this.color); } } var d = new Dog("doudou",'pink'); d.showName(); d.showColor(); Dog.showInfo();
-
流式文件读取及写入
var fs = require("fs"); var path = require('path'); var rs = fs.createReadStream('./data.txt'); var ws = fs.createWriteStream('./data2.txt'); rs.pipe(ws); rs.once('open',function(err){ console.log("读取流打开了"); }) ws.once("close",function(err){ console.log("写入流关闭"); })
目录操作
-
创建目录
-
fs.mkdir(path[ , mode], callback )
-
fs.mkdirSync(path[ , mode ])
var path = require("path"); var fs = require("fs"); // 方法一(异步) fs.mkdir(path.join(__dirname,'abc'),(err) => { console.log(err); }) // 方法二(同步) fs.mkdirSync(path.join(__dirname,'hello'));
-
-
读取目录
-
fs.readdir(path[, options ], callback)
-
fs.readdirSync(path[, options])
var fs = require("fs"); var path = require("path"); // 方法一(异步) fs.readdir(__dirname,(err,files) => { files.forEach((item,index) => { fs.stat(path.join(__dirname,item),(err,stat) => { if(stat.isFile()){ console.log(item,'文件') }else if(stat.isDirectory()){ console.log(item,'目录') } }); }); }); // 方法二(同步) var files = fs.readdirSync(__dirname); files.forEach((item,index) => { fs.stat(path.join(__dirname,item),(err,stat) => { if(stat.isFile()){ console.log(item,'文件') }else if(stat.isDirectory()){ console.log(item,'目录') } }); });
-
-
删除目录
var path = require("path"); var fs = require("fs"); // 异步方法 fs.rmdir(path.join(__dirname,'abc'),(err) => { console.log(err) }) // 同步 fs.rmdirSync(path.join(__dirname,'abc'));
模板引擎*
// add.js 文件
var template = require("art-template");
var html = template(__dirname + '/tpl-user.art',{
user:{
name:'小明'
}
});
// tpl-user.art 文件
{{ if user }}
<h2>{{ user.name } }</h2>
{{ /if }}
yarn工具使用(npm) *
- 安装yarn 工具:npm install -g yarn
- 初始化包
- npm init
- yarn init
- 安装包
- npm install *** --save
- yarn add ***
- 卸载包
- npm uninstall ***
- yarn remove ***
- 更新包
- npm updata ***
- yarn upgrade ***
- 安装开发依赖的包
- npm install *** --save-dev
- yarn add *** --dev
- 全局安装
- npm install -g ***
- yarn global add ***
- 设置下载镜像的地址
- npm config set registry url
- yarn config set registry url
- 安装所有依赖
- npm install
- yarn install
- 执行包
- npm run
- yarn run
服务器
初步实现
-
开设服务器、端口
// 第一种方法 var http = require("http"); var server = http.createServer(); server.on('request',(req,res) => { console.log('jjsdf'); }) server.listen(3000,() => { console.log('running!!'); }) // 第二种方法 var http = require("http"); http.createServer((req,res) => { res.end("fajsfj"); }).listen(3000,'127.0.0.1',() => { console.log("running!!"); })