目录

1. Node.js

2. Node.js 与 typescript有什么关系呢?

3. typescript 与 JavaScript

1)JavaScript是一种解释型语言。

2)TypeScript

4. REPL环境(Read Eval Print Loop): 交互式解释器

5. node中的js和浏览器中的js不同

1) 浏览器中的js

2) node中的js

6. node中的主要模块

1)path模块: path模块用于对路径和文件进行处理,提供了很多好用的方法。

2)fs模块: fs是File System的缩写,表示文件系统,用于文件操作。

3)events内置模块: 通过EventEmitter类实现事件统一管理

4)http模块:

5)url模块:

6)querystring模块

7)zlib模块

8)crypto模块

7. CommonJS规范

8. node中的包管理器npm

9. package.json 和 package-lock.json 区别


1. Node.js

       简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于 Chrome JavaScript 运行时建立的一个平台。Node.js 是一个事件驱动、非阻塞式I/O模型的服务端 JavaScript 环境,让JavaScript 运行在服务端的开发平台,它让JavaScript成为与PHPPythonPerlRuby等服务端语言平起平坐的脚本语言。它是基于 Google 的 V8 引擎,V8 引擎执行 Javascript 的速度非常快,性能非常好。

     

2. Node.js 与 typescript有什么关系呢?

       一个是运行环境,一个是语言。非要说关系那就是都和javascript有关系。typescript是javascript的超集,可编译成javascript,node.js是javascript的运行环境。

3. typescript 与 JavaScript

1)JavaScript是一种解释型语言。

       我们用到的浏览器基本上都支持JavaScript。JavaScript作为世界上最流行的计算机语言之一,但它的标准却叫“ECMAScript”。

        JavaScript是Netscape公司与Sun公司共同发布的,次年Navigator 2.0浏览器支持了JavaScript。随后微软模仿JavaScript发布了一款相近的语言,取名为JScript,IE3.0支持了JScript。Netscape公司为了抵制微软。网景公司将JavaScript提交给国际标准化组织ECMA。因为版权等原因。ECMA发布的JavaScript标准所以叫做“ECMAScript”。当然了,起这个名字也是突出发布者是ECMA。微软公司自然得遵守ECMAScript标准。

       1997年ECMA发布了ECMAScript 1.0,就是JavaScript第一个国际化标准版本。

       1998年6月,ECMAScript 2.0版发布。

       1999年12月,ECMAScript 3.0版发布,成为JavaScript的通行标准,得到了广泛支持。

       到2015年,到发布ECMAScript 6.0时,新功能提交太多了。往年都是先提交大版本,然后再逐步发布小版本。因此,2015年标准不能用以前版本号命名了,改用年份命名。ECMAScript 2015就成了“ECMAScript 6.0”的第一个版本。而“ECMAScript 6.0”本身应该是不存在的。现在大部分浏览器都支持到ECMAScript 5.1了。以上这些标准也可以简称ES5,ES6,ES2015,而ES6 既是一个历史名词,也是一个泛指,含义是 5.1 版以后的 JavaScript 的下一代标准,涵盖了 ES2015、ES2016、ES2017 等等,而 ES2015 则是正式名称,特指该年发布的正式版本的语言标准。所以,有时候提到ES6时候,一般是指 ES2015 标准,但有时也是泛指“下一代 JavaScript 语言”。

2)TypeScript

       TypeScript是微软开发的,更适合大型工程开发。JavaScript不适合大型开发(细节就不讨论了)。TypeScript是JavaScript的超集,这好比C++跟C语言的关系。但是,TypeScript不能被当前的浏览器直接支持,TypeScript要被编译成JavaScript才能被浏览器解释。既然要被编译成JavaScript,那当然要知道编译成哪个版本的了。所以,编译TypeScript的时候要指定是ES5,ES2015甚至ES2017这些版本号。

4. REPL环境(Read Eval Print Loop): 交互式解释器

        在命令行工具界面输入node 按回车 就进入到了REPL 环境。类似于浏览器中的 Console控制台 ,可以做一些代码测试。按ctrl + 两次c 退出REPL环境,但是, 我们 写代码肯定不是在控制台中写,而是写在一个单独的.js文件中。

         新建一个 hello.js 并写入以下示例代码:

         var message = 'Hello World!' console.log(message)

         打开命令行并定位到hello.js 文件所属目录,在命令行中输入node hello.js 回车执行

TypeScript与nodejs版本对应关系_javascript

5. node中的js和浏览器中的js不同

1) 浏览器中的js

        a) 遵循ECMAScript

        b) DOM:文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。它是一种与平台和语言无关的应用程序接口(API),它可以动态地访问程序和脚本,更新其内容、结构和www文档的风格(HTMl和XML文档是通过说明部分定义的)。文档可以进一步被处理,处理的结果可以加入到当前的页面。DOM是一种基于树的API文档,它要求在处理过程中整个文档都表示在存储器中。

       c) BOM:BOM(Browser Object Model) 是指浏览器对象模型,是用于描述这种对象与对象之间层次关系的模型,浏览器对象模型提供了独立于内容的、可以与浏览器窗口进行互动的对象结构。BOM由多个对象组成,其中代表浏览器窗口的Window对象是BOM的顶层对象,其他对象都是该对象的子对象。

2) node中的js

        a) 遵循ECMAScript

        b) 自己的API

        c) 没有DOM和BOM

6. node中的主要模块

1)path模块: path模块用于对路径和文件进行处理,提供了很多好用的方法。

          const path = require('path')

2)fs模块: fs是File System的缩写,表示文件系统,用于文件操作。

          const fs = require("fs")

