Node 基础分享

353 阅读6分钟

湖南大汉建设云技术分享(Node.js)

本次分享内容

  • Node.js安装及使用(nvm)
  • 通过Node.js搭建服务器
  • 模块化及自定义模块
  • 内置模块fs的使用
  • buffer及stream

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版本。

  • 使用NVM(Node Version Manager)控制Node.js版本

    • nvm是mac环境下管理nodejs的工具。在windows环境下推荐使用nvmw或者nvm-windows;

    • 安装NVM

      • 在安装nvm之前需要一个c++编译器,在mac上可以安装Xcode命令工具(已经安装可以忽略)

        xcode-select --install

      • 使用 curl安装

        curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash

      • 或者使用wget来安装

        wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash

    • NVM常用指令;

      nvm --version查看版本

      nvm install stable //安装最新稳定版nodejs

      nvm install 8.11.1 //安装指定版本

      nvm install 8.11 //安装 8.11.x系列最新版本

      nvm ls-remote //列出远程服务器上所有可用的版本

      nvm use 8.11.1 //切换到8.11.1版本

      nvm use 8.11 //切换到8.11.x最新版本

      nvm use node //切换到最新版本

      nvm alias default node //设置默认版本为最新版本

      nvm ls //列出所有已经安装的版本

初步使用

//引入http模块
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;
//创建一个服务器
const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World');
});
//设置端口号 启动服务
server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Google Chrome 默认非安全端口列表,尽量避免以下端口。

1, // tcpmux
7, // echo 
9, // discard 
11, // systat 
13, // daytime
15, // netstat
17, // qotd 
19, // chargen 
20, // ftp data 
21, // ftp access 
22, // ssh 
23, // telnet 
25, // smtp 
37, // time 
42, // name 
43, // nicname 
53, // domain 
77, // priv-rjs 
79, // finger 
87, // ttylink 
95, // supdup 
101, // hostriame 
102, // iso-tsap 
103, // gppitnp 
104, // acr-nema 
109, // pop2 
110, // pop3 
111, // sunrpc 
113, // auth 
115, // sftp 
117, // uucp-path 
119, // nntp 
123, // NTP 
135, // loc-srv /epmap 
139, // netbios 
143, // imap2 
179, // BGP 
389, // ldap 
465, // smtp+ssl 
512, // print / exec 
513, // login 
514, // shell 
515, // printer 
526, // tempo 
530, // courier 
531, // chat 
532, // netnews 
540, // uucp 
556, // remotefs 
563, // nntp+ssl 
587, // stmp? 
601, // ?? 
636, // ldap+ssl 
993, // ldap+ssl 
995, // pop3+ssl 
2049, // nfs 
3659, // apple-sasl / PasswordServer 
4045, // lockd 
6000, // X11 
6665, // Alternate IRC [Apple addition] 
6666, // Alternate IRC [Apple addition] 
6667, // Standard IRC [Apple addition] 
6668, // Alternate IRC [Apple addition]
6669, // Alternate IRC [Apple addition]

模块化

一、为什么会有模块化

  • 在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"
      }
      
  • 导入导出文件

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();
  • 模块加载的优先级 ,先文件再目录;

二、内置模块;

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;内置模块不需要安装,外置模块需要安装;

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 会创建文件夹;
      • 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("修改成功"); } });

    
    - 判断文件是否存在
    
    ```js
    fs.exists("4.txt",function (exists) {
        console.log(exists);
    })
    

##@# buffer缓冲区

  • buffer的创建
    • 直接创建
    • 数组创建
    • 字符串创建
    • 乱码的处理
    • buffer转换tostring

###stream流

  • stream流:流与数据处理方面密不可分
    • 流的原理
    • 流数据的获取
      • pipe
      • data
      • end
    • copy的流方法实现
    • 加载视图的流方法实现