简介
nodejs 并不是JavaScript
应用,也不是编程语言,因为编程语言使用的JavaScript
,Nodejs是 JavaScript
的运行时。
Node.js并不是JavaScript应用:这里的"JavaScript应用"通常指用JavaScript编写的程序或软件。而Node.js本身并不是用JavaScript编写的一个应用程序;它是一个提供环境让JavaScript应用程序运行的平台。
Node.js也不是编程语言:编程语言是一种用于编写程序的标准化通信方法,例如JavaScript、Python和C++等。Node.js并不引入新的编程语言,它使用的是JavaScript这门已经存在的语言。
Node.js是JavaScript的运行时:运行时(runtime)指的是程序运行时的环境,它提供了程序运行所需的内置库、工具和其他资源。Node.js为JavaScript提供了一个运行时环境,这意味着它让JavaScript代码可以在服务器端运行,而不仅仅是在浏览器中。在此之前,JavaScript主要用于浏览器环境中,用于增强网页的交互性。Node.js的出现扩展了JavaScript的使用范围,让开发者可以用JavaScript编写服务器端软件,进行文件操作,以及进行网络通信等。
下载安装
推荐下载LTS长期维护版本,适合生产环境使用
尝鲜版本会包含最新的功能和实验性改动,更新比较频繁,通常在下一个主要版本发布后不久,当前版本就会停止支持,如果你想体验最新的api或是特性你可以选择它
当然你还可以下载指定版本,后面会推荐使用node的版本工具切换node版本会比较方便
推荐下载 msi 的镜像文件,安装时会自动配置环境变量,zip 压缩包的形式则要自己手动配置环境变量
安装完成以后可以在命令行查看是否安装成功,如果安装成功会显示对应安装的版本
国内用户通过官网下载一般速度很慢,安装后部分用户还会遇到一些权限问题 (导致执行 node 得加 sudo
切换管理员权限),
同时在实际开发场景中,一般会接触到多个项目,每个项目对 Node 的版本要求也是不一样的,所以咱需要一个 Node.js 的版本管理工具
当然如果就想使用安装包安装的话,推荐使用国内镜像:npmmirror 进行下载,速度更快,无需魔法
node版本管理工具一般比较流行的有
- nvm:基于 Shell 脚本实现,老牌的 Node.js 包管理工具;
- fnm:快速简便的 Node.js 版本管理器,使用 Rust 编写;
- volta:快速无缝地安装和运行任何 JS 工具!Volta 是在 Rust 中构建的,并作为一个快速的静态二进制运行。
nvm下载
打开浏览器输入nvm,进入releases资源下载安装包,之后的操作难度非常大,一定要看仔细了,漏看一步就安装失败,直接就是无脑下一步就行
检查是否安装成功
fnm安装
全程使用管理员权限的 PowerShell 操作
使用 Chocolatey 进行安装 (Chocolatey 是 windows 上的软件包管理工具)
如果没有 choco
指令,可以运行下述脚本一键安装 (这段脚本在官网也有)。
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
接下来是安装 fnm
,
choco install fnm
配置环境变量
使用 powershell
将下面的内容添加到 ~\Documents\PowerShell\Microsoft.PowerShell_profile.ps1
中
也可通过 $PROFILE
获取到这个文件的路径
volta安装
同样需要通过安装包进行安装
同样的一路下一步
检查是否安装成功
三者安装其中一个即可,安装多个会导致相互冲突
设置镜像源
nvm
① 设置镜像源
先设置国内镜像源,加快安装速度。
# linux 和 mac使用下面这条
export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node
# windows 使用
nvm node_mirror https://npmmirror.com/mirrors/node/
② 安装 Node
安装目标版本
nvm install v18.16.0
③ 查看已安装 Node 版本
nvm ls
切换至其他版本
nvm use v16.17.0
安装指定版本
nvm install v16.20.0
卸载指定版本
nvm uninstall v16.20.2
更多指令见官方文档 nvm-sh,nvm-windows
fnm
① 设置国内镜像源
export FNM_NODE_DIST_MIRROR="https://npmmirror.com/mirrors/node"
② 安装 Node
将需要安装的版本记录到文件里 .node-version
。
echo 18.16.0 >.node-version
执行安装。
fnm install
③ 查看已安装的版本
fnm list
④ 切换版本
fnm use 16
fnm use 18
更多指令详见官方文档 fnm:docs/commands.md
volta
暂不支持修改 Node 镜像源,但可以通过设置终端代理加速下载,前提是自己拥有代理服务。
# 终端中执行如下指令,临时设置变量
export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890
① 安装目标版本
volta install node@18.16.0
② 查看已安装版本
volta list node
③ 切换版本
切换全局默认版本,同样执行 install 指令 (已存在的不会重复安装)
volta install node@version
# demo
volta install node@18
volta install node@18.16.0
设置项目默认版本,也可以为某个项目设置要使用的版本 (相关配置会自动添加到 package.json
文件中)。
volta pin node@16
这样针对多人协作项目也能保持版本一致 (前提是都用 volta),
更多指令详见官方文档 volta
npm
npm是什么?
NPM (Node.js Package Manager) 是 Node.js 的包管理工具,它可以方便地安装、更新、卸载和管理开发中需要用到的各种包和模块
NPM 会随 Node.js 的安装一同被下载,所以这个不需要单独安装啦
- 类似于
PHP
的工具:Composer
。它是 PHP 的包管理器,可以用于下载、安装和管理 PHP 的依赖项,类似于 npm。 - 类似于
Java
的工具:Maven
。它是 Java 的构建工具和项目管理工具,可以自动化构建、测试和部署 Java 应用程序,类似于 npm 和 webpack 的功能。 - 类似于
Python
的工具:pip
。它是 Python 的包管理器,可以用于安装和管理 Python 的依赖项,类似于 npm。 - 类似于
Rust
的工具:Cargo
。它是 Rust 的包管理器和构建工具,可以用于下载、编译和管理 Rust 的依赖项,类似于 npm 和 Maven 的功能
可以通过 npm -v 查看 npm 的版本
配置国内镜像源
npm 默认的镜像源地址是 https://registry.npmjs.org/
,
国内访问较慢,通常会使用淘宝开源的镜像站 https://registry.npmmirror.com/
查看当前的镜像源。
npm config get registry
设置为淘宝源。
npm config set registry https://registry.npmmirror.com/
使用镜像源管理工具
在实际开发过程中可能会有频繁修改镜像源的场景,每次都手动维护,相对比较麻烦
nrm
安装
npm install -g nrm
主要命令:
- list:列出所有可用的源。
nrm ls
- use:切换到指定的源。
nrm use taobao
- add:添加一个新的源。
nrm add <registry-name> <url>
- del:删除一个已配置的源。
nrm del <registry-name>
- test:测试已配置源的响应时间。
nrm test npm
yrm
yrm 类似于 nrm,但它专为 yarn 设计。它允许用户切换 yarn 使用的注册中心源
安装
npm install -g yrm
所有的命令和上面的 nrm 一样
常用npm指令
init
,install
,update
,uninstall
,view
,run
init
初始化 Node.js 项目,通常配合 -y
参数忽略提示快速创建一个项目
npm init -y
会自动在当前目录下创建 package.json
描述文件
package.json
文件的配置后面会讲到
install
npm install
(或简写为 npm i
)是用来安装项目所需的依赖。此命令根据 package.json
文件中列出的依赖关系安装所有必要的包。
-
安装项目依赖: 在项目根目录下运行,安装
package.json
中列出的所有依赖:npm install
-
安装特定包: 安装一个包并将其添加到
package.json
的依赖列表中:npm install 包名
-
安装开发依赖: 安装一个仅在开发时需要的包:
npm install 包名 --save-dev // 简写为 npm i 包名 -D
全局安装
添加 -g
参数,
对于一些带有 CLI 指令的包,通常使用这个参数,
比如前面介绍的 yrm
。
npm i -g yrm
全局安装和本地安装:small_orange_diamond:
全局安装的包可以在计算机的任何位置使用,因为它们被添加到系统的环境变量中,对于常用的 CLI 工具,如 create-react-app
或 vue create
,全局安装意味着你可以在任何目录下直接使用它们启动新项目,无需每个项目单独安装
本地安装的包被安装在项目的 node_modules
目录中,只有在该项目的目录下的脚本才能访问它们,项目的依赖关系会被记录在项目的 package.json
文件中
update
npm update
命令用于更新项目依赖。这个命令会检查 package.json
文件中列出的所有依赖,并尝试升级到符合版本规则的最新版本
-
更新所有依赖:
npm update
-
更新特定包:
npm update 包名
uninstall
npm uninstall
命令用于从你的项目中移除一个已安装的包,并自动更新 package.json
和 package-lock.json
文件。
-
移除一个包
npm uninstall 包名
或者手动去package.json文件里面删除指定依赖后重新执行 npm i
view
npm view
命令用于查看关于 npm 包的详细信息,如版本号、依赖、许可证等
-
查看包的信息:
npm view 包名
-
查看特定字段: 如查看包的所有可用版本:
npm view 包名 versions
run
npm run
命令用于执行 package.json
中定义的脚本。这些脚本可以是测试、构建项目或其他任何通过命令行运行的任务。
-
运行脚本
-
如果你的
package.json
中有如下脚本定义:"scripts": { "start": "node app.js", "test": "mocha" }
使用下面的命令来运行它们:
npm run start # 运行应用 npm run test # 运行测试
当然一个脚本里也可以写多条指令用 &&
分割,表示执行完当前命令后继续执行下一条
{
"scripts": {
"multiple":"node test.js && npm run hello && npm run test"
}
}
package.json文件
package.json
是 Node.js 项目中的配置文件,文件包含了项目的基本信息,如项目名称、版本、描述、入口文件、脚本、依赖等
1. name
-
用途:项目的名称。
-
格式:小写字符串,可以包含破折号(-)和下划线(_)。
"name": "my-project"
2. version
-
用途:项目的当前版本。
-
格式:遵循语义化版本控制(SemVer),格式为
主版本号.次版本号.修订号
。主版本号就是项目的一些重大更新,比如 Vue2 全面升级到了 Vue3 版本, React17 升级到了 React18
次版本号就是开发了一个新的功能上线了,比如语音通话什么之类的
修订号就是修复了项目目前存在的问题,bug
"version": "1.0.0"
3. description
-
用途:项目的简短介绍
-
格式:字符串。
"description": "A sample Node.js project."
4. main
-
用途:项目的入口文件。
-
格式:指向一个 JavaScript 文件的路径
"main": "index.js"
5. scripts
-
用途:定义了一系列可以运行的脚本命令
-
格式:键值对,键是命令名,值是要运行的命令, 后面可以是文件夹里面的文件,比如
nodemon src/index.js
-
里面出现特殊字符需要进行转义
\
, 可以使用&&
连续执行多条命令"scripts": { "start": "node app.js", "test": "echo \"Error: no test specified\" && exit 1" }
6. repository
-
用途:指明项目的存储仓库。
-
格式:可以是一个字符串或对象,通常包含类型(如 git)和 URL。
"repository": { "type": "git", "url": "https://github.com/user/repo.git" }
7. keywords
-
用途:一个关键字数组,方便他人搜索和发现该项目,在 npm 中搜索时就会出现这个关键词所有的包
-
格式:字符串数组。
"keywords": ["node", "npm", "example"]
8. author
-
用途:项目的作者信息。
-
格式:一个字符串或包含
name
、email
和url
的对象。"author": "John Doe <john.doe@example.com> (http://johndoe.com)"
9. license
-
用途:声明项目的许可证类型。
-
格式:项目的许可证类型,可以是自定义的许可证类型或者常见的开源许可证(如 MIT、Apache 等)
"license": "MIT"
10. dependencies 和 devDependencies
-
用途:项目所依赖的 npm 包。
-
dependencies
标明生产环境下需要用到的包 (运行这个包必备的外部其它依赖), -
devDependencies
标明开发环境下需要用到的包 (开发这个包时才用到的依赖)。在实际开发中,通常会将开发依赖与生产依赖分开,以便减小生产环境的包大小,并提高构建和部署的速度。
-
-
格式:键值对,键是包名,值是版本号。
"dependencies": { "express": "^4.17.1" }, "devDependencies": { "nodemon": "^2.0.4" }
版本格式介绍
在不指定版本安装时,版本前面会附带一个 ^
,除了它还有 ~
。
"express": "^4.18.2"
"express": "~4.18.2"
"express": "4.18.2"
~
符号:保持主版本号和次版本号不变,只更新小版本号。例如"~1.2.3"
表示安装 1.2.x 系列的最新版本;^
符号:保持主版本号不变,更新次版本和小版本号。例如"^1.2.3"
表示安装 1.x.x 系列的最新版本。
这样做的目的是提高依赖包的兼容性。使用 ^
或 ~
符号,可以在不破坏 API 的情况下,获取到最新的修复和功能更新。(当然只在包非常遵循前面说的版本更新规范前提下),
实际情况可能小版本也会带来 break change
,
这个问题在后面说的 package-lock.json
中会得到一定的解决
node_modules文件夹
node_modules
文件夹是项目依赖库(packages)的存放地。当你使用 npm 安装依赖时,这些依赖及其所有子依赖都会被下载到这个文件夹中。每个依赖都是作为一个子文件夹存储,其中包含了该依赖的代码和其自身的 node_modules
文件夹
Node.js 在运行时会查找 node_modules
文件夹来解析项目中使用的模块,无论是直接依赖还是间接依赖
package-lock.json文件
package-lock.json
主要用于锁定项目依赖的版本号,以确保在不同的机器和环境中安装相同的依赖和版本
它的作用主要有以下几个方面:
- 一致性:确保在不同的机器和环境中安装相同的依赖版本;
- 安装提速:文件记录了依赖包的具体版本号和依赖关系,因此在执行
npm install
命令时,npm 可以直接从缓存中读取已经下载的依赖包,从而加速依赖安装; - 稳定性:可以更加准确地控制项目的依赖版本,从而提高项目的稳定性和可靠性;如果不使用
package-lock.json
,则每次安装依赖时,npm 可能会自动更新依赖包的版本,这可能会引入 bug 或导致行为发生变化,从而导致项目出现问题;
.npmrc 介绍
.npmrc
文件是 NPM 的配置文件,它包含了一些 NPM 的配置信息,比如代理、镜像、命令别名等。通过修改 .npmrc
文件,可以更改 NPM 的默认行为。
全局中,.npmrc
文件通常位于用户主目录下 (Linux 和 Mac 是 ~/.npmrc
,Windows 是 %USERPROFILE%/.npmrc
)。
也可以在项目根目录下创建一个 .npmrc
文件,单独设置当前项目的 npm 的配置信息
例如修改 registry
配置,让项目协作同学不用主动设置镜像源的地址,也能和自己保持一致。
# .npmrc
registry=https://registry.npmjs.org/
在这个目录下获取到的 registry
和其它目录就会不同,
npx
npx是一个命令行工具,它是npm 5.2.0版本中新增的功能。它允许用户在不安装全局包的情况下,运行已安装在本地项目中的包或者远程仓库中的包。
npx的作用是在命令行中运行node包中的可执行文件,而不需要全局安装这些包。这可以使开发人员更轻松地管理包的依赖关系,并且可以避免全局污染的问题。它还可以帮助开发人员在项目中使用不同版本的包,而不会出现版本冲突的问题。
npm与npx的区别
npm:用于安装包到 node_modules
目录或全局安装。全局安装的包可以在任何地方运行,但这会使你的系统中的包版本固定下来
npx: 允许你运行包而无需先安装它们。npx 在执行后通常会清除这些包,除非它们已经在本地安装