3)events内置模块: 通过EventEmitter类实现事件统一管理

          const EventEmmiter = require('events')

       Node中的核心API都是基于异步事件驱动的:

       a) 在这个体系中,某些对象(发射器(Emitters))发出某一个事件;

       b) 我们可以监听这个事件(监听器 Listeners),并且传入的回 调函数,这个回调函数会在监听到事件时调用;

       发出事件和监听事件都是通过EventEmitter类来完成的,它们都属 于events对象:

       1) emitter.on(eventName, listener):监听事件,也可以使用 addListener;

       2) emitter.off(eventName, listener):移除事件监听,也可以使 用removeListener;

       3) emitter.emit(eventName[, ...args]):发出事件,可以携带一 些参数;

4)http模块:

        const http=require('http');

        http模块是Node.js原生模块中最为亮眼的模块。在传统的HTTP服务器会由Apache、Nginx、IIS之类的软件来担任,但是Node.js并不需要。Node.js的http模块本身就可以构建服务器,而且性能非常可靠哟!

       主要完成两大功能:a. 构建服务端服务 b. 客户端向HTTP服务器发起请求。

5)url模块:

        var url = require("url")

        它是nodejs里面的一个简单的模块,可以把url网址解析为一个对象。

        url一共提供了三个方法

        a.url.parse():方法会解析一个 URL 字符串并返回一个 URL 对象。

        b.url.format(urlObject):返回一个从 urlObject 格式化后的 URL 字符串。

        c.url.resolve(from, to):以一种 Web 浏览器解析超链接的方式把一个目标 URL 解析成相对于一个基础 URL。

6)querystring模块

        const querystring = require('querystring');

        querystring 模块提供了一些实用工具,用于解析与格式化 URL 查询字符串。

 

7)zlib模块

     

const zlib = require('zlib');
Node.js Zlib模块用于提供压缩和解压缩(zip和unzip)功能。它是使用Gzip和deflate / inflate实现的。
        a) 压缩http响应例子:
            const fs = require('fs')
            const zlib = require('zlib')
            const http = require('http')
            //通过zlib创建gzip对象
            const gzip = zlib.createGzip();
                 http.createServer((req, res) =>{
                 //创建可读流
                 let readStream=fs.createReadStream("./index.js")
                 //gzip传输文件,响应头要加上"Content-Encoding":"gzip" ,不然浏览器无法解析gzip的文件
                 res.writeHead(200,{
                       "Content-Type": "application/x-javascript;charset=utf-8",
                       "Content-Encoding":"gzip"
                })
               //把可读流通过管道时先经过gzip压缩后,在送到res可写流当中去
               readStream.pipe(gzip).pipe(res)
               }).listen(3000,()=>{
              console.log("server start")
              })
         b) 压缩文件示例
             const zlib = require('zlib');
             const gzip = zlib.createGzip();
             const fs = require('fs');
             const inp = fs.createReadStream('input.txt');
             const out = fs.createWriteStream('input.txt.gz');
             inp.pipe(gzip).pipe(out);

8)crypto模块

       crypto模块的目的是为了提供通用的加密和哈希算法。用纯JavaScript代码实现这些功能不是不可能,但速度会非常慢。Nodejs用C/C++实现这些算法后,通过crypto这个模块暴露为JavaScript接口,这样用起来方便,运行速度也快。

  1. CommonJS规范

        在node.js环境中,默认支持模块系统,该模块系统遵循CommonJs规范。一个 JavaScript 文件就是一个模块,在模块文件中定义的变量和函数默认只能在模块文件内部使用,如果需要在其他文件中使用,必须显式声明将其进行导出。CommonJS模块规范主要分为模块导出(也叫模块定义)、模块引用两个部分。模块导出(module.exports或exports)和模块导入(require)。

8. node中的包管理器npm

       NPM的全称是Node Package Manager,是一个NodeJS包管理和分发工具,已经成为了非官方的发布Node模块(包)的标准。2020年3月17日,Github宣布收购npm,GitHub现在已经保证npm将永远免费。

       npm常见的使用场景有以下几种

      (1) 允许用户从NPM服务器下载别人编写的第三方包到本地使用。

      (2) 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。

      (3) 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

9. package.json 和 package-lock.json 区别

      (1) package.json 是在运行 “ npm init ”时生成的,主要记录项目依赖,主要有以下结构:

      name:项目名,也就是在使用npm init 初始化时取的名字.

      main:入口文件,一般都是 index.js

      description:描述信息,有助于搜索。

      version:版本号。

      keywords:关键字,有助于在人们使用 npm search搜索时发现你的项目。

      scripts:支持的脚本,默认是一个空的 test。

      license :默认是 MIT。

      dependencies:指定了项目运行时(生产环境)所依赖的模块。

      devDependencies:指定项目开发时所需要的模块,也就是在项目开发时才用得上,一旦项目打包上线了,就将移除这里的第三方模块。

       (2) package-lock.json 是在运行 “npm install” 时生成的一个文件,用于记录当前状态下项目中实际安装的各个 package 的版本号、模块下载地址、及这个模块又依赖了哪些依赖。

       为什么有了package.json,还需要 package-lock.json 文件呢?

       当项目中已有 package-lock.json 文件,在安装项目依赖时,将以该文件为主进行解析安装指定版本依赖包,而不是使用 package.json 来解析和安装模块。因为 package 只是指定的版本不够具体,而package-lock 为每个模块及其每个依赖项指定了安装的版本,位置和完整性哈希,所以它每次创建的安装都是相同的。无论你使用什么设备,或者将来安装它都无关紧要,每次都应该给你相同的结果。