nodejs
各个版本当前的维护情况(10.x已经不再维护,12.x在2022年4月30日停止维护,14.x在2023年4月30日停止维护,16.x在2024年4月30日停止维护)。个人觉得当前应该使用的版本是MAINTENANCE LTS START
的,ACTIVE LTS START
应该没有MAINTENANCE LTS START
的稳定,所以现在直到2022-10-18
都应使用14.x
安装
需要注意的是,关于npm的所有命令,最好都不要用root用户执行,否则会出现各种不可预料甚至连官方文档都说不清的问题
稳定版:
1 | centos用下面命令安装指定版本nodejs |
安装package.json 直接npm install
后面不加package.json的名字
package.json文件
1 | { |
常用语法
类
1 | // 声明一个类 |
nodejs原生http请求
- 无需安装任何package
1 | const https = require('https') |
命令行
1 | process.argv // 从命令行接收参数 |
ECSMAScript/es6概念
export
和import
是es6
之后才支持的es的重要版本
1
2
3
4
5
6
7ES6 ES2015 # 2015年6月发布, 之后每年6月出一个新版本
ES7 ES2016
ES8 ES2017
ES9 ES2018
ES10 ES2019
ES11 ES2020
ES12 ES2021一些比较使用的新的语法
1
2
3// 解构赋值
const [a, b, c] = [value1, value2, value3]
const {name, age} = obj
常用命令
- 报名前面带”@”符号的,表示是属于某个组织,又组织上传到镜像源里面的
Nvm
- 可以通过
node -v > .nvmrc
将当前node版本限制在文件中,之后在当前目录只需要执行nvm use
即可自动选择对应的版本
可以通过nvm
来同时使用多个node
版本,mac上可以直接brew install nvm
进行安装(其他平台直接官网安装方法),安装完成后根据提示添加sh
的rc
文件,常用命令如下:
1 | nvm ls-remote # 查看所有可用的node版本 |
npm
1 | npm init # 将当前目录设置为一个npm库,自动生成package.json文件,如果没有package.json文件可以用这个方法生成,它也会自动把node_module下的已安装包加进来的 |
Yarn
yarn
从1.10x
开始会在yarn.lock
中增加integrity
字段,用于验证包的有效性- yarn真的笔npm快,而且每次lock文件的变动要少一些
1 | yarn add 包名 # 安装包 |
TypeScript
给js引入type,使开发更加严谨
引入步骤:
npm install --save-dev typescript @types/node
- 初始化
./node_modules/.bin/tsc --init
- 最后使用
tsc
命令进行编译,将它放入package.json
的scripts
里面即可
配置
1
2
3
4
5
6
7
8
9{
"compilerOptions": {
"target": "es5", // 生成的代码的语言版本
"skipLibCheck": true, // 跳过类型声明文件的类型检查
"allowSyntheticDefaultImports": true, // 运行import x from 'y'这种操作,即使模块没有显示指定default的到处
"strict": true, // 开启严格模式
},
"include": ["src"], // 搜索ts文件的路径
}函数定义
1
2// 可变参数
function test(field1: string, ...fields: string)常用类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14interface MyType {
[key: string]: string; // mapping类型
}
type MyType = {
username: string;
pass: string;
}
type Type2 = keyof MyType; // Type2会被解析为'username'|'pass'
enum MyEnum { // 注意定义枚举的时候要把key和value都写出来,如果写成enum MyEnum {VALUE1, VALUE2}这样可能会导致后面无法拿来匹配值,无论字符串还是枚举都匹配不上
VALUE1 = 'VALUE1', VALUE2 = 'VALUE2', VALUE3 = 'VALUE3'
}自定义类型:
1
2
3
4
5interface MyType {
name: string;
children: MyType2[]; // 定义数组
[index: number]: { id: number; label: string; key: any };
}常见错误
- Object is of type ‘unknown’ typescript generics: 如果程序无法判断准确的类型,那么我们需要强制声明一下类型,例如
(error as Error).message
- Property ‘classList’ does not exist on type ‘Never’: 对于react的ref需要这样定义:
const myEl = useRef<HTMLDivElement>(null);
- window undefined: 尝试生命一个window对象
1
2
3
4export interface CustomWindow extends Window {
customAttribute: any;
}
declare let window: CustomWindow;
- Object is of type ‘unknown’ typescript generics: 如果程序无法判断准确的类型,那么我们需要强制声明一下类型,例如
使用Forever管理NodeJs应用(生产环境最好用pm2)
- 直接使用
sudo npm install forever -g
进行安装
forever常用命令
1 | forever list # 查看当前所有管理的服务 |
常用包推荐
adm-zip: 制作zip包工具,很多lambda函数都需要将仓库打包成zip文件,这个库就很有用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16const AdmZip = require('adm-zip');
const zip = new AdmZip();
zip.addLocalFolder('../repo', './', (path) => {
if (path.includes('node_modules') || // 忽略特定的文件夹
path.includes('build/') ||
path.includes('dist/') ||
path.includes('.zip') ||
path.includes('logs/')
) {
return false;
}
return true;
});
zip.writeZip('./repo.zip');bcrypt: 非常推荐的安全的密码/密码hash库,不用自己维护盐值,它是把计算次数和盐值都放到hash值里面去了
dotenv: 支持.env文件读取环境变量
1
2
3
4
5
6
7
8
9
10
11// 默认读取项目根目录的.env文件,也可以自定义.env文件的路径
import { config } from 'dotenv';
config({
path: '../.env',
});
// 使用require的方式
require('dotenv').config({
path: `configs/${process.env.NODE_ENV}.env`,
});human-numbers:转换数字的大小K、M、B、T,不过它其实就一个方法,都可以不用它这个包
node-csv: 读写CSV文件的库,它由cdv-generate,csv-parse,csv-transform,csv-stringify几个部分组成,一个一次性安装,也可以单独安装
object-sizeof: 获取变量所占内存的大小,有时候非常需要这样的东西
randomstring: 生成随机字符串
uuid: uuid首选version 4,每秒生成10亿个,大约需要85年才会重复
yup: 非常简单且易于集成的认证库
TroubleShooting
Permission Denied问题,使用npm命令总是会出现这个问题,解决方法最简单的是把npm目录的拥有者修改为当前用户的名字
sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}
安装包时报错Unexpected end of JSON input while parsing near ‘ : ‘ 尝试先执行
npm cache clean --force
,然后再安装gyp: No Xcode or CLT version detected!: 需要先安装
xcode
命令工具:xcode-select --install
npm install结果被系统killed掉了: 一般是内存不足,可以使用增加swap的方法,参考Linux 手册
ReferenceError: describe is not defined NodeJs: 应该是
mocha
这个测试库报的错,安装它即可:npm install mocha -g
wasm code commit Allocation failed - process out of memory: 在Apple m1(apple silicon)上npm编译失败,可以尝试将
node
升级到v15.3.0
及以上a promise was created in a handler but was not returned from it: 通常是
bluebird
报错,函数没有正确地返回,遇到这个情况一个是验证回掉函数then
是否有正确的返回,如果没有,那么可以添加一个return null
语句,需要注意的是,如果then
回掉里面只有一个语句,例如.then(res => res + 'abc')
,这样不用单独写return
,但如果里面的语句不只一句就得加了Node Sass does not yet support your current environment: Windows 64-bit with Unsupported runtime (88):
npm rebuild node-sass
Error: spawn ../node_modules/optipng-bin/vendor/optipng ENOENT: 尝试执行
npm rebuild
this._settlePromiseFromHandler is not a function: 尝试删除
node_module
目录并重新安装gulp: command not found:
npm install gulp-cli -g
SyntaxError: Unexpected token export: 尝试使用
module.exports = XXX
来到处模块或方法Unsupported platform for fsevents@1.4.9: wanted {“os”:”darwin”,”arch”:”any”} (current: {“os”:”win32”,”arch”:”x64”}: 原因是在m1的mac上面安装了该包并上传了自己的
package-lock.json
,得清理一下缓存才行了:1
2
3
4rm -rf node_modules package-lock.json
npm cache clean --force
npm cache verify
npm install --verboseUncaught Error: ENOENT: no such file or directory, uv_cwd: 检查一下当前目录是否还存在文件,node_modules这些目录是否还在
error TS2694: Namespace ‘NodeJS’ has no exported member ‘TypedArray’.: 尝试
yarn add --dev @types/node
Cannot invoke an object which is possibly ‘undefined’ 通常是在调用一个可能为undefined的对象的方法的时候出现,需要对方法也是用问号表达式:
props.obj?.click?.()
npm ERR! integrity checksum failed when using sha1: wanted … but got …: 尝试执行
1
2npm cache clean -force
npm cache verify从Github私有仓库安装: 需要在github生成token,然后放入
.npmrc
中:1
2@optionsai:registry=https://npm.pkg.github.com/
//npm.pkg.github.com/:_authToken=这里就是tokennodejs如何退出进程
1
process.exit()
nodejs中直接使用await报错:
SyntaxError: await is only valid in async functions and the top level bodies of modules
1
2
3
4
5
6
7// 将其修改为一个异步方法
async function run() {
// 在这里使用 await
const result = await someAsyncFunction();
console.log(result);
}
run()/usr/lib/libcurl.dylib (No such file or directory): 在mac上安装失败,可以尝试
1
2brew install curl-openssl
export PATH="/opt/homebrew/opt/curl/bin:$PATH" >> ~/.zshrc
扩展阅读
N-club: 使用Koa + MongoDB + Redis搭建的论坛系统