node.js学习笔记

1、什么是Node.js?

  • Node.js是基于Chrome V8引擎而构建的JavaScript运行时环境,它让JavaScript可以运行于服务器端(之前只是运行在客户端,主要是浏览器);
  • Node.js底层用C++实现的,大部分模块都使用JavaScript编写,含大量的内置模块,使得程序可以脱离Apache、Nginx、IIS等web服务器,作为独立的服务器运行;

   Node.js三个特点

  • 单线程:不需要像Java、PHP等服务端语言一样为每一个客户端连接新建一个线程,只使用一个线程,每当有用户连接,就触发内部事件机制,让node.js在宏观上并行运行,这样增加了并发用户数、也省去了OS创建、销毁线程的时间开销;但是如果某个用户造成线程崩溃(如内存出错),整个服务也就随之崩溃;
  • 非阻塞I/O:当进行I/O操作(如访问数据库)时,不会傻傻地等返回结果再执行,而是执行其他代码,把I/O相关的返回结果的处理代码放在回调函数中,让程序异步执行,提高程序执行效率和CPU利用率;
  • 事件驱动:服务器只在用户触发事件的时候才相应,当异步任务返回一个结果,就在任务队列增加一个事件,(只要指定了回调函数,事件发生时就会进入“任务队列”等线程读取)主线程一执行完执行栈中的同步任务就会去任务队列看有哪些需要执行的任务,然后依次执行对应的回调函数,主线程从任务队列中读取事件的过程是不断地循环的(event loop

缺点

  • 不适用于CPU密集型任务、不适合做具有大量需要复杂逻辑计算的任务

应用场景

  • 轻量级、高流量的任务,如聊天室
  • 棋牌类游戏

   什么是V8?

  •  Chrome V8引擎是Google开源的JavaScript引擎,它在运行之前将JavaScript编译成机器码,,而非字节码或直接解释        JavaScript程序,,以此提升性能;
  • 它支持ES5,基本上也完成了对ES6的支持,可以运行在Window、Mac、Linux等多种平台上;
  • 可以处理对象内存分配垃圾回收等,类似于JVM执行java字节码;
  • V8不提供DOM,但提供所有的数据类型、操作符、对象和ECMA标准规定的函数...

   目前几乎所有主流浏览器都支持JavaScript,也就意味着他们都有JavaScript引擎,不是只有V8才能执行JavaScript程序

 (Firefox:spidermoney;Safari:JavaScriptCore;Chrome:V8等)

   浏览器最核心的部分就是浏览器内核,浏览器内核主要包括排版渲染引擎JavaScript引擎

   ① 排版渲染引擎主要负责:对网页语法的解释并渲染(显示)网页,它决定浏览器如何显示网页的内容、页面格式信息等

     常见的排版渲染引擎有:

  •   Trident:微软的内核,跨平台,慢,使用该内核的浏览器有 IE、遨游(Maxthon)、世界之窗(the world)、腾讯TT
  •   Gecko:网景通讯公司开发,目前由Mozilla基金会维护;使用该内核的浏览器有 Firefox、Mozilla。Netscape6-
  •   Webkit: 苹果公司的内核,开源,使用该内核的浏览器有: Safari、google Chrome(13年以前)、遨游3、猎豹、百度、Opera
  •   Presto:  Opera software 开发的浏览器排版引擎,03年在Opera中首次使用,速度快,但牺牲了网页兼容性,13年开始  Opera先后改用Webkit和Blink,目前主要用于手机平台
  •   Blink:13年Google公司利用Webkit自主开发的网页排版渲染引擎,是Chrome的分支,使用该内核的浏览器有 Chrome、 Opera(Opera7+原本使用Presto)
  •   edge 原名斯巴达,15年微软推出的新的浏览器使用edge引擎

   ②  JavaScript引擎主要负责:编译(或解译)执行JavaScript

        常见的JavaScript引擎有:

  •     老版本IE:JScript引擎
  •     IE9+:Chakra引擎
  •     Firefox:monkey系列引擎(如spidermonkey)
  •     Safari:SquirrelFish系列引擎
  •     Opera:Carakan引擎
  •     Chrome:V8引擎(nodeJs其实就是封装了V8引擎)

 为什么是选择V8引擎

  • V8是开源的
  • V8引擎执行Javascript的速度快,性能好
  • V8专注于网络功能,在HTTP、DNS、TCP等方面更为成熟

2、node.js、浏览器、JavaScript、V8之间的关系?

JavaScript

①JavaScript是一种“胶水语言”,它让开发者可以使用它来组装图片和插件之类的组件,代码可以直接编写在网页标记中;

它是一种脚本语言,不像C等编译型语言可以在编译之后直接在操作系统上运行,它必须依赖JavaScript引擎来运行。

②刚开始JavaScript运行在浏览器环境中,由浏览器的引擎负责编译或者解译执行(V8是先编译成机器码再执行;其他引擎如Spidermonkey(Mozilla)会逐行解译,然后将解译过的指令暂存);

③后来有了JavaScript作为服务端脚本的概念,JavaScript也可以运行在服务器。注意:Node.js并不是采用“服务端脚本”的首创者,但是它的发布的确让JavaScript作为服务端脚本这一概念声名鹊起。

Node.js与JavaScript的关系

①JavaScript是一门语言;

②Node.js不是一门语言,更不是JavaScript的一种方言,它是JavaScript在服务器端的的运行环境(JavaScript和Node.js的关系类似于Java和JVM);

③node.js本身用C++实现的,但是它用来运行JavaScript,封装)了大量的用JavaScript编写的内置模块,JavaScript跟node.js这一平台的实现没有关系;

