当前位置: 首页 > news >正文

[JS] node.js 入门

API 文档:https://nodejs.dev/en/api/v18/documentation/

目录

  • 是什么?
  • 为什么
  • 怎么做
    • npm
      • package.json 和 package-lock.json
      • 包的安装、删除、更新
        • npm install
        • npm update
        • npm uninstall
    • node
      • 文件操作
        • 读写文件
        • 文件路径操作
        • 文件状态
        • 回调操作文件方法和同步操作文件方法
      • 解析 cmd 参数
      • 样式化输出
      • 读取用户输入

是什么?

node.js 是一个服务端的 js 运行环境,客户端的 js 运行环境基本是服务器,对于 node.js 来说在服务端没有操作 DOM 等元素的 API,但是 node.js 有客户端没有的如文件读写的 API。

为什么

node.js 的最大优势是让前端开发者能够很轻松的开发服务端程序,因为 node.js 实际是 js 的运行环境,所以编写的也是 js 代码,对于前端开发者来说无需担心需要切换语言的问题。
node.js 的另一个优势是你可以明确知道自己的 js 运行在什么环境中,不像浏览器环境每个用户的浏览器版本可能各有差异。

怎么做

实际上如果你有 Python 编程经验,会发现 node.js 和 Python 很像:

  • 都有包管理工具(node 的默认为 npm, Python 的默认为 pip)
  • 除包管理工具外自带环境(node、python)

所以我们会先开始讲解 npm 的使用。node 的其他包管理工具如 yarn、pnpm 则是对 npm 做了不同的优化,实际使用方法是大同小异的。

npm

package.json 和 package-lock.json

这两个 json 文件基本是每个前端项目必被的文件,他们的用处是记录项目的依赖、保存作者信息、运行脚本等,功能非常丰富。
一般我们使用 npm install 安装依赖,会把依赖安装到 ./node_modules 下,而 package.json 的一个功能就是保持安装的依赖的名称。对于 package-lock.json,他保存的是实际的依赖的版本和该依赖的依赖项。通过 npm install 的依赖的版本一般格式为x.y.z,其中代表的含义是:

  • x 不向后兼容的大版本更新
  • y 添加新功能,但向后兼容的小版本更新
  • z 对版本的补丁,一般是修复 bug 之类的,不会添加新功能

而实际安装的版本可能会比较模糊,这是因为在版本号之前,可以添加如下修饰:

  • ^ 表示 y 兼容
  • ~ 表示 z 兼容

例如 ^1.2.1可以安装1.5.2,但是不能安装 2.0.0

package.json 的作用就是保持实际安装的版本。

包的安装、删除、更新

npm install

  • npm install packagename@version
  • npm install 安装 package.json 中的所有依赖
  • npm install packagename@version -g 全局安装依赖
  • npm install -save 指明在当前项目目录安装依赖(默认,但是 5.0 版本前需指定)
  • npm install -D 或 npm install -dev 安装开发依赖,这些依赖不会被生产环境的代码打包

npm install 可以简写为 npm i

npm update

更新依赖

npm uninstall

删除依赖

node

这里主要介绍 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 方法的模式有:

  • r 读
  • r+ 读写文件,文件不存在创建文件
  • w+ 读写,从头开始写,文件不存在则创建
  • a 在文件末尾添加数据,文件不存在则创建
  • a+ 读写文件,在文件末尾添加数据

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

常用方法:

  • join
  • resolve
  • dirname
  • basename
  • extname
  • parse 提取文件的信息,返回一个对象,包括 root、name、ext 等文件信息

文件状态

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
}

回调操作文件方法和同步操作文件方法

回调操作方法

  • 第一个参数为 err
  • 第二个参数为 fs

具体参数情况见官方文档

同步操作方法
在方法名后面加个 Sync

fs.readdirSync().map(file => path.resolve(file))

解析 cmd 参数

process.argv 保存了 cmd 参数,该数组的前两个值分别是

  1. node 二进制文件的路径
  2. 被执行的文件的路径

process 对象无需通过 require 引入

输入 node main.js name=tom age=10 199main.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();
});

相关文章:

  • 卸载mysq并重新安装教程
  • 合并后 ETH 的供应变化以及是否会出现通缩
  • 装饰器模式【Java设计模式】
  • Qt 学习(四) —— qrc资源文件介绍与使用
  • 【云原生之Docker实战】使用Docker部署Alist网盘直链程序
  • 数据结构与算法——左程云05
  • STM32——2.4G无线通信实验
  • 【C语言数据结构】03.双链表
  • 非零基础自学Java (老师:韩顺平) 第23章 反射(reflection) 23.2 反射机制
  • (一)Java算法:二分查找
  • [前缀和]Tokitsukaze and Strange Inequality Codeforces1678C
  • Stl中map、set 容器(数据结构:AVL树、红黑树)--C++
  • Chapter20: Machine Learning for In Silico ADMET Prediction
  • Ubuntu下安装Miniconda
  • No1.搭建基本的密码模式请求token(授权服务端)
  • 230. Kth Smallest Element in a BST
  • 5、React组件事件详解
  • CentOS从零开始部署Nodejs项目
  • Iterator 和 for...of 循环
  • JAVA并发编程--1.基础概念
  • Java多线程(4):使用线程池执行定时任务
  • JAVA多线程机制解析-volatilesynchronized
  • Laravel核心解读--Facades
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • python学习笔记-类对象的信息
  • 入手阿里云新服务器的部署NODE
  • 一份游戏开发学习路线
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 找一份好的前端工作,起点很重要
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 大数据全解:定义、价值及挑战
  • #include
  • #pragma multi_compile #pragma shader_feature
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (9)目标检测_SSD的原理
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (一)SpringBoot3---尚硅谷总结
  • (转)C#调用WebService 基础
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .Net 6.0 处理跨域的方式
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net 按比例显示图片的缩略图
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • []串口通信 零星笔记
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)
  • [C# 开发技巧]如何使不符合要求的元素等于离它最近的一个元素
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
  • [Go WebSocket] 多房间的聊天室(三)自动清理无人房间
  • [Godot] 3D拾取
  • [IE9] IE9 beta版下载链接