文章内容输出来源:拉勾教育前端就业急训营2期
node.js
官网链接:https://nodejs.org/zh-cn/
node.js不是一门语言,也不是javaScript框架,是除了浏览器之外,可以运行javaScript代码的环境
1、Node.js下运行JavaScript
(1)脚本运行,node xx.js
(2)交互模式,node + 回车
打开交互模式,js代码
运行代码,.exit
退出交互模式
2、全局对象
Node.js下的全局对象是global
在交互模式下,声明的变量和函数都属于global,例如var a = 1;global.a
可以访问到。
在脚本模式下,声明的变量和函数不属于global,例如var a = 1;global.a
访问不到。
注意:Node.js不能访问浏览器端的全局对象window,如下图
3、全局函数
JavaScript语言提供的全局函数,在Node.js下依然可用。例如:
- parseInt/parseFloat/isNaN/isFinite/eval…
- 一次性定时器(setTimeout / clearTimeout)
- 周期性定时器(setInterval / clearInterval)
Node.js 环境也提供了一些全局函数
- 立即执行定时器(setImmediate / clearImmediate)
- 进程立即执行定时器(process.nextTick)
4、Node.js模块
模块(包)是Node.js应用程序的基本组成部分,大部分前端工程化的工具,也是以模块的形式存在的。
Node.js模块
模块类型 | 说明 | 学习链接 |
---|---|---|
内置模块 | 官方提供的,核心模块,跟随 Node.js 一起安装 | http://nodejs.cn/api/ |
自定义模块 | 工程师自己开发 | 工程师自己开发 |
第三方模块 | 社区维护的,需要单独下载才能使用 | https://www.npmjs.com/ |
4.1 console
输出函数
var obj = {
name: 'tom'
}
console.log(obj); // 输出 { name: 'tom' }
console.table(obj);//表格形式输出
┌─────────┬────────┐
│ (index) │ Values │
├─────────┼────────┤
│ name │ 'tom' │
└─────────┴────────┘
计时函数
//计时函数
console.time('for'); //计时开始
for(let i = 0; i < 1000000; i++){
}
//注意:此时的for一定要与计时开始时的label保持一直,否则会报错
console.timeEnd('for') //计时结束
4.2 process
process
对象是一个全局变量,提供了有关当前 Node.js 进程的信息并对其进行控制。
// process是全局变量,使用时,无需引入,引入也不报错,但是没有必须引入
// const process= require("process");
console.log(process)
//输出当前版本
console.log(process.version) //v14.16.0
//输出操作系统架构
console.log(process.arch) // x64
//输出操作系统平台
console.log(process.platform) // win32
//环境变量
console.log(process.env)
//自定义环境变量
process.env.NODE_ENV = 'develop'
console.log(process.env.NODE_ENV) // develop
//获取进程编号
console.log(process.pid) //(系统分配,每次执行不一样)
//杀死进程
process.kill() //参数:进程编号
4.3 path
path模块提供了有关路径操作的函数,使用之前,需要通过require引入(类似Java中的import)
// 引入
const path = require("path")
//获取当前文件所在的路径
console.log(process.cwd())
console.log(__dirname)
//获取当前文件所在的路径
console.log(process.cwd())
//获取当前文件所在的路径
// dir = directory 目录 C:\Users\ROG\Desktop\拉钩教育\fed-e-task-base-03-01\code
console.log(__dirname)
//获取当前文件的完整路径 C:\Users\ROG\Desktop\拉钩教育\fed-e-task-base-03-01\code
console.log(__filename)
//获取文件的扩展名 .js
console.log(path.extname(__filename))
// 获取路径中的目录部分 C:\Users\ROG\Desktop\拉钩教育\fed-e-task-base-03-01\code
console.log(path.dirname(__filename))
//获取路径中的文件名 path.js
console.log(path.basename(__filename));
// 相当于../
const t = path.join(__dirname, '..')
console.log(t) // C:\Users\ROG\Desktop\拉钩教育\fed-e-task-base-03-01
//将多个路径合并起来
const a = path.join("d:/",'a', 'b')
console.log(a) // d:\a\b
4.4 fs
fs(file system)提供了文件操作的API
1、文件写入
const fs = require("fs");
fs.writeFile('./1.txt','我是写入的内容', (err)=>{
if(err){
throw err;
}
console.log("写入成功")
});
2、文件读取
var flieName = path.join(__dirname, './1.txt');
fs.readFile(flieName, (err, data)=>{
if(err) throw err;
//data是二进制数据,但是以16进制数据输出
console.log(data);
console.log(data.toString()) // 我是写入的内容
})
3、删除文件
var flieName = path.join(__dirname, './1.txt');
fs.unlink(flieName, (err)=>{
if(err) throw err;
console.log("刪除成功")
})
4、追加写入
//追加写入
fs.appendFile(__dirname + '/2.txt', '曾经有一首歌是这样唱的', err => {
if(err) throw err;
console.log("追加成功")
})
5、创建目录
const fs = require("fs");
//创建目录
fs.mkdir('./a', err => {
if(err){
throw err;
}
console.log("success");
})
6、删除目录
// 删除目录 rmdir 只能删除空目录
// 先删除目录下的普通文件,再通过rmdir删除空目录
fs.rmdir('./a', err => {
if (err) {
throw err;
}
console.log("删除成功");
})
7、重命名
//重命名
fs.rename(__dirname + "/a1", __dirname + "/a11", err => {
if (err) {
throw err;
}
console.log("重命名成功");
});
8、读目录
fs.readdir(__dirname, (err, data) => {
if(err) throw err;
console.log(data.length); //文件夹和文件都可以读取出来
data.map((d)=>{
console.log(d);
fs.stat(__dirname + '/' + d, (err, stat) => {
if(err) throw err;
if(stat.isDirectory()){ //判断是否是目录
console.log("目录:", d);
}else if(stat.isFile()){
console.log("文件:", d);
}
})
})
9、文件流
为什么选择"流"?
1、内存效率提高
无需加载大量的数据,将大数据切成小块,占用内存更少。
2、时间效率提高
接获数据后立即开始处理,无需等到内存填充满。
const fs = require("fs");
//1、创建读取流
var readStream = fs.createReadStream('./file2.txt')
//2、创建写入流
var writeStream = fs.createWriteStream('./file_stream.txt')
//3、把读取流通过管道传递给写入流
readStream.pipe(writeStream);
4.5 http
const http = require("http")
/**
* 创建服务器
*/
const server = http.createServer((req, res) => {
res.statusCode = 200
res.setHeader("Content-type", "text/plain;charset=utf-8")
res.end("你好,node.js")
})
/**
* 发布web服务
*/
const port = 3000;
const host = "localhost"
server.listen(port, host, ()=>{
console.log(`服务器运行在htp://${host}:${port}`)
})
4.6 自定义模块
-
Node.js中每个单独的.js文件,就是一个模块。
-
每个模块中都有一个module变量,代表当前模块。
-
module的exports属性是对外的接口
-
- 只有导出的属性和方法才能被外部调用。
- 未导出的内容是模块私有,不能被外部访问。
-
使用时,通过require引入(路径写对)
4.7 模块的加载逻辑
按照组织模式划分
- 文件模块:一个独立的.js文件
- 目录模块:将多个.js文件放在一个目录中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I7hIQLLU-1616634844114)(C:\Users\张艳杰\AppData\Roaming\Typora\typora-user-images\1616228666540.png)]
默认index.js是入口文件,如果没有index.js,则在package.json中查找main对应的属性值。
例如,指定入口文件是a.js:
{
"main": "a.js"
}
4.8 第三方模块
想要使用第三方模块,需要单独安装,学习网站:https://www.npmjs.com/
npm:(node package manager)npm是一个命令,跟随node.js一起安装。(npm --version)npm可以下载(安装)包和包的依赖,npm安装:npm install <package-name>
npm镜像源:npm管理的Node.js包的资源管理地址,https://www.npmjs.com/。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fhTkAs8p-1616634844115)(C:\Users\张艳杰\AppData\Roaming\Typora\typora-user-images\1616229832908.png)]
修改镜像源:
npm config set registry https://registry.npm.taobao.org
获取当前镜像源
npm config get registry
4.9 npm
npm安装包的方式:
- 全局安装:多个项目都能用到(把包当全局工具使用)
- 项目安装:还有当前项目用到
全局安装:
例如:安装使用minify:https://www.npmjs.com/package/minify
安装:npm install p-name -g
卸载:npm uninstall p-name
项目安装:
1、创建项目目录(mkdir project
)
2、进入项目(cd project
)
3、初始化项目(npm init
)
4、在项目中安装
安装:npm i p-name --save
npm i p-name -S
例如:
//安裝
npm install minify --save
//执行压缩
.\node_modules\.bin\minify index.js > ./index.mini.js