④是Node.js选择了JavaScript,而不是JavaScript发展产生node.js(node.js也可以选用其他语言,不是非要用JavaScript,只不过JavaScript更合适)

浏览器端和服务端JavaScript的组成有何区别

① 浏览器端的JavaScript实际上包含三部分:

  •      ECMAScript(核心):描述JS的语法和基本对象
  •     文档对象模型(DOM):描述处理网页内容的方法(节点等)和接口
  •     浏览器对象模型(BOM):描述与浏览器进行交互的方法和接口

② 服务器端:

  •     ECMAScript
  •     Node.js的内置模块:用JS实现,包括文件系统的I/O、网路(HTTP、TCP...)、二进制数据流、加密算法(如md5)等

引用大神的两段话何一张图解释JS、Web容器、V8之间的关系:

原文请猛戳 >>https://www.cnblogs.com/sniper007/archive/2011/10/27/2226270.html

JavaScript运行环境一般都由宿主环境执行期环境共同构成。其中宿主环境是由外壳程序生成的,如Web浏览器就是一个外壳程序它提供了 一个可控制浏览器窗口的宿主环境。执行期环境则由嵌入到外壳程序中的JavaScript引擎(或称为JavaScript解释器)生成,在这个环境中 JavaScript能够生成内置静态对象,初始化执行环境等.

外壳程序不仅仅是Web浏览器,只要能够提供JavaScript引擎执行的环境都可以算做外壳程序。很多服务器、桌面应用系统也都提供能够允许 JavaScript引擎执行的运行环境,这些运行环境也是宿主环境。同时,大部分JavaScript引擎自身也带有一个用于代码调试的程序,这个简单 的程序被运行时,也会创建一个宿主环境。


 

小结

web浏览器是构建可以控制浏览器窗口的JavaScript宿主环境的;

V8是chrome浏览器的一种JavaScript引擎,用来执行JavaScript;

Node.js对V8引擎进行了封装,是JavaScript在服务器端的运行平台;

V8是内置于Chrom(web浏览器)中,现在也内置于node.js中

 

================= ===分隔线 ====================

 

3、Node相关知识点总结:

1)首先了解一下模块

它解决了:命名冲突文件依赖的问题

①定义模块:

node.js采用commonJs模块规范(前端的模块规范有AMD和CMD,ES6也有对应的模块规范),由模块组成,每个js文件都是一个独立的模块,它们拥有自己的作用域,里面的变量、方法等对其他模块不可见

②模块的导入和导出

commonJs中,每个模块内部 module变量代表当前模块,这是一个对象,它的exports属性是对外的接口,用module.exports或exports导出向外暴露模块内部成员,加载模块就是加载module.exports属性;加载模块用require方法。

exports与module的关系:

module.exports = exports = {}  两者不能同时使用

导出示例:

//aa.js

var a = 1;

1)用exports导出:

      // exports.导出的数据别名 = 要导出的变量名/函数/对象等

      exports.m = a;   //a为要导出的变量,m为别名,导入模块之后,通过m可以得到a的值

      //导出一个函数,别名为fn

      exports.fn = function(){
            console.log('lllllll');
       }

     //用exports导出,必须要导出别名,否则接收不到数据

     exports=a   //接收不到数据

