Node.js笔记(基础)

157 阅读7分钟

一、Node.js 简介

  • node.js是什么?

以前:JS代码写好了,写过HTML引入浏览器解析运行

现在: JS代码写好了,直接通过Node软件解析运行即可 Node.js是JavaScript运行环境,可以解析JS代码

  • 能干嘛?

作用:让Javascript成为与PHP,python平起平坐的语言 前端脱离后端,直接通过JS写项目(接口、爬虫、桌面应用)

node.js的相关基础知识点

1.命令行窗口:

cmd、shell、dos窗口

  • 常用指令:

dir:列出当前目录下的所有文件

cd+目录名:进入指定的目录

md+目录名:创建文件夹

rd+目录名:删除文件夹

  • 目录: . 表示当前目录 .. 表示上一级目录

  • 环境变量(windows系统中的变量)

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

2.进程和线程

进程

-进程负责为程序的运行提供必备的环境

-进程相当于工厂中的车间

线程 -线程是计算中最小的计算单位,线程负责执行进程中的程序

-线程就相当于工厂中的工人

单线程 -JS是单线程的 多线程

3.Node.js简介

nodejs是一个能够在服务器端运行js的跨平台运行环境、单线程

4.模块化

1.在node中,一个js文件就是一个模块,js文件中的所有代码都默认在一个function内执行,可用console.log(arguments.callee+“”)显示出来

2.在node中,每一个js文件中的js代码都是独立运行在一个函数中,而不是全局作用域,所以一个模块中的变量和函数在其他模块中无法访问

3.如果想向外部暴露,只需要将需要暴露给外部的变量或方法设置为exports的属性即可

4.在node中,通过require()函数来引入外部的模块, require中传递的文件路径并须使用相对路径,使用.或..开头

5.使用require引用模块后,会返回一个对象,该对象代表的是引入的模块

6.node会默认在最顶端加如下代码function (exports, require, module, __filename, __dirname) {,在最底端加 },实际上我们使用的exports和require都是node为我们传递进来的实参,filename表示当前模块的完整路径,dirname表示所在文件夹的完整路径

7.可使用module.exports = { }进行批量暴露

exports只能使用.的方式来向外暴露内部变量,module可以直接赋值

5.模块标

1)核心模块

由node引擎提供的模块

核心模块的标识就是模块的名字,不用写路径,直接写名字

2)文件模块

由用户自己创建的模块

文件模块的标识就是文件的路径(相对路径或绝对路径)

6.CommonJs的包规范由包结构和包描述文件

package.json是最主要的成分,相当于包的简介

json文件中不能写注释

7.NPM(Node Package Manager)

NPM就是package包管理规范,NPM帮助node完成第三方模块的发布、安装和依赖,通过npm下载的包都放在node_modules文件夹中,直接通过包名引入即可

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 包名 --g 全局安装包(一般都是一些工具,计算机使用的,不是项目使用的)

8.npm引入模块规则

1)首先会在当前目录的node_modules中寻找该模块

2)如果有则直接引用,如果没有则去上一级目录的node_modules中寻找

3)一直往上,直到找到磁盘的根目录,如果依然没有则报错

9.Buffer(缓冲区)

1)Buffer的结构和数组很像,操作的方法也和数组类似

2)数组中不能存储二进制的文件,而buffer就是专门用来存储二进制数据

3)使用buffer不需要引入模块,直接使用即可

4)在buffer中存储的都是二进制数据,而计算机显示时都是以16进制的形式显示,但打印数字时,控制台只显示10进制,非数字的则可以通过toString(进制数)进行输出

5)Buffer中每一个元素的范围是从00 - ff,buffer.length返回的是占用内存的大小

6)new Buffer(数字)创建指定大小(字节)的Buffer对象,但是已经被废弃了

7)Buffer.alloc(数字) 为常用的创建方法,通过索引来操作buf的元素,Buffer.allocUnsafe(size)创建的Buffer不清除之前的内存数据,可能存在敏感数据

