node.js入门(一)

413 阅读14分钟

简介

nodejs 并不是JavaScript应用,也不是编程语言,因为编程语言使用的JavaScript,Nodejs是 JavaScript的运行时。

node官网.png

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版本会比较方便

指定版本.png

推荐下载 msi 的镜像文件,安装时会自动配置环境变量,zip 压缩包的形式则要自己手动配置环境变量

安装完成以后可以在命令行查看是否安装成功,如果安装成功会显示对应安装的版本

检查是否安装成功.png

国内用户通过官网下载一般速度很慢,安装后部分用户还会遇到一些权限问题 (导致执行 node 得加 sudo 切换管理员权限),

同时在实际开发场景中,一般会接触到多个项目,每个项目对 Node 的版本要求也是不一样的,所以咱需要一个 Node.js 的版本管理工具

当然如果就想使用安装包安装的话,推荐使用国内镜像:npmmirror 进行下载,速度更快,无需魔法

node版本管理工具一般比较流行的有

  • nvm:基于 Shell 脚本实现,老牌的 Node.js 包管理工具;
  • fnm:快速简便的 Node.js 版本管理器,使用 Rust 编写;
  • volta:快速无缝地安装和运行任何 JS 工具!Volta 是在 Rust 中构建的,并作为一个快速的静态二进制运行。

nvm下载

打开浏览器输入nvm,进入releases资源下载安装包,之后的操作难度非常大,一定要看仔细了,漏看一步就安装失败,直接就是无脑下一步就行

检查是否安装成功

nvm安装检查.png

fnm安装

全程使用管理员权限的 PowerShell 操作

使用 Chocolatey 进行安装 (Chocolatey 是 windows 上的软件包管理工具)

查看 choco.png

如果没有 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安装

同样需要通过安装包进行安装

安装volta.png

同样的一路下一步

volta安装.png

检查是否安装成功

检查volta安装成功.png

三者安装其中一个即可,安装多个会导致相互冲突

设置镜像源

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查看node所有安装版本.png

切换至其他版本

nvm use v16.17.0

nrm-use.png 安装指定版本

nvm install v16.20.0

卸载指定版本

nvm uninstall v16.20.2

更多指令见官方文档 nvm-shnvm-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),

img

更多指令详见官方文档 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.png

配置国内镜像源

npm 默认的镜像源地址是 https://registry.npmjs.org/

国内访问较慢,通常会使用淘宝开源的镜像站 https://registry.npmmirror.com/

查看当前的镜像源。

npm config get registry

查看镜像源.png

设置为淘宝源。

npm config set registry https://registry.npmmirror.com/

使用镜像源管理工具

在实际开发过程中可能会有频繁修改镜像源的场景,每次都手动维护,相对比较麻烦

nrm

安装

npm install -g nrm
主要命令:
  • list:列出所有可用的源。
        nrm ls

nrm.png

  • use:切换到指定的源。
        nrm use taobao

nrm-use.png

  • add:添加一个新的源。
        nrm add <registry-name> <url>
  • del:删除一个已配置的源。
        nrm del <registry-name>
  • test:测试已配置源的响应时间。
        nrm test npm

nrm-test.png

yrm

yrm 类似于 nrm,但它专为 yarn 设计。它允许用户切换 yarn 使用的注册中心源

安装

npm install -g yrm

所有的命令和上面的 nrm 一样

常用npm指令

initinstallupdateuninstallviewrun

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-appvue create,全局安装意味着你可以在任何目录下直接使用它们启动新项目,无需每个项目单独安装

本地安装的包被安装在项目的 node_modules 目录中,只有在该项目的目录下的脚本才能访问它们,项目的依赖关系会被记录在项目的 package.json 文件中

update

npm update 命令用于更新项目依赖。这个命令会检查 package.json 文件中列出的所有依赖,并尝试升级到符合版本规则的最新版本

  • 更新所有依赖

    npm update
    
  • 更新特定包

    npm update 包名
    

uninstall

npm uninstall 命令用于从你的项目中移除一个已安装的包,并自动更新 package.jsonpackage-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

  • 用途:项目的作者信息。

  • 格式:一个字符串或包含 nameemailurl 的对象。

    "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 和其它目录就会不同,

img

npx

npx是一个命令行工具,它是npm 5.2.0版本中新增的功能。它允许用户在不安装全局包的情况下,运行已安装在本地项目中的包或者远程仓库中的包。

npx的作用是在命令行中运行node包中的可执行文件,而不需要全局安装这些包。这可以使开发人员更轻松地管理包的依赖关系,并且可以避免全局污染的问题。它还可以帮助开发人员在项目中使用不同版本的包,而不会出现版本冲突的问题。

npm与npx的区别

npm:用于安装包到 node_modules 目录或全局安装。全局安装的包可以在任何地方运行,但这会使你的系统中的包版本固定下来

npx: 允许你运行包而无需先安装它们。npx 在执行后通常会清除这些包,除非它们已经在本地安装