Node.js是一个基于Chrome V8 JS引擎构建的开源、跨平台JS运行环境。允许开发者在服务器端运行JS代码从而实现前后端统一的开发语言。Node.js具有事件驱动、非阻塞I/O模型使其非常适合于构建高性能的网络应用。Node不是编程语言Node.js是一个JS运行时类似于Java的JREJava Runtime Environment它提供了API环境、运行环境能够让JS代码可以在服务端运行。换句话说JS是脚本语言脚本语言都需要一个解析器才能运行对于HTML中的JS浏览器充当了这个解析器而对于需要独立运行的JSNode就是一个解析器。同时Node还提供了可以对文件系统、网络等进行操作的API允许使用JS和一系列的模块Node.js大部分基本模块都是用JavaScript语言编写来编写服务端应用和网络相关的应用如web服务器。在Node.js出现之前JavaScript通常作为客户端程序设计语言使用以JS写出的程序往往在用户的浏览器上运行Node的出现使得JS能够用于服务端编程。优点高性能和可扩展性Node采用事件驱动和非阻塞I/O模型使它能够处理大量并发连接而不需要为每个连接创建一个新的线程。V8引擎的高效性能使得Node能快速执行JS代码统一的开发语言使用JS进行前后端开发减少了开发者需要学习的语言数量简化了开发过程。丰富的生态系统Node拥有庞大的包管理系统npm提供了大量的模块和库供开发者使用极大地提高了开发效率。轻量级和灵活性Node.js的模块系统使得应用程序可以按需加载模块保持轻量级并且容易进行扩展。缺点单线程限制尽管Node通过异步编程来处理并发但它本质上是单线程的这可能会在处理CPU密集型任务时造成瓶颈。回调地狱由于Node.js大量使用回调函数代码可能会变得难以维护和阅读尤其是在嵌套多个回调时。不适合CPU密集型应用Node.js更适合I/O密集型应用而不是需要大量计算的任务。使用场景实时应用例如聊天应用和在线游戏Node的事件驱动模型非常适合处理实时数据。数据流应用如视频流或音频流应用Node.js可以有效处理数据流。API服务Node可以快速构建RESTful API因为它能够高效处理HTTP请求。微服务架构由于其轻量级和快速启动特性Node.js非常适合构建微服务。服务器端应用适用于需要处理大量并发请求的服务器端应用如代理服务器。客户端应用工具如webpack、vue脚手架、react脚手架、小程序等。脚本语言是一种编程语言通常用于编写短小的程序脚本以自动执行任务、处理数据或控制其他软件和系统。这些语言通常具有以下特点解释执行脚本语言一般是解释执行的而不是编译执行的。这意味着代码在需要的时候由解释器逐行执行而不是提前编译为机器代码。简单易用脚本语言通常具有简洁的语法易于学习和使用适合快速开发。动态类型多数脚本语言是动态类型的变量类型可以在运行时决定。适合集成脚本语言通常用于集成和控制其他软件应用比如系统工具、数据库、网页浏览器等。npm是Node.js的默认包管理工具用于安装、管理和共享JavaScript库和应用程序安装和管理包开发者可以使用npm来安装和管理项目依赖的第三方包。版本管理npm可以管理包的版本确保项目使用正确的版本。发布和共享开发者可以通过npm发布自己的包并与社区共享。脚本运行npm可以运行自定义脚本帮助开发者自动化各种任务。安装Node时npm也会被安装在系统中node环境的安装,官网下载安装包,直接装在你的电脑操作系统内部,需要通过命令行来打开nodenpm是Node.js生态系统的重要组成部分提供了一个庞大的开源模块库帮助开发者快速构建和扩展应用。npm的包库包含了数百万个包涵盖了各种功能和工具极大地丰富了Node的开发能力。npm通过package.json文件管理项目的依赖关系开发者可以定义项目需要的包及其版本。Node和npm的结合使得JS开发不仅限于浏览器端也可以在服务器端进行从而实现全栈开发。npm作为Node.js的包管理工具极大地简化了模块的安装和管理过程促进了Node.js社区的发展和壮大。node版本1.Node.js的版本发布遵循固定的时间表通常每年会发布两个主要版本一个在4月份作为Current版本另一个在10月份作为LTS版本。每个版本的支持周期如下Current版本从发布之日起的6个月内处于Current状态然后转为LTS版本。LTS版本偶数通常是LTS从转为LTS版本开始有18个月的活跃支持期随后进入12个月的维护支持期。Maintenance维护版维护版是已经过了活跃支持期的LTS版本主要接收安全更新和关键修复。2.nvm Node Version ManagerNode版本管理工具允许开发者在同一系统上安装和切换不同版本的Nodenvm安装开始 下载nvm - nvm中文官网安装最新版本的Node.jsnpm install node安装特定版本的Node.jsnpm install 14.17.0切换到特定版本仅当前终端生效nvm use 14.17.0设置默认版本当前终端未生效但新打开终端生效nvm alias default 14.17.0列出所有已安装的Node.js版本nvm ls卸载指定版本nvm uninstall 14.17.03.nodemon 工具专门用来执行 js 文件的工具,依赖 node 环境运行,当文件发生变化的时自动重启npm install --global nodemon // 下载nodemon --version // 检测npm uninstall --global nodemon // 卸载nodemon 文件名称 // 执行js文件(和使用 node 运行 js 文件是一样的)1.模块化Node基于Commonjs模块化开发的规范它定义一个JS文件就称之为一个模块导出: module.exports {num: num}、exports.键 值导入: require(./b.js) .js 后缀可以省略不写对比ES6模块化的导入导出export导出 / import导入2.运行js文件node a.js 以 node 这个 软件 来运行 该 js 文件cd 切换到指定目录下不可切换盘符tab按键可以快速切换目录补齐目录名cd.. 回到上一级目录盘符: 切换盘符dir 当前目录下有哪些文件或文件夹md 文件名创建文件夹rmdir 文件夹名删除文件夹cls、clear清屏ipconfig: 查看电脑ip地址信息systeminfo查看操作系统信息pwd 显示当前所在目录路径ls() 列出当前目录中的所有文件touch 新建一个文件 后边直接跟文件名字rm 删除一个文件 后边直接跟名字mkdir 新建一个目录(文件夹)rm-r 删除一个文件夹爱 rm-r src 删除目录rm - rf / 删除电脑中全部文件!! 禁用mv 移动文件reset 清屏 初始化终端clear 清屏history 查看命令历史help 帮助exit 退出mkdir 创建新目录mkdir -p /path/to/your/directory 创建多级目录结构即使中间的目录不存在3.1内置模块fsfile system对文件和文件夹的操作处理const fs require(fs) 引入fs模块fs.readFile(文件路径, utf8’, (err,data) {}) 异步读取文件内容,格式默认 buffer, 常用utf-8fs.readFileSync(文件路径, 格式)同步读取文件内容返回读取到的文件内容fs.writeFile(文件路径写入的内容err {}) 异步写入文件内容文件存在会覆盖内容文件不存在会创建一个新文件fs.writeFileSync(文件路径写入内容)同步写入文件内容fs.existsSync(path) // 检查文件是否存在 返回true/false,(async为异步)// 获取文件信息异步fs.stat(文件,(err,stats) {stats.isDirectory() // 是否是目录文件夹stats.isFile() // 是否为文件stats.size // 文件大小(以字节为单位)})fs.unlink(文件路径,err {}) // 删除文件异步3.2内置模块path(处理文件的路径)const path require(path) 引入path模块path.join(/a, b, c),返回值: 组装好的是相对路径信息/a/b/cpath.resolve(a, ../b, c), 返回值: 组装好的装成一个绝对路径信息__filename全局变量当前正在执行的脚本的文件名完整/绝对路径__dirname全局变量当前执行脚本所在的目录路径目录的绝对路径不同的系统中路径的/不同有时是\path.basename(c:/a/b/c/d.html) // 获取文件名称 d.htmlpath.dirname(c:/a/b/c/d.html) // 获取目录名c:/a/b/cpath.extname(c:/a/b/c/d.html) // 获取路径中文件扩展名后缀 .html拼装文件绝对路径path.resolve(__dirname, family.db);3.3内置模块osoperation system操作系统相关的方法和属性const os require(os) // 引入os模块os.EOL: 根据不同的操作系统生成不同的换行符window \r\nlinux下面 \nos.cpus() : cpu相关信息os.totalmen() : 总内存大小单位字节os.freemem() : 空余内容大小os.hostname() : 主机名os.type() : 系统类型3.4内置模块url操作网址const url require(url)url.parse(): 解析网址解析成对象协议、auth、hostname、port、qyery3.5内置模块querystring用于解析和格式化url查询字符串URL地址的get形式传参的实用工具const querystring requirequerystringquerystring.parse(foobarabcxyz) // 将query字符串转为对象querystring.stringify({ foo: bar,abc: xyz}) // 对象转为query字符串querystring.decode(foobarabcxyz) // 将query字符串转为对象querystring.encode({ foo: bar,abc: xyz}) // 对象转为query字符串类似JSON.parse()、JSON.stringify()3.6内置模块hppt用来开启 http 服务的(主流的三个Web服务器软件是Apache、 Nginx 、IIS)DNS做域名服务器,动态域名解析系统作用将域名转化成IP地址const http require(http) 导入hppt模块const sever http.createServer(函数) 创建web服务对象实例sever.on(request,(request,response){})// request: 接受客户端请求对象它包含了与客户端相关的数据和属性request.url 客户端请求的uri地址request.method 客户端请求的方式 get或postrequest.headers 客户端请求头信息(对象)// response:服务器对客户端的响应对象response.setHeader(content-type, text/html;charsetutf-8) // 设置单个响应头信息 用于响应时有中文时乱码解决处理response.setHeader(状态码状态描述{响应头信息}) // 可设置多个响应头信息response.statusCode 200默认是200// 设置状态码常见的HTTP状态码有200404301、302、304、403、401、405、500502response.end(hello world) // 向客户端发送响应数据,并结束本次请求的处理过程sever.listen(8080, (){}),启动服务// 1. 导入http模块 const http require(http); // 2. 创建web服务实例 const server http.createServer(); // 3. 监听request请求 server.on(request, (req, res) { // 输出hello world // res.end(hello world); if (req.url /) { res.end(hello world); } if (req.url /html5) { res.end(hello h5); } }); // 4. 启动服务 server.listen(8080, () { // 仅是提示作用可以不写但是建议写 console.log(server is running at http://127.0.0.1:8080); });静态资源服务器专门保存html、css、js、图片、音频、视频等服务器const http require(http); const path require(path); const fs require(fs); // 创建web实例 const server http.createServer(); // 监听request事件 server.on(request, (req, res) { // 获取当前用户访问的资源路径 let uri req.url; // 由于“/”没有实体资源需要将“/”做处理如果访问“/”则让其对应访问“/index.html” if (uri /) { uri /index.html; } // 默认情况下浏览器在第一次请求网站的时候会访问“/favicon.ico”图标文件如果没有也会出现404 // 如果需要解决这个问题则有3种方式 // 方式1去找个ico文件存放在静态资源的public目录下命名为“favicon.ico” // 方式2在处理的时候忽略“/favicon.ico”文件的处理也就是下面的加了判断的写法 // 方式3不管不用处理其不影响页面的显示 if(uri ! /favicon.ico){ // 读取文件fs模块将内容返回给用户res.end let filename path.join(public, uri); // 判断文件是否存在 if (fs.existsSync(filename)) { fs.readFile(filename, (err, data) { if (!err) { // ok res.end(data); } else { // 不ok res.setHeader(Content-Type, text/html;charsetutf-8); res.statusCode 500; res.end(请求资源出现错误。。。); } }); } else { res.setHeader(Content-Type, text/html;charsetutf-8); res.statusCode 404; res.end(你要找的资源失踪了。。。); } } }); // 监听端口启动服务 server.listen(8080, () { console.log(server is running at http://127.0.0.1:8080); });get接口获取数据const http require(http);const url require(url);http.createServer((req, res) {let { query } url.parse(req.url, true);}).listen(8080)post接口获取数据需要监听req对象的data事件接收请求提交过来的数据的来获取客户端发送到服务器的数据。如果数据量比较大无法一次性发送完毕则客户端会把数据切割后分批次发送给服务器。每次触发data事件时收到的数据只是全部数据的一部分因此需要做数据的拼接才能得到完整的数据const http require(http);const queryString require(querystring);http.createServer((req, res) {let arr [];req.on(data, buffer {arr.push(buffer);});// 数据传输结束了req.on(end, () {// 拼接接受到的所有数据let buffer Buffer.concat(arr);let post queryString.parse(buffer.toString())console.log(post);});}).listen(8080)爬虫http.get()代理const http require(http)// 下载并导入第三方模块http-proxy-middlewareconst {createProxyMiddleware} require http-proxy-middliware// 推荐方式1,需要在localhost3000访问可成功代理let fn createProxyMiddleware(/api, {target: http://www.17989.com/xiaohua/, // 要代理的目标地址changeOrigin: true, // 改变源头必加// 最终的代理目标地址相当于target自定义地址比如/api// 是否从最终的目标地址中去掉或替换一部分pathRewrite: {/api }})// 方式2帮助理解,需要在localhost3000/xiaohua/访问才能成功代理let fn createProxyMiddleware(/xiaohua/, {target: http://www.17989.com/xiaohua/,changeOrigin: true,})const sever http.createSever((req, res){fn(req, res)})express基于 Node.js 平台快速、开放、极简的 Web 开发框架。是一个 npm 上的第三方包提供了快速创建 Web 服务器的便捷方法。使用Express开发框架可以非常方便、快速的创建Web网站的服务器或API接口的服务器下载 express: $ npm install express下载 art-template(提供模板引擎解析语法):$ npm install art-template下载 express-art-template(让 atr-template 和 express 合作): $ npm install express-art-templateconst express require(express) // 创建服务 const app express() // 配置服务的静态资源 app.use(/public, express.static(./client)) // 配置文件读取引擎(需要用到 expres-art-template) app.engine(html, require(express-art-template)) // 配置所有文件的处理 app.use(/page, (req, res) { const path req.url.slice(1) // 利用 express-art-template 提供的 res.rander 方法 去读取指定的文件内容 // 注意: 文件需要放在 views 文件夹内 res.render(path, { title: 啥都有 首页, list: [ 100, 200, 300, 400, 500 ] }) }) // 监听一个指定的端口号 app.listen(6060, () console.log(监听 6060 端口号成功了)) // 去到命令行, 用 node 执行当前文件使用express处理静态资源// 使用 express 框架搭建一个服务器 const express require(express) const fs require(fs) // 1. 创建服务 // 语法: express() // 返回值: 一个服务 const app express() // 配置所有静态资源文件 // 我们把所有静态资源约定一个共同点, 当你需要静态资源文件的时候, 请求都以 /public 开头 // 将来前端需要 css/index.css 文件的时候, 就请求 /public/css/index.css app.use(/public, express.static(./client)) // 配置各种内容 // 目前已后端为主, 设计了一个 /a, 返回的是 index.html 文件 // 当前端需要 index.html 文件的时候, 请求 /a // 这个是一个随便书写的内容, 完全没有语义化 // 既然可以自己定义, 修改成 /index.html app.use(/index.html, function (req, res) { fs.readFile(./client/index.html, utf-8, (err, data) { if (err) return console.log(err) res.end(data) }) }) // 既然 index.html 可以成功 // 那么我们就可以把 xxx.html 放在一起书写 // 我们还可以把 xxx.css 放在一起书写 // 我们还可以把 xxx.js 放在一起书写 // 我们还可以把 xxx.jpg 放在一起书写 // ... // 我们可以把上面的内容分成两类 // 1. 页面文件(html) // 2. 静态资源(css, js, 图片) // express 框架给我们提供了一个叫做 static 的方法 // 专门用来处理静态资源文件的 // 语法: express.static(文件夹名称) // 作用: 按照你写的文件夹去自动查找内容自动帮你返回给前端 // 2. 监听一个端口 // 语法: 服务.listen(端口号, 回调函数) app.listen(8080, () console.log(监听8080 端口成功)) /* // 将来只要前端发送 /public/xxx 的请求 // 都会去到 ./client 文件夹下查找文件, 自动返回 app.use(/public, express.static(./client)) // 例子: // 前端请求 /public/css/index.css // 拿到 /public 后面的内容, 也就是 /css/index.css // 和 ./client 组合在一起, 得到 ./client/css/index.css // 自动读取 ./client/css/index.css 文件, 返回给前端 // 前端请求 /public/js/index.js // 拿到 /public 后面的内容, 也就是 /js/index.js // 和 ./client 组合在一起, 得到 ./client/js/index.js // 自动读取 ./client/js/index.js 文件, 返回给前端 // 前端请求 /aaa/css/index.css // 不会去按照 static 规则定义了 */nodemon 工具专门用来执行 js 文件的工具,依赖 node 环境运行,当文件发生变化的时自动重启npm install --global nodemon // 下载nodemon --version // 检测npm uninstall --global nodemon // 卸载nodemon 文件名称 // 执行js文件(和使用 node 运行 js 文件是一样的)基础路由const express require(express) const app express() // 配置服务的静态资源 app.use(/public, express.static(./client)) // 配置文件读取引擎(需要用到 expres-art-template) app.engine(html, require(express-art-template)) // 配置所有文件的处理 app.use(/page, (req, res) { const path req.url.slice(1) // 利用 express-art-template 提供的 res.rander 方法 去读取指定的文件内容 // 注意: 文件需要放在 views 文件夹内 res.render(path, { title: 啥都有 首页, list: [ 100, 200, 300, 400, 500 ] }) }) // 判断你请求了什么内容, 我给出对应过得结果 // 两个基础语法 // app.get(请求地址, 处理函数) // app.post(请求地址, 处理函数) app.get(/aaa, (req, res) { // res.end 只能返回一个 字符串 类型 // const obj { // code: 1, // message: 登录成功 // } // // 为了能把 obj 传递回去 // // 需要 把 obj 转换成 字符串 // // josn 格式 // const str JSON.stringify(obj) // res.end(str) // 当你使用 express 的时候, express 为你提供了一个方法叫做 send() // 你可以向里面填写任意数据类型, express 会自动判断你的数据类型, 决定要不要帮你转换成 字符串 // res.send(hello world) res.send({ code: 1, message: 注册成功 }) }) app.post(/login, (req, res) { // 拿到前段传递来的数据, 进行数据库比对, 告诉他登录成功失败 res.send({ code: 1, message: 我接收到你用 post 发送的 /login 请求了 }) })