Node.js初识(第一部分)

Node.js初识

1.命令行窗口(小黑屏),CMD窗口,终端,shell

  • 开始菜单---->运行---->CMD---->回车

  • 常用命令:
    dir列出当前目录下的所有文件
    cd 目录名 进入指定的目录
    md 目录名 创建一个文件夹
    rd 目录名 删除一个文件夹

  • 目录
    .表示当前目录
    …(两个点) 表示上一级目录

  • 环境变量(windows系统中变量)----path

  • 当我们在命令窗口中打开一个文件,或者调用一个程序时,系统会首先在当前目录下寻找文件程序,如果找到则直接打开,如果没有找到则依次到环境变量path路径中寻找,直到找到为止,找不到则报错。

  • 可以将一些常用的文件或者程序路径添加到path下,这样我们可以在任意位置访问这些文件了。
    2.线程和进程

  • 进程:进程负责为程序的运行提供必备环境(相当于工厂中的车间)

  • 线程:它是计算机中的最小计算单位,它负责执行进程中的程序(相当于工厂中的工人)
    3.node中的模块引入

在node中,通过require()函数来引入外部模块,require()可以传递一个文件的路径作为参数,node将会自动根据路径来引入外部模块,使用require()引入模块以后,该函数返回一个对象,这个对象代表的是引入的模块。

4.模块化

  • 在Node中,一个JS文件就是一个模块
  • 在Node中,每一个JS文件中的JS代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块中的变量和函数在其他的模块中无法访问
  • 可以通过exports来向外部暴露变量和方法(只需要将暴露给外部的变量或者方法设置为exports属性即可。)
  • 模块分为两大类:(1)核心模块:由node引擎提供的模块,核心模块的标识就是模块的名字 (2)文件模块:由用户自己创建的模块 ,文件模块的标识就是文件的路径(相对路径,绝对路径)
  • 模块的标识:模块的标识就是模块的名字或者路径,node通过模块的标识寻找模块,对于核心模块(npm中下载的模块),直接使用模块的名字对其引入,var fs=require("fs"),对于自定义的文件模块,需要通过文件的路径将其引入var router=require("./router")
    5.Node中的全局变量

在node中有一个全局对象global,它的作用类似于javascript中的windows类似,在全局中创建的变量或者方法都会作为global的属性或者方法保存。

6.Node中的隐形函数

  • 当node在执行模块中的代码时,它会首先添加如下代码,即将所有的代码放在这个函数中:
function(exports,require,module,_filename,_dirname){
}
  • 传入的5个参数即:
    (1)exports:该对象用来将变量或者函数暴露到外部
    (2)require:用来引入外部的模块
    (3)module:代表当前模块本身,exports就是module的属性(既可以用exports导出,友可以用module.exports导出)
    (4)_filename:当前模块的完整路径
    (5)_dirname:当前模块所在文件夹的完整路径

  • exports和module.exports的区别

通过exports只能使用.的方式来向外部暴露内部变量(exports.&&&=&&&),而module.exports既可以通过.的形式,也可以直接赋值(module.exports.&&&=&&&,module.exports={}).

7.包结构

  • 包实际上就是一个压缩文件,解压以后还原为目录。符合规范的目录,应该包含如下的文件:
    (1)package.json 描述文件 (必须要有的文件)
    (2)bin 可执行二进制文件
    (3)lib js代码
    (4)doc 文档
    (5)test 单元测试

  • npm常用命令
    (1) npm -v 查看npm的版本
    (2) npm version 查看所有模块的版本
    (3) npm search 包名 搜索包
    (4) npm install / i 包名 安装包
    (5) npm remove / r包名 删除包
    (6) npm install 包名 --save 安装包并添加到依赖中
    (7) npm install 下载当前项目所依赖的包
    (8) npm install 包名 -g 全局安装包(全局安装的包一般是一些工具)

通过npm下载的包都放到node_modules文件夹中(我们直接通过包名引入即可),node在使用模块名引入模块时,它会首先在当前目录的node_modules中寻找是否含有该模块,如果有,则直接使用,如果没有,则去上一级的node_modules中寻找,如果有则直接使用,如果没有,则再去上一级目录中寻找,直到找到磁盘的根目录,如果依然没有,则报错。

