什么是node.js
- 什么是node.js
- 一个基于 Chrome V8 引擎的JS 运行时(运行环境)
- 就是给了我们除了浏览器之外的一个地方去运行JS,就在我们的电脑系统上
- 曾经有一个伟大的靓仔,把chrome 内的v8引擎,拿出来并且和其他的东西做了一些结合,然后叫做Node.js
- node.js 和我们在浏览器运行(前端JS)有什么区别
- 前端JS: 把JS引入到一个HTML文件中,然后运行在浏览器中
- 此时JS的内容包括:BOM + DOM + ES
- Node.js:把JS直接运行到电脑系统中,所以BOM和DOM就不能使用了,只剩下ES规范了,但也因为直接运行到电脑系统中,所以还有一些别的功能
- => 直接操作电脑的文件/文件夹
- => 直接操作数据库
- 前端JS: 把JS引入到一个HTML文件中,然后运行在浏览器中
- node.js和前端JS的区别2
- 前端JS: 运行的时候可以采用模块化语法,也可以采用非模块化语法
- 不采用非模块化语法也能运行的一个原因: 我们是把很多个js引入到某一个html文件中
- node.js: 因为没有这个html文件去承载多个JS文件,所以node内,必须使用模块化语法
- 模块语法基于CommonJS
- ES6的推出时间15年 node.js的推出时间09年
- JS代码是没有错误的
- 一个JS的代码,如果将来我们需要运行在浏览器中,那么此时可以书写BOM/DOM
- 如果是运行在node.js中,我们就不能书写BOM/DOM的一些方法
如何运行node.js
- win1: (不推荐使用)
-
- window + r,输入cmd 敲回车
-
- 在这小黑窗内 输入一个node 敲回车
-
- 此时就进入了node的运行环境(类似于浏览器的控制台)
-
- 退出的时候,按下两次ctrl + c
- 弊端:书写的代码,无法保存
-
- mac1:
-
- 打开终端
-
- 输入node 敲回车
- 弊端:书写的代码,无法保存
-
- win2:
-
- 将要运行的JS代码,书写在一个.js文件内
-
- 打开文件所在目录,在地址内输入cmd敲回车
-
- 输入命令:node 文件名(文件名可以只写头部,用Tab补全)
-
- mac2:
-
- 将要运行的JS代码,书写在一个.js文件内
-
- 拖拽文件所在目录到终端这个图标上
-
- 输入指令:node 文件名(文件名可以只写头部,用Tab补全)
-
- win3:
-
- 将要运行的JS代码,书写在一个.js文件内
-
- 在vscode编辑器内,左侧的目录树,右键你的.js文件,点击"集成终端打开"
-
- 输入指令:node 文件名(文件名可以只写头部,用Tab补全)
-
- 终端内容太多,想要清屏
-
- 重开终端
-
- win: cls mac: clear
-
node模块化语法
- node 模块化语法(CommonJS)
- 如果一个JS文件将来需要运行在node中,那么这个文件,内部 天生带一个变量module,这个变量中有一个属性 exports 默认值是一个空对象,我们可以向这个对象中添加一些属性,来达到导出的目的
- 这个文件中除了天生自带一个module 还有一个变量叫做exports
- 这个变量内部存储的是指向module.exports这个对象的地址
- 也就是说,如果你想导出的话,还有一个语法exports.age = 18
创建一个文件夹,将out.js和in.js放在里面
创建一个导出文件 out.js
- 导出方式
- 导出方式1: module.exports.name = '张三'
- 导出方式2: exports.age = 18
- 导出方式3: module.exports = [1, 2, 3]
创建一个导入文件 in.js
- 导入方式:
- const outObj = require('./out') //如果导入的文件后缀是.js那么可以省略后缀不写
- console.log(outObj)
- 导出方式1输出结果:
- 导出方式2输出结果:
- 导出方式3输出结果:
- 面试题: module.exports = [1, 2, 3]; exports = [4, 5, 6]; 这样导出,会输出什么?为什么
- 答: [1, 2, 3]
- 分析:
- module.exports 这个变量 默认的值是一个空对象, 在 40 行 我将这个 空对象更为了一个数组 [1, 2, 3]
- 将来导出的时候, 还会导出这个变量的值, 但是现在被我修改为了 [1, 2, 3]
- exports 这个变量 原本内部存储的是 指向 module.exports 的那个空对象
- 然后现在 我将这个变量内部的值 重新修改为了 一个数组 [4, 5, 6], 相当于切断了和原本对象的联系
- 所以这个 数组 [4, 5, 6] 跟导出就没有任何关联了, 只不过是修改了一个天生自带的变量的值 而已
- 所以 当前文件导出的内容为 [1, 2, 3]
- 分析:
node的模块
-
node 的模块:每一个JS文件,我们都称之为模块
-
模块的分类
-
- 自定义模块:自己写的Js文件
-
- 内置模块:node给我们提供的,比如:操作文件,开启一个小的服务器
-
- 第三方模块:由其他开发写完的代码(js模块),然后上传到一个仓库中(npm),我们去这个仓库中,将这个模块下载到本地,供我们使用
-
-
内置模块http
- 使用流程
-
- 导入到当前模块内
const http = require("http") console.log(http)-
- 按照说明文档去使用
const http = require("http") // 2.1 利用http模块搭建一个简易的服务器 const server = http.createServer((req, res) => { console.log('前端每访问一次,我就执行一次') /** * 第一个形参: 请求的内容(请求报文)在这个参数内 * 第二个形参: 响应的内容(响应报文)在这个参数内,我们想要返回给请求者的内容,可以添加到这个形参内部 */ // console.log('前端每访问我一次,我就输出一次') // console.log(req.url) if(req.url === '/a') { res.end('pageA') } if(req.url === '/b') { res.end('pageB') } }) // 2.2 给服务监听一个端口号 server.listen(8080, () => { console.log('服务器开启成功,端口号:8080') }) -
- 使用流程
补充_请求
- 什么算作一个请求
- => 浏览器地址栏内输入一个地址,敲下回车
- => 以浏览器为主体
- => 服务器的内容会返回给浏览器
- => html 中的link src href img
- => 以标签为主体
- => 服务端的内容会返回给标签
- => js代码中的ajax
- => 以ajax为主体
- => 服务端的内容会返回给ajax(xhr)
- 总结: 谁请求数据返回给谁
- => 浏览器地址栏内输入一个地址,敲下回车
- 完整的请求地址
- 地址 分为两个 相对地址 / 绝对地址
- 相对地址: 你打开的文件地址是什么,那么相对地址就按照你打开的文件进行拼接
- 绝对地址: 你写的是什么地址就是什么
- 例如: http://localhost:8080/a/b/c/index.html
- 如果你的地址写的是 './a/a.css
- 那么此时的完整地址是什么: http://localhost:8080/a/b/c/a/a.css
- 如果你的地址写的是 '../a/a.css/'
- 那么此时的完整地址是什么: http://localhost:8080/a/b/a/a.css
- 如果你的地址写的是 '/a.css'
- 那么此时的完整地址是什么: http://localhost:8080/a.css
- 地址 分为两个 相对地址 / 绝对地址
认识npm
- 认识 npm:基于 node.js的'包管理器',换句话说: 基于node.js的'软件管家'
- 但是这个'软件管家'不能下载软件,只能下载和JS相关的内容(比如 node的第三方模块),并且 这个'软件管家'没有UI界面,不能通过鼠标点击去操作,只能通过命令行输入命令(win和mac命令相同)
- 如何安装npm
- 在安装node.js的时候自带
- 如何检测npm是否安装
- 打开终端 输入命令 npm -v || npm --version
- npm的作用
- 下载一切和JS相关的第三方 (node 的第三方,框架的相关内容,组件库的相关内容)
- npm的使用
-
- 需要初始化,切换到项目的根目录
- 输入一个命令npm init (需要手动输入一些配置信息) || npm init - y
-
- 输入命令,npm install 包名 || npm i 包名 (例如:npm i lodash)
- 下载完成后,根目录内会多一个文件package-lock.json 和 一个目录node_modules
- package-lock.json: 下载的文件的小版本
- node_modules:下载的包在这个目录内
-
npm i lodash
npm i express
- 使用第三方模块流程
-
- 通过npm安装
-
- 引入到当前文件内
-
- 按照文档去使用
-
const _ = require('lodash');
var objects = [
{ a: 1 },
{ b: 2 },
];
var deep = _.cloneDeep(objects);
console.log(deep);
console.log(deep[0] === objects[0]);
- 运行结果: