nodejs

node.js

nvm 常用命令

  • nvm list 查看当前安装的 Node.js 所有版本
  • nvm install 版本号 安装指定版本的Node.js
  • nvm uninstall 版本号 卸载指定版本的Node.js
  • nvm use 版本号 选择指定版本的Node.js

模块化相关规则

  1. 如何定义模块:一个js 文件就是一个模块,模块内部的成员都是相互独立

  2. 模块成员的导出和引入

    • 使用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本质上是字节数组
    1. 构造方法(类)
    2. 静态方法
    3. 实例方法
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 路径操作

  1. 获取路径的最后一部分

    console.log(path.basename("/foo/bar/index.html"));  // index.html
    console.log(path.basename("/foo/bar/index.html",".html"));  // index
    
  2. 获取路径 【__dirname 返回的是当前文件的相对路径】

    console.log(__dirname);   // F:\前端演示\node\review
    console.log(path.dirname("./foo/bar/www"));  // ./foo/bar
    
  3. 获取扩展名

    console.log(path.extname("index.html"));  // .html
    
  4. 路径的格式化处理

    • 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
    
  5. 拼接路径

    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\
    
  6. 规范化路径

    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路径
    
  7. 计算相对路径

    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路径
    
  8. 解析路径

    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
    
  9. 两个特殊属性

    console.log(path.delimiter);    // 表示路径分隔符(Windows是\  Linux是 /
    // ;
    console.log(path.sep);     // 环境变量分隔符(Windows中使用 ; Linux中使用 :
    // \
    

文件操作

  1. 读文件操作

    // 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
    
    
  2. 类与继承

    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();
    
    
  3. 流式文件读取及写入

    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("写入流关闭");
    })
    

目录操作

  1. 创建目录

    • 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'));
      
  2. 读取目录

    • 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,'目录')
                  }
              });
       });
      
  3. 删除目录

    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
  1. 初始化包
    • npm init
    • yarn init
  2. 安装包
    • npm install *** --save
    • yarn add ***
  3. 卸载包
    • npm uninstall ***
    • yarn remove ***
  4. 更新包
    • npm updata ***
    • yarn upgrade ***
  5. 安装开发依赖的包
    • npm install *** --save-dev
    • yarn add *** --dev
  6. 全局安装
    • npm install -g ***
    • yarn global add ***
  7. 设置下载镜像的地址
    • npm config set registry url
    • yarn config set registry url
  8. 安装所有依赖
    • npm install
    • yarn install
  9. 执行包
    • 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!!");
    })
    
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页