8.Buffer(缓冲区)

Buffer的结构和数组很像,操作方法也和数组类似,但数组中不能存储二进制的文件,而Buffer就是专门用来存储二进制数据,使用Buffer不需要引入模块,直接使用即可,在Buffer中存储的都是二进制数据,但在显示时都以十六进制的形式显示。

  • Buffer的创建及使用
   var buf=Bufer.alloc(size);//创建一个指定大小的Buffer
   var buf3=Buffer.allocUnsafe(10);//创建一个指定大小的Buffer,但Buffer中可能含有敏感的数据
   Buffer.from(str);//将一个字符串转化为一个Buffer
   Buffer.tostring();//将缓冲区中的数据转换为字符串

9.fs (文件系统)

1.在node中,与文件系统的交互是非常重要的,服务器的本质就是将本地的文件发送给远程的客户端。
2.node通过fs模块来将文件系统进行交互
3.该模块读入了一些标准的文件访问API来打开,读取,写入文件,以及与其交互
4.要使用fs模块,首先要对其进行加载const fs=require("fs");
5.fs模块中所有的操作都有两种形式可供选择------同步,异步
6.同步文件系统会阻塞程序的执行,也就是除非操作完毕,否则不会向下执行代码。
7.异步文件系统不会阻塞程序的执行,而是在操作完成时,通过回调函数将结果返回。

  • 同步文件的写入(操作步骤)
    1.打开文件
    fs.opensync(path,flags,mode)

@ path:要打开文件的路径
@flags:打开文件要做的操作类型(r–只读的 w–可写的)
@mode:设置文件的操作权限,一般不传
–>返回值:该方法返回一个文件的描述做为结果,我们可以通过该描述对文件进行各种操作。
2.向文件中写入内容

    fs.writesync(fd,string,position,encoding)

@fd 文件的描述符,需要传递要写入的文件的描述符
@string 要写入的内容
@position 写入的起始位置
@encoding 写入的编码,默认UTF-8
3.保存并关闭文件

     fs.closeSync(fd)

@fd 要关闭的文件的描述符

  • 异 步文件写入
    1.操作跟同步文件一样,但异步调用的方法,结果都是通过回调函数的参数返回的
    //打开文件
    fs.open("hello2.txt","w",function(err,fd){
           //判断是否出错
        if(!err){
           //如果没有出错,则对文件进行写入操作
           fs.write(fd,"这是异步操作的内容",function(err){
                if(!err){
                    console.log("写入成功~~");
                }
                //关闭文件
                fs.close(fd,function(err){
                   if(!err){
                     console.log("文件已经关闭~~");
                   }
                });
           });
         }else{
           console.log(err);
         }
    });
  • 简单文件写入
    fs.writeFile(file,data,options,callback)
    fs.writeFilesync(file,data,options)

@file 要操做文件的路径
@data 要写入的数据
@options 可选项,可以对写入进行一些设置
@callback 当写入完成以后执行函数

    var fs=require("fs");
    fs.writeFile("hello3.tex","这是通过writeFile写入的内容",function(err){
           if(!err){
              console.log("写入成功~~");
           }
    });
  • 流式文件写入(适用于较大文件)

同步,异步,简单文件的写入都不适合大文件的写入,性能较差,容易导致内存溢出

   var fs=require("fs");
   //文件流写入,首先创建一个可写流
   //fs.creatWriteSteam(path,options)-----@path 文件路径 @options  配置的参数
   var ws=fs.creatWriteSteam("hello3.tex");
   //可以通过监听流的open和close事件来监听流的打开和关闭
   ws.once("open",function(){
       console.log("流打开了~~");
   });
    ws.once("close",function(){
       console.log("流关闭了~~");
   });
   //通过ws向文件中输出内容
   ws.write("通过可写流写入文件的内容");
   ws.write("今天天气好晴朗");
   //关闭流
   ws.end(); 

版权声明:本文为qq_44920749原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。