Node.js到底是什么
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型。
是框架?❌ 库?❌ 语言?❌
⚠️统统不是⚠️
Nodejs -> JavaScript运行平台/运行时(platform / Runtime)
什么是运行平台/运行时
定义:运行平台一般就是指一个代码的运行环境
作用:开发者可以使用指定的编程语言,基于某个环境开发特定的应用
🏷️ 平台就是为编程语言「赋能」,基于某个环境开发特定的应用
Node.js可以做什么
平台的作用就是提供「舞台」
- 理论上平台没有绝对只能干什么的限制
平台提供的能力 约等于 提供的底层APIs
- 能不能实现,就看有没有相应的API
🌟 Node.js「无所不能」,既然「无所不能」,为何没有「无处不在」❓
人员角度:
- Node.js平台采用的语言是JavaScript,适合前端开发者使用
技术角度:
- Node.js平台的特点是非阻塞IO,适合处理高并发请求
结论:
- Node.js适合开发服务器端的中间层(BFF)
- Node.js适合用于开发前端方向的各种工具
webpack、Gulp、vite、BABEL、TS 等
Node.js全局对象
global
__filename
__filename 表示当前正在执行的脚本的文件名
__dirname
__dirname 表示当前执行脚本所在的目录
setTimeout(cb, ms)
clearTimeout(t)
setInterval(cb, ms)
console
process
exit: 当进程准备退出时触发。 beforeExit: 当 node 清空事件循环,并且没有其他安排时触发这个事件。通常来说,当没有进程安排时 node 退出,但是 'beforeExit' 的监听器可以异步调用,这样 node 就会继续执行。 uncaughtException:当一个异常冒泡回到事件循环,触发这个事件。如果给异常添加了监视器,默认的操作(打印堆栈跟踪信息并退出)就不会发生。 Signal 事件:当进程接收到信号时就触发。信号列表详见标准的 POSIX 信号名,如 SIGINT、SIGUSR1 等。 stdout:标准输出流。 stderr:标准错误流。 stdin:标准输入流。 argv:argv 属性返回一个数组,由命令行执行脚本时的各个参数组成。它的第一个成员总是node,第二个成员是脚本文件名,其余成员是脚本文件的参数。 env:返回一个对象,成员为当前 shell 的环境变量 pid:当前进程的进程号。 title:进程名,默认值为"node",可以自定义该值。 arch:当前 CPU 的架构:'arm'、'ia32' 或者 'x64'。 platform:运行程序所在的平台系统 'darwin', 'freebsd', 'linux', 'sunos' 或 'win32' mainModule:require.main 的备选方法。不同点,如果主模块在运行时改变,require.main可能会继续返回老的模块。可以认为,这两者引用了同一个模块。 abort():这将导致 node 触发 abort 事件。会让 node 退出并生成一个核心文件。 cwd():返回当前进程的 工作 目录 exit([code]):使用指定的 code 结束进程。如果忽略,将会使用 code 0。 memoryUsage():返回一个对象,描述了 Node 进程所用的内存状况,单位为字节。 nextTick(callback):一旦当前事件循环结束,调用回调函数。
为何一定要掌握Node.js?
理由一:现代化的Web开发离不开
- 定制打包、构建等自动化任务需求
- 高体验的开发服务器需求
理由二:高性能Web服务的中间层
- 非阻塞IO、事件循环,处理高并发,天生高手
- 前端人也能轻易玩转的服务端技术,更适合中间层
小案例:批量修改文件名字
- mkdir renames
index.jspackage.json1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const fs = require('fs')
const path = require('path')
fs.readdir(process.cwd(),(err,files)=>{
console.log(files,'files')
files.forEach(item => {
fs.rename(
path.join(process.cwd(),item),
path.join(process.cwd(),'prefix_'+item),
err=>{
if(err) throw err
console.log(`${item}-->prefix_${item}`)
}
)
});
})1
2
3
4
5
6
7
8
9
10
11
12
13{
"name": "renames",
"version": "1.0.0",
"description": "",
"main": "index.js",
"bin": "index.js", // 脚本
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
- mkdir renames
- npm link 软连接
- 测试
- 测试
Node.js可以满足前端开发中那些「奇怪」的想法
- 自动化创建项目
- 自动化构建
- 自动化测试
- 自动化部署
- 跨平台转译
Node.js开发Cli工具
- mkdir myvuecli
npm init –y
tsc –init
package.jsoncli.ts1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17{
"name": "myvuecli",
"version": "1.0.0",
"description": "",
"main": "index.js",
"bin": "cli.js",
"scripts": {
"build": "tsc"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"ejs": "^3.1.7",
"inquirer": "^8.2.4"
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#!/usr/bin/env node
const inquirer = require('inquirer')
const path = require('path')
const fs = require('fs')
const ejs = require('ejs')
inquirer.prompt([
{
type:'input',
name:'name',
message:'Project name::'
}
]).then((answers:object)=>{
const tempDir = path.join(__dirname,'templates')
const destDir = process.cwd()
fs.readdir(tempDir,(err:object,files:Array<string>)=>{
if(err) throw err
files.forEach((file:string)=>{
console.log(file)
ejs.renderFile(path.join(tempDir,file),answers,(err:object,result:string)=>{
if(err) throw err
fs.writeFileSync(path.join(destDir,file),result)
})
})
})
console.log(answers,'answers answers',destDir)
})
- mkdir myvuecli
- npm run build
- npm link
- mkdir testvuecli
- cd testvuecli -> myvuecli
- cd testvuecli -> myvuecli
- 本文链接:http://example.com/2020/05/01/node/what/
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。