什么是Node.js
Node.js是一个基于Chrome V8引擎的JavaScript运行环境。
Node.js是JavaScript的后端运行环境,因此Node.js中是无法调用DOM和BOM等浏览器内置API。
Node.js官网
安装
证明安装成功:
打开cmd(终端),输入:
node -v
常见终端命令
执行命令 例如: node test.js
node 要执行的js文件的路径
终端中的快捷键
tab键,能够快速补全路径
esc键,能够快速清空当前输入的命令
输入cls命令,清空终端
fs文件系统模块
fs模块是Node.js官方提供的,用来操作文件的模块。
readFile(path [, options ], callback)
运行
node 1.js
writeFile(path, data[, options], callback)
注意:
在使用fs模块操作文件时,如果提供的操作路径是./或者…/开头的相对路径,很容易出现路径动态拼接错误的问题。
原因:代码在运行时候,会以执行node命令时所在的目录,动态拼接出被操作文件的完整路径。
解决方法:绝对路径
__dirname 表示当前文件所处的目录
// 导入fs模块
const fs = require("fs");
fs.writeFile(__dirname + "/2.txt", "写入的内容111", (err) => {
if (err) {
console.log("写入错误" + err);
}
});
path路径模块
path模块是Node.js官方提供的、用来处理路径的模块。例如:
path.join() 用来拼接多个路径片段
path.basename() 用来从路径字符中,将文件名解析出来。
// 导入fs模块
const fs = require("fs");
const path = require("path");
fs.writeFile(path.join(__dirname, "/2.txt"), "写入的内容111111", (err) => {
if (err) {
console.log("写入错误" + err);
}
});
http模块
http模块是Node.js官方提供的、用来创建web服务器的模块。
// 1.导入http模块
const http = require("http");
// 2.创建web服务器实例
const server = http.createServer();
// 3.为服务器实例绑定request事件,监听客户端的请求
/*
req: 请求对象,包含与客户端相关的属性和数据。例如:
req.url 是客户端请求的url地址
req.method 是客户端的Method请求类型
res: 响应对象,包含与服务器相关的属性和数据
res.end() 想客户端发送指定的内容,并结束此次请求的处理过程
*/
server.on("request", function (req, res) {
// 获取url地址
const url = req.url;
let content = "<h1>404</h1>";
if (url === "/") {
content = "<h1>首页</h1>";
} else if (url === "/about.html") {
content = "<h1>关于</h1>";
}
// 为防止中文显示乱码的问题,需要设置响应头 Content-Type
res.setHeader("Content-Type", "text/html; charset=utf-8");
res.end(content);
});
// 4.启动服务器
server.listen(8080, () => {
console.log("server is running at http://127.0.0.1:8080");
});
模块化
Node.js中根据模块来源的不同,将模块分为了3大类,分别是:
- 内置模块(有Node.js官方提供的,例如fs、path)
- 自定义模块(用户创建的每个.js文件)
- 第三方模块
module对象
每个.js自定义模块中都有一个module对象,它里面存储了和当前模块有关的信息。例如:
外界用require()方法导入自定义模块时,得到的就是module.exports所指向的对象。
Node.js中的模块化规范
node.js遵循了CommonJS模块化规范,CommonJS规定了模块的特性和各模块之间如何相互依赖。
CommonJS规定:
- 每个模块内部,module变量代表当前模块
- module变量是一个对象,它的exports属性是对外的接口
- 加载某个模块,其实就是加载改模块的module.exports属性。require()
npm与包
什么是包?
Node.js中第三方模块又叫做包。npmjs
初次装包完成后,在项目文件夹下多一个node_modules的文件夹和package-lock.json的配置文件。
其中:
node_modules文件夹用来存放所有安装到项目中的包。require()导入第三方包时,就是从这个目录中查找并加载包。
package.json配置文件用来记录node_modules目录下的每一个包的下载信息。例如包的名字、版本号、下载地址等。
- 安装包的命令,可以用@指定版本
npm install 包的名字@2.22.2 - 快速创建package.json文件
npm init -y - npm install命令,npm包管理工具会先读取package.json中的dependencies节点,然后一次性下载所有记录的包
- npm uninstall 包名
用来卸载已经安装的包
package.json配置文件说明
{
"name": "nodejs",
"version": "1.0.0",
"description": "",
"main": "1.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"moment": "^2.29.4"
},
"devDependencies": {
"eslint": "^8.25.0"
}
}
- dependencies节点,用来记录npm install命令安装了那些包
- devDependencies节点。如果某些包只在开发阶段会用到,在项目上线后不会用到,则建议把这些包记录到devDependencies节点中。与之对应的,如果某些包在开发和项目上线之后都需要用到,则建议把这些包记录到dependencies节点中。
// 安装指定的包,并记录到devDependencies节点中
npm i 包名 -D
// 注意:上述命令是简写模式,等价于下面完整的写法:
npm install 包名 --save-dev
解决下包速度慢的问题
在使用npm下包的时候,默认是从国外的 https://registry.npmjs.org服务器进行下载。
方法:切换到国内的包镜像源
查看当前的下包镜像源
npm config get registry
将下包的镜像源切换为淘宝镜像源
npm config set registry=https://registry.npm.taobao.org/
为了更方便的切换下包的镜像源,我们可以安装nrm这个小工具,利用nrm提供的终端命令,可以快速查看和切换下包的镜像源。
通过npm 包管理器,将nrm安装为全局可用的工具
npm i nrm -g
查看可用的镜像源
nrm ls
将下载的镜像源切换为taobao镜像
nrm use taobao
模块的加载机制
- 模块在第一次加载后会被缓存。这也意味着多次调用require()不会导致模块代码被执行多次。
- 内置模块的加载优先级最高
- 使用require()加载自定义模块时,必须指定以./或…/开头的路径标识符。在加载自定义模块时,如果没有指定上述路径标识符,则node会把它当作内置模块或者第三方模块进行加载。
- 目录作为模块
当把目录作为模块标识符,传递给require()进行加载的时候,有三种加载方式:- 在被加载的目录下查找一个叫做package.json文件,并寻找main属性,作为require()加载的入口
- 如果目录里没有package.json文件,或者main入口不存在或无法解析,则Node.js将会试图加载目录下的index.js文件
- 如果上述都失败了,则报错。cannot find module xxx