API 文档:https://nodejs.dev/en/api/v18/documentation/
node.js 是一个服务端的 js 运行环境,客户端的 js 运行环境基本是服务器,对于 node.js 来说在服务端没有操作 DOM 等元素的 API,但是 node.js 有客户端没有的如文件读写的 API。
node.js 的最大优势是让前端开发者能够很轻松的开发服务端程序,因为 node.js 实际是 js 的运行环境,所以编写的也是 js 代码,对于前端开发者来说无需担心需要切换语言的问题。
node.js 的另一个优势是你可以明确知道自己的 js 运行在什么环境中,不像浏览器环境每个用户的浏览器版本可能各有差异。
实际上如果你有 Python 编程经验,会发现 node.js 和 Python 很像:
所以我们会先开始讲解 npm 的使用。node 的其他包管理工具如 yarn、pnpm 则是对 npm 做了不同的优化,实际使用方法是大同小异的。
这两个 json 文件基本是每个前端项目必被的文件,他们的用处是记录项目的依赖、保存作者信息、运行脚本等,功能非常丰富。
一般我们使用 npm install 安装依赖,会把依赖安装到 ./node_modules 下,而 package.json 的一个功能就是保持安装的依赖的名称。对于 package-lock.json,他保存的是实际的依赖的版本和该依赖的依赖项。通过 npm install 的依赖的版本一般格式为x.y.z,其中代表的含义是:
而实际安装的版本可能会比较模糊,这是因为在版本号之前,可以添加如下修饰:
例如 ^1.2.1可以安装1.5.2,但是不能安装 2.0.0。
package.json 的作用就是保持实际安装的版本。
npm install 可以简写为 npm i
更新依赖
删除依赖
这里主要介绍 node 提供的 API
https://nodejs.dev/en/learn/reading-files-with-nodejs/
可用于替代原生 fs 的 fs-extra
读文件 readFile
const fs = require('fs/promises') // require('fs') 回调版 API
async function readFile(name) {
const file = await fs.open(name, 'r')
console.log(await fs.readFile({encoding: 'utf-8'}))
}
写文件 writeFile
const fs = require('fs/promises') // require('fs') 回调版 API
async function readFile(name) {
const file = await fs.open(name, 'r')
console.log(await fs.writeFile('content'))
}
其中 fs.open 方法的模式有:
https://nodejs.dev/en/learn/reading-files-with-nodejs/
const path = require('path')
path.join('a', 'b') // a\b
path.resolve('a') // 用当前文件的绝对路径拼接参数
const note = '/home/user/note.txt'
path.basename(note) // note.txt
path.extname(note) // .txt
path.dirname(note) // /home/user
// 第二个参数传入文件的扩展名,则会获取文件的文件名而不带扩展名
path.basename(notes, path.extname(notes)); // note
常用方法:
const fs = require('fs/promises')
async function test() {
const fileStat = await fs.stat('./note.txt')
fileStat.isFile() // true
fileStat.isDirectory() // false
fileStat.size // 1024000 1MB
fileStat.isSymbolicLink() // false
}
回调操作方法
具体参数情况见官方文档
同步操作方法
在方法名后面加个 Sync
fs.readdirSync().map(file => path.resolve(file))
process.argv 保存了 cmd 参数,该数组的前两个值分别是
process 对象无需通过 require 引入
输入 node main.js name=tom age=10 199,main.js 后面的字符串会被以空格分隔填入数组,所以参数数组的值为 ['/bin/node', '/root/main.js', 'name=tom', 'age=10', 199]。更好的方法是使用 minimist 解析参数。
用 chalk 输出带样式的文本。
进度条
Progress
https://nodejs.dev/en/learn/accept-input-from-the-command-line-in-nodejs/
该页面提供了其他更加方便的包
const readline = require('readline').createInterface({
input: process.stdin,
output: process.stdout,
});
readline.question(`What's your name?`, name => {
console.log(`Hi ${name}!`);
readline.close();
});