2)用module.exports导出

      /*module.exports可以导出一个模块,也可以导出多个,module.exports.导出的数据别名 = 要导出的变量名(如果只导出        一个模块(变量/函数/类等),可以省去别名),即匿名导出,但是导出多个必须加上别名,否则只会接受最后一个的值*/

      ① 导出一个:

        示例:

        // module.exports=a;  //匿名导出变量a

        module.exports.fn=function(){    
             console.log('hello')
         }

        导入:require('./aa.js');  //从bb.js导入aa.js模块,./代表当前路径

      ② 导出多个模块

       //示例:定义多个需导出的模块

       var f1 = function(){

           .........

         }

        var v1 = 3;

        var f2 function(){

          ..........

         }

         var o1 = {name:"张三"}

         ..........

         //导出方式1:

         module.exports.fn1 = fn1;

         module.exports.fn2 = fn2;

         module.exports.o1 =o1;

         module.exports.v1 = v1;

         //导出方式2:  

         module.exports = {

           fn1:fn1,

           fn2:fn2,

           v1:v1,

           o1:o1

           }

        //当k:v中k和v同名时,可以只写k  

        module.exports = {

           fn1,

           fn2,

           v1,

           o1

           }

         // 导入: var bbb = require('./aa.js')

         // 使用模块:console.log(bbb.v1);        var ff = bbb.f1();

注意:

var myfile1 = require('./myfile1');  //默认去同级目录内部的myfile1文件夹下寻找index.js作为入口

var myfile2 = require('myfile2');  //去node_modules文件夹内部寻找myfile2 文件夹,把index.js作为入口;如果没有index.js,自动去package.json文件中寻找main的值并将之作为入口文件,如果同级目录下找不到node_modules,会向上寻找,但不会向下寻找

根据参数的不同格式,require命令去不同路径寻找模块文件(如下是阮一峰先生的博客原文)

(1)如果参数字符串以“/”开头,则表示加载的是一个位于绝对路径的模块文件。比如,require('/home/marco/foo.js')将加载/home/marco/foo.js。

(2)如果参数字符串以“./”开头,则表示加载的是一个位于相对路径(跟当前执行脚本的位置相比)的模块文件。比如,require('./circle')将加载当前脚本同一目录的circle.js。

(3)如果参数字符串不以“./“或”/“开头,则表示加载的是一个默认提供的核心模块(位于Node的系统安装目录中),或者一个位于各级node_modules目录的已安装模块(全局安装或局部安装)。

commonJs特点(引用网友观点):

所有代码都在模块作用域内运行,不会变量污染;

运行时加载,无法在编译的时候的静态优化;

按照模块在在代码中出现的顺序加载模块

浏览器不兼容commonJs

2)npm的介绍:

     npm是随node.js一起安装的包管理工具

  • 允许用户从NPM服务器下载别人编写的第三方包到本地使用;
  • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用;
  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

常用的npm命令:

① 初始化: npm init -y

② 安装node.js模块:   npm install 模块名

     eg:  npm install/i express [-g全局安装不加则是本地安装]

     使用下载的模块时,直接 require('模块名')即可:   var express = require('express')

③ 查看所有全局安装的模块:  npm list -g

④ 查看某个模块的版本信息 如express:npm list express

⑤  卸载express模块:npm uninstall express 

⑥ 更新express模块: npm update express

⑦ 查找express模块: npm search express

......

菜鸟教程:

3) node.js REPL交互式解释器

  进入REPL的方式:

  ①在命令提示符中输入 node命令进入环境

  ②直接开始那里搜索找到 node运行命令

 退出REPL的方式:

  按一次ctrl+c退出当前终端

  按两次ctrl+c退出REPL

    可以执行以下任务:

  •     读取用户输入,解析输入的JavaScript数据结构并存储在内存中
  •     执行输入的数据结构
  •     打印结果
  •     循环操作以上步骤(按两次ctrl+c退出)

4) node.js常用核心模块及其作用:

① path模块,文件路径操作

//node内置模块中,除了global,process和buffer,其他都要自己导入

//从node_modules中导入path模块(内置的),引入模块一般用const

const path = require('path')

var base = path.basename(__dirname);
//获取路径的最后一层地址(当前文件所在的文件夹名)
console.log(base)

var base1 = path.basename(__filename,'.js');
//获取当前文件名(不带后缀)
console.log(base1)

console.log(path.delimiter);
//获取环境变量的分隔符

console.log(process.env.PATH)
//获取环境变量

var dir = path.dirname(__dirname);
//获取当前路径的目录(当前文件夹的父级的完整目录,不包括当前文件夹)
console.log(dir);

var ext = path.extname(__filename);
//获取当前文件的后缀,可用于判断文件类型
console.log(ext)

