NodeJs
简介
是什么
是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
可以做什么
Node.js 作为一个 JavaScript 的运行环境,仅仅提供了基础的功能和 API 。然而,基于 Node.js 提供的这些基础功能,很多强大 的工具和框架如雨后春笋,层出不穷,所以学会了 Node.js ,可以让前端程序员胜任更多的工作和岗位!
- 可以快速构建
Web应用。 - 可以构建跨平台的桌面应用。
- 可以快速构建
API接口项目。 - 可以读写和操作数据库、创建实用的命令行工具辅助前端开发。
JavaScript 运行环境比对
浏览器中的 JavaScript
- `V8` 引擎
- 内置 `API`
1. `DOM`
2. `BOM`
3. `Canvas`
4. `xhr`
5. `js内置对象`
Node.js 中的 JavaScript
- `V8` 引擎
- 内置 `API`
1. `fs`
2. `path`
3. `http`
4. `querystring`
5. `js内置对象`
注意:
- 浏览器是
JavaScript的 前端 运行环境。(浏览器是客户端安装的软件)Node.js是JavaScript的 后端 运行环境。(正常情况下,Nodejs要安装到服务器上)Node.js中无法调用DOM和BOM等 浏览器内置API。
执行 JS 文件
- 打开终端
- 注意终端的路径,注意在此路径中,是否能找到你的js文件。
- 输入 “
node 要执行的js文件” - 执行文件的时候,需要保证
node xxx.js这种格式 - node只能运行JS代码(也就是 不要
node xxx.html)
模块化及其分类
模块化(了解)
AMDCMDCommonJS(Node中的模块化,使用的是这种方案)ES6
模块分类
-
自定义模块
NodeJS中,创建的JS文件都是自定义模块。(也就是处处皆模块)
- 导入
let 变量名 = require('相对路径') - 导出
module.exports={}
- 导入
-
内置模块(核心模块)
安装Node之后,自带了很多内置模块。我们可以直接加载使用他们。
导入
let fs = require('fs') let path = require('path') -
第三方模块
其他人编写的模块,发布到 npm 网站 上,我们可以下载使用。
fs 内置模块
- 读文件
- 异步读取操作
fs.readFile('相对路径','utf-8',(err,data)=>{}) - 同步读取操作
let data = fs.readFileSync('相对路径','utf-8')
- 异步读取操作
- 写文件
- 异步操作
fs.writeFile('相对路径', 数据 ,(err)=>{}) - 同步操作
fs.readFileSync('相对路径', 数据)
- 异步操作
注意:
读取到的文件返回的是字符串的形式;写操作时数据必须是字符串形式。因此用的
JSON进行类型转换。
- 追加内容
- 异步操作
fs.appendFile('路径', 数据 ,(err)=>{}) - 同步操作
fs.appendFileSync('路径', 数据)
- 异步操作
path 内置模块
-
获取后缀名
let filename = path.extname(文件) console.log(filename); -
拼接路径
- 正常拼接
let af = 'chao' let bf = 'ze' let cf = 'tie' let df = 'zhan' let ff = 'daodao.jpg' let file = path.join(af, bf, cf, df, ff) console.log(file); // chao\ze\tie\zhan\daodao.jpg - 带有返回上一级的拼接
let file1 = path.join(af, bf, cf, df, '../', ff) console.log(file1); // chao\ze\tie\daodao.jpg
因此后续的业务中可用于判断用户是否达到某个条件,满足可到下一层,不满足返回上一层。
- 正常拼接
-
获取文件绝对路径
代码语法如下:
console.log(__dirname); // 返回的是当前文件的绝对路径在
node.js中相对路径是相对于运行node的文件而言,因此会出现小错误,如下所示。有两个1.txt文件,现在我们在文件
code中运行子文件夹data的 1.js文件,1.js代码如下。const fs = require('fs') const path = require('path') let txt = fs.readFileSync('./1.txt', 'utf-8') console.log(txt);实现读取1.txt文件的内容,由于在文件夹
code外面执行里面的文件,因此我们可以手动加路径,运行后发现结果如下。可以发现被读取的是文件夹
code下的1.txt,因为我们在文件夹code下运行的代码,node根据相对路径来找,找到的是外面的文件。 为了解决这种麻烦,在node中更推荐使用绝对路径,用绝对路径拼接文件名的形式,如下所示。const fs = require('fs') const path = require('path') let file = path.join(__dirname, '1.txt') let file1 = fs.readFileSync(file, 'utf-8') console.log(file1);运行结果如下所示。
npm
介绍
-
本质 是
node包 管理器。管理node包的工具。npm这个工具,在安装node的时候,就已经安装到你的计算机中了。 查看npm版本号命令:npm -v -
作用
管理
node模块的工具。- 下载并安装第三方的模块
- 卸载第三方模块
- 发布模块
- 删除已发布的模块
总结:
npm就是一个管理(下载安装、卸载...)第三方模块的工具
第三方模块
本地模块
-
初始化
npm init -y初始化之后,会在项目目录中生成
package.json的文件。注意事项:
- package name 默认使用当前文件夹 当做 包的名字
- package name 不能有中文
- package name 不能有特殊符号
- package name 不能和需要安装的第三方模块同名
-
安装卸载命令 建议在安装第三方模块之前,先执行如下命令。 下面的命令只需要执行一次即可(不管以后重启vscode还是重启电脑,都不需要执行第二次)
npm config set registry https://registry.npm.taobao.org- 安装
npm i 模块名 模块名 - 卸载
npm un 模块名 模块名
- 安装
-
使用
- 和使用内置模块一样,需要使用
require加载模块。 - 调用模块提供的方法完成工作。
- 和使用内置模块一样,需要使用
全局模块
和本地模块的差异
- 全局安装的模块,不能通过
require()加载使用。 - 全局安装的模块,一般都是命令或者工具。
安装卸载命令
-
安装命令(多一个
-g)npm i 模块名 -g 或 npm i -g 模块名 ### mac 系统如果安装不上,使用下面的命令提高权限 sudo npm i -g 模块名 -
卸载命令(也是多一个
-g)npm un 模块名 -g -
全局安装的模块,在系统盘(C盘)
- 通过命令
npm root -g可以查看全局安装路径
- 通过命令
全局安装 nrm
nrm 是作用是切换镜像源(模块下载地址;模块下载的网站)。
全局安装
npm i -g nrm (mac系统前面加 sudo)
使用 nrm
nrm ls --- 查看全部可用的镜像源
nrm test --- 测试 每一个镜像地址的网络速度
nrm use taobao ---- 切换到淘宝镜像
package.json 文件
在初始化之后,会生成一个 package.json 文件。
-
main指定了模块的入口文件。
-
dependencies指定了当前项目所依赖(需要)的包,可以使用
npm i可以安装所有的依赖 。使用npm i 模块安装模块时,会将该模块记录到dependencies中,表示这是项目必须的模块。 -
scripts指定了运行脚本命令的npm命令行缩写,比如start指定了运行npm run start时,所要执行的命令。
require 加载机制
- 判断缓存中有没有,如果有,使用缓存中的内容
- 缓存中没有,那么表示第一次加载,加载完会缓存
-
判断模块名有没有带路径(./)
-
模块名中有路径,加载自定义模块(自己写的文件)
const xx = require('./xx')- 优先加载同名文件,加载一个叫做 xx 的文件
- 再次加载js文件,加载 xx.js 文件
- 再次加载json文件,加载 xx.json 文件
- 最后加载node文件,加载 xx.node文件
- 如果上述文件都没有,则报错 “Cannot find module './xx'”
-
模块名没有路径,优先加载核心模块,如果没有核心模块,则加载第三方模块
-
加载第三方模块的查找方式
- 优先在当前文件夹的node_modules里面查找第三方模块
- 在当前文件夹的上级目录的node_modules里面查找第三方模块
- 继续向上层文件夹查找第三方模块
开发一个属于自己的包
初始化
初始化,生成一个 package.json 文件
npm init -y
定义方法
在 index.js 中定义函数属性方法,用 module.exports={} 导出。创建一个 README.md 文档记录使用说明。
注册账号
- 访问 www.npmjs.com/ 网站
- 点击 sign up 按钮,进入注册用户界面
- 填写账号相关的信息
- 点击 Create an Account 按钮,注册账号
- 注册完账号,需要到邮箱中认证一下
发布
-
终端中,切换镜像源为npm(不能发布到淘宝,所以必须切换镜像源为npm主站)https://www.npmjs.com/ -
终端中,登录 npm 账号- 执行
npm login命令 - 输入账号
- 输入密码(输入的密码是看不见的,正常)
- 输入邮箱
- 执行
-
发布
- 注意,执行命令的文件夹,必须是包的根目录。
- 运行
npm publish命令,即可将包发布到 npm 上
知识点补充
for 和 forEach
forfor循环可以被打断,在函数内用return,函数体外用break。forEachforEach不可打断,即用return无效。
数组的方法
findfor返回满足条件的一个元素。findIndexforEach返回满足条件的一个元素的索引号。
const 改变的常量
在 JavaScript 中,用 const 声明的是一个常量,不可被更改,如下。
当我们对数组或对象的元素进行更改,不会报错,对象同理。
其中的原因就要说回数据类型了。在 JavaScript 中,数据类型分为简单数据类型和复杂数据类型。简单数据类型包括 number 、 boolean 、 string 、 undefined 、 null ,复杂数据类型包括 object 、 array 、 function 。
当我们声明一个简单数据类型,就会在栈空间开辟一块内存,存放这个数据,变量则指向这个空间地址。我们重新更改后会重新开辟一个新空间,让变量指向新的地址。
当我们声明一个复杂数据类型,就会在堆空间开辟一块内存,存放这个数据所在的地址,实际上这个数据存放在其他位置。我们更改其中的属性会把原数据的属性更改,但地址不会发生变化,因此不会报错。
如果我们把代码变成以下形式:
这样相当让变量 arr 重新指向一个新的地址,修改了其原本的指向,因此会报错。