8)Buffer的大小一旦确定,则不能修改,扩充会导致内存不连续,不利于性能维护

9)Buffer中存储的数据,如果大小越界,则取二进制的后8位

10)buf.toString() 将缓冲区中的数据转换为字符串

node.js与JavaScript的区别

  • 基于异步I/O相关接口
  • 基于node_modules和require的模块依赖
  • 提供C++ addon API与系统交互

特性

  • 事件驱动
  • 单线程/异步/非阻塞
  • npm

二、Node.js语法

数据类型

原始数据类型 Number

String

Boolean

Null```

Undefined

Symbol

引用数据类型

Object

Array

Function

Map

Set

...

2.对象

let obj ={
  a:1,
  b:{
    c:"hello",
    d:true
  }
};
console.log(obj.b.c);
let arr=[1,2,3];
console.log(arr.length);
console.log(arr.map(v => v*2));
typeof arr;

3.变量定义

  • var 可以重复定义
  • let 只允许定义一次
  • const 不可重新赋值

使用变量 需要$进行包裹

4.异步

setTimeout(function(){
  console.log('world');
},1000);
console.log('hello');


setTimeout(() => {
  console.log(1);
  setTimeout(() => {
    console.log(2)
  }, 1000);
}, 1000);

使用这种方式需要回调,所以考虑下面promise的方式

const promise1=new Promise(function(resolve,reject){
  setTimeout(function(){resolve('foo')},300)
});
promise1.then((value)=>{
  console.log(value);
});

console.log(promise1)

const { resolve } = require("promise")

function timeout(time){
  return new Promise(function(resolve)
  {
    setTimeout(resolve,time);
  });
}
timeout(1000).then(function(){
  console.log(1);
}).then(function(){
  timeout(1000);
}).then(function(){
  console.log(2);
});

//////////////////////////////////////////////

async function timeout(time)
{
  return new Promise(function(resolve){
    setTimeout(resolve,time);
  });
}
let main = async function() {
await timeout(1000);
console.log(1);
await timeout(1000);
console.log(2);}
main();

Promise对象代表一个异步操作,有三种状态:Pending(进行中)、Resolved(已完成 ,又称Fulfilled)和 Rejected(已失败)。

resolve(data)将这个promise标记为resolved,然后进行下一步then((data)=>{//do something}),resolve里的参数就是传入then的数据

执行到 resolve()这个方法的时候,就改变promise的状态为resolved,当状态为 resolved的时候就可以执行.then()

当执行到 reject() 这个方法的时候,就改变 promise的状态为 reject,当promise为reject就可以.catch()这个promise了

这两个方法可以带上参数,用于.then()或者 .catch() 中使用。他们的作用就是 用于改变promise的状态,因为状态改变了,所以才可以执行相应的.then()和 .catch()操作。

5 函数

一般表达方式

function say(word) {
  console.log(word);
}

function execute(someFunction, value) {
  someFunction(value);
}

execute(say, "Hello");

匿名表达方式

function execute(someFunction, value) {
  someFunction(value);
}

execute(function(word){ console.log(word) }, "Hello");

HTTP例子

var http = require("http");

http.createServer(function(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}).listen(8888);

原型

var http = require("http");

function onRequest(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}

http.createServer(onRequest).listen(8888);

三、模块和npm

1.HTTP服务

var http = require("http");

function onRequest(request, response) {
  response.writeHead(200, {"Content-Type": "text/plain"});
  response.write("Hello World");
  response.end();
}

http.createServer(onRequest).listen(8888);
console.log('服务器运行中....')

2.模块

  • 内置模块:编译进Node中,例如http fs net process path等
  • 文件模块:原生模块之外的模块,和文件夹一一对应

自定义模块

const pi=Math.PI;
exports.area=function(r){
  return pi*r*r;
};
exports.circumference=function(r){
  return 2*pi*r;
};