//把路径字符串转化为对象
var parse = path.parse(__filename);
//把路径对象转化为字符串
var format = path.format(parse);

console.log(parse);
console.log(format);

//判断是否为绝对路径
var absolute = path.isAbsolute('\\D\try.txt');
console.log(absolute)

//拼接/解析路径
var jion = path.join(__dirname,'my/my.txt','..');
console.log(join)

//解析路径

var normalize = path.normalize('C:temp\\\\/\\/\\/foo/bar');
console.log(normalize);

//from a to b 的路径 ,相对路径
var relative = path.relative('C:\\orandea\\test\\aaa','C:\\orandea\\buu\\ddd');
console.log(relative);

//返回最后一个根路径,如果没有,会拼接当前路径
var resolve = path.resolve('/wwr','/stati_files/png','../gif/images.png');
console.log(resolve);

② fs模块,用于文件操作

const fs=require('fs');
const path=require('path');

// 创建目录
   fs.mkdir(path.join(__dirname,'folderName'),(err)=>{
       if(err) throw err;
       //...
   })

// 删除目录

fs.rmdir(path.join(__dirname,'folderName'),(err)=>{
    if(err) throw err;
    //...
})

// 写(/创建)文件
 fs.writeFile(path.join(__dirname,'myfile.html'),str,'utf-8',(err)=>{
      if (err) throw err;
      //...
  })

// 删除文件
   fs.unlink(path.join(__dirname,'myfile.html'),(err)=>{
       if(err) throw err;
       //...
   })

//检测文件状态
fs.stat(__filename,(err,stats)=>{
    if(err) throw err;
    console.log(stats.isFile()); //是否为一个文件
    console.log(stats.isDirectory());//是否为一个目录
})

//读目录
fs.readdir(__dirname,'utf-8',(err,files)=>{
    if(err) throw err;

})

// 读文件
 fs.readFile(path.join(__dirname,'09path.js'),'utf-8',(err,data)=>{
      // data得到的是buffer
      // 第一种:data.toString()
      // 第二种:设置编码:'utf-8'
      // console.log(data.toString());
      console.log('data')
  })

③ url模块,URL操作处理

④ http模块,网络操作

⑤ querystring模块,查询字符串处理

⑥ global模块

//在服务器端没有window对象,有global对象
global.console.log('111');

console.log(__dirname);
console.log(__filename);

var t1 = setInterval(()=>{
    console.log('111')
},2000)

clearInterval(t1)

var t2 = setTimeout(()=>{
    console.log('222')
},1000)
clearTimeout(t2)

⑦ process模块

//arch属性返回一个字符串,该字符串标识编译Node.js二进制文件所用的操作系统CPU体系结构
console.log(process.arch);

//返回一个数组,包括node.exe所在的路径、当前文件路径
console.log(process.argv);
 

5)原生node.js创建http服务器

① 导入http模块

const http = require('http');

② 创建http服务器

let server = http.createServer((req,res)=>{

})

③ 监听端口

server.listen(8989)

//也可以指定IP:

//server.listen('8989','172.20.16.101')

6)访问静态资源

./div/数字

模糊匹配

7) get请求和post请求

8)express创建服务器的方法,get,post,访问静态资源

9) websocket

10)cookie,session,storage

待更新。。。

 

 


 

 

 

 

 

参考文章:

commonJs的运行时加载 https://www.cnblogs.com/jerrypig/p/8145206.html

浅析 Node.js 单线程模型 https://blog.csdn.net/THMAIL/article/details/79025279

node.js的三大特点:https://blog.csdn.net/L1061256268/article/details/80461070

node.js和JavaScript的关系 https://www.cnblogs.com/thinkam/p/8262743.html

node.js和V8的关系  http://www.broadview.com.cn/article/419435

JS引擎-- Chrome V8 引擎入门  https://blog.csdn.net/kangle0228/article/details/82885672

ECMA-262与ECMAScript、JavaScript的联系 https://blog.csdn.net/weixin_36347219/article/details/79850071

浏览器渲染引擎到底做了什么 https://www.jianshu.com/p/281b574ee3f8

【NodeJS】深入理解Node.js基于事件驱动的回调 https://blog.csdn.net/u013451157/article/details/78755708

维基百科 :

Node.js  https://wikipedia.dx.gugeeseo.com/baike-Node.js

Javascript https://wikipedia.dx.gugeeseo.com/wiki/Javascript

V8 https://wikipedia.dx.gugeeseo.com/baike-V8_(JavaScript%E5%BC%95%E6%93%8E)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值