物联网服务NodeJs-5天学习第一天篇② —— 安装NodeJs环境以及VsCode开发工具
Posted 单片机菜鸟哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了物联网服务NodeJs-5天学习第一天篇② —— 安装NodeJs环境以及VsCode开发工具相关的知识,希望对你有一定的参考价值。
【NodeJs-5天学习】第一天篇② —— 安装环境以及开发工具
- 1、Node.js环境安装
- 2、VSCode环境安装
- 3、总结
面向读者群体
- ❤️ 电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识 ❤️
- ❤️ 业余爱好物联网开发者,有简单技术基础,想针对硬件功能构造简单的服务器❤️
- ❤️ 本篇创建记录 2023-03-12 ❤️
- ❤️ 本篇更新记录 2023-03-12 ❤️
技术要求
- 有HTML、CSS、JavaScript基础更好,当然也没事,就直接运行实例代码学习
专栏介绍
- 通过简短5天时间的渐进式学习NodeJs,可以了解到基本的服务开发概念,同时可以学习到npm、内置核心API(FS文件系统操作、HTTP服务器、Express框架等等),最终能够完成基本的物联网web开发,而且能够部署到公网访问。
🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝
1、Node.js环境安装
在上一讲中我们知道
Node.js
是一个基于ChromeV8
引擎的javascript运行环境
那么,我们首先把这个运行环境安装起来,步骤也非常简单。
1.1 下载安装文件
点击 下载链接
建议下载
长期支持版本
msi是什么文件?它的意思就是MicroSoft installer
(微软安装器)。大多数我们安装软件,是exe格式的可执行文件,那exe和msi有什么区别?
- MSI更全面,更自动化,比如,自动注册到系统注册表,可以管理软件的安装,卸载,更新等。
- EXE更灵活,配置性更强,不过这个是需要开发者做一些额外的工作。
这里window系统我们就下载msi
版本。
1.2 安装步骤
找到我们下载的文件,直接双击它。
点击next 下一步
勾选,我接受许可协议(使用人家的东西,就得接受人家的许可声明)
点击next,下一步
安装路径,我的是默认在c盘的Program Files的nodejs目录下。平时我们安装软件,应该也看到过这Program Files,它表示的是,64位软件的默认安装目录。Program Files(x86)表示32位软件的安装默认路径。如果我们想换个目录,点击Change
(改变),修改安装路径。这里我们不做多余的操作,默认安装路径。点击下一步
我们可以在这个步骤里,Nodejs安装哪些东西。
- Node.js runtime 运行环境
- npm package manager(非常重要,
npm包管理
)
这是Nodejs默认的包管理工具,它有什么作用呢?
我们知道,windows操作系统,需要安装一个软件的话,要去百度查找,然后进入网站,下载,安装。
手机上我们要安装某一个app,也要到app应用商城查找,然后下载安装。
那这里引申出一个软件知识,所有的软件包,都放到一个地方,然后使用专门的工具,去这里下载。
所以,ndoejs安装一些软件包(第三方库),使用的就是npm
。
点击Next下一步
点击Next下一步
点击Install,稍微等待一下
安装完成。cmd串口看看版本是否正确。输入node -v
打印nodejs的版本 V16.15.1 ,表示安装成功。
同时,我们也打开安装目录看看有什么文件
npm
表示我们的包管理,这是一个非常应用广泛的工具。
node_modules
表示我们包下载缓存的地方(后面我们会根据项目需求来下载对应的包)
1.3 常规配置,主要是NPM
安装完NodeJs环境之后,我们可以做一些常规配置工作,特别是了解npm 工具。
1.3.1 查看配置
window cmd(win+R运行cmd进入命令提示符窗口)输入
npm config ls -ls
1.3.2 配置国内下载镜像
有时候,我们会发现,npm下载安装包的时候,速度异常缓慢!
直接看配置,找到:
- 原始配置
这个网址在国外,下载速度会受限。那么,怎么解决呢?
直接使用国内大公司提供的镜像。
使用淘宝的npm镜像地址
https://registry.npm.taobao.org
但是,一般我们不会直接设置,需要能够支持切换两个仓库
(官方仓库、国内仓库)。
NPM仓库:
- https://www.npmjs.com/ 官方NPM仓库(外网可能慢点)
- https://npmmirror.com/ 国内NPM镜像(网速更快)
一般情况下,我们会用npm
和cnpm
命令来区分官方仓库和国内仓库。
- 当我们用
npm
命令时,表示从官方仓库下载包
- 当我们用
cnpm
命令时,表示从国内仓库下载包
。(国内仓库每10分钟从官方仓库同步包过来,基本上可以理解为一样)
这两者除了名字不一样,命令参数都是一样。主要是区分仓库。
npm命令是安装NodeJs环境的时候就已经自带了,那么我们只需要配置一下cnpm即可。
执行命令
npm install -g cnpm --registry=https://registry.npm.taobao.org
这样就可以根据自己的需要来切换npm或者cnpm命令。
1.3.3 尝试下载安装包
后期我们会经常和express包打交道,这里下载一下:
cmd(win+R运行cmd进入命令提示符窗口)输入
npm install express -g
- 这个包用于构造web服务器相关请求,非常有用
那我们这个包会下载到什么地方?可以查看一下配置信息
cmd(win+R运行cmd进入命令提示符窗口)输入npm config ls -ls
- 找到
globalconfig
1.4 NPM 使用介绍
在开发NodeJs服务中,我们经常性会和NPM工具打交道,并且会从NPM仓库去下载很多有用的第三方包(基于内置API基础上封装出来的代码
),协助我们完成项目开发。那么我们就必须先了解一些基本命令。
建议大伙都输入一下命令查看一下效果
1.4.1 查看当前npm版本 —— npm -v、npm --version、npm -version
1.4.2 查看模块安装信息
1.4.2.1 查看所有全局安装的模块 —— npm list -g
npm list -g
注意:
- 区分一下
全局安装
和本地项目安装
的区别
全局安装指的是所有NodeJs项目都能复用,不需要每次调用安装命令;
本地项目安装指的是特定NodeJs项目能用,其他项目要用只能再次安装。
简而言之就是包的使用范围。
1.4.2.2 查看某个模块的版本号 —— npm list 模块名
npm list 模块名
比如:我们使用 npm 命令查看常用的 Node.js web框架模块 express:
npm list express
1.4.3 查看npm配置 —— npm config ls -ls
npm config ls -ls
一般我们更多的是关注npm仓库的配置信息。
1.4.4 使用 npm 命令安装模块 —— npm install / i
npm 安装 Node.js 模块语法格式如下:
npm install/i <Module Name>
比如:我们使用 npm 命令安装常用的 Node.js web框架模块 express:
npm install express
或者npm i express
通过以上命令安装好之后,express 包就放在了工程目录下的 node_modules
目录中,因此在代码中只需要通过 require('express')
(相当于我们c语言中的include
)的方式引入就好,无需指定第三方包路径。
但是上面方式仅仅是某一个项目工程有效,如果其他工程要用,那么又得继续重新安装一遍。所以,npm为了解决这种问题,区分了本地项目安装
和 全局安装
。
1.4.4.1 本地项目安装 —— npm install 模块名
npm install <module name>
比如:我们使用 npm 命令安装常用的 Node.js web框架模块 express:
npm install express
这里会提示我们没有 package.json,这个文件是我们创建NodeJs项目是自动生成的,后面会讲解。
对于本地安装,需要注意:
- 将安装包放在 ./
node_modules
下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
- 可以通过 require() 来引入本地安装的包。
1.4.4.2 全局安装 —— npm install 模块名 -g
npm install <module name> -g
- g表示global
比如:我们使用 npm 命令安装常用的 Node.js web框架模块 express:
npm install express -g
对于本地安装,需要注意:
- 将安装包放在你 node 的安装目录。
- 可以通过 require() 来引入本地安装的包。
1.4.4.3 下载当前项目所依赖的包(******** 非常重要) —— npm install
假设我们是从网上下载别人的NodeJs项目,一般你会发现基本上是没有 node_modules 目录(一考虑项目大小,二考虑版本更新),这时候我们需要根据项目本身的 package.json
来安装整个项目的依赖包。
package.json 位于模块的目录下,用于定义包的属性
,并且依赖于它最终生成一个 package-lock.json
文件。这里博主以一个demo为例:
package.json文件:
"name": "hellodemo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts":
"test": "echo \\"Error: no test specified\\" && exit 1"
,
"author": "",
"license": "ISC",
"dependencies":
"express": "^4.18.1"
package-lock.json文件(不需要查看,了解即可):
"name": "hellodemo",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies":
"accepts":
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
"integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
"requires":
"mime-types": "~2.1.34",
"negotiator": "0.6.3"
,
"array-flatten":
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
"integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
,
"body-parser":
"version": "1.20.0",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
"integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
"requires":
"bytes": "3.1.2",
"content-type": "~1.0.4",
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
"qs": "6.10.3",
"raw-body": "2.5.1",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
,
"bytes":
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
,
"call-bind":
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"requires":
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
,
"content-disposition":
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
"requires":
"safe-buffer": "5.2.1"
,
"content-type":
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
,
"cookie":
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
"integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
,
"cookie-signature":
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
,
"debug":
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires":
"ms": "2.0.0"
,
"depd":
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
,
"destroy":
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
,
"ee-first":
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
"integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
,
"encodeurl":
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
,
"escape-html":
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
"integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
,
"etag":
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
,
"express":
"version": "4.18.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
"integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
"requires":
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
"body-parser": "1.20.0",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.5.0",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
"finalhandler": "1.2.0",
"fresh": "0.5.2",
"http-errors": "2.0.0",
"merge-descriptors": "1.0.1",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"path-to-regexp": "0.1.7",
"proxy-addr": "~2.0.7",
"qs": "6.10.3",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "0.18.0",
"serve-static": "1.15.0",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
"utils-merge": "1.0.1",
"vary": "~1.1.2"
,
"finalhandler":
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
"integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
"requires":
"debug": "2.6.9",
"encodeurl": "~1.0.2",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
"statuses": "2.0.1",
"unpipe": "~1.0.0"
,
"forwarded":
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
,
"fresh":
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
"integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
,
"function-bind":
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
,
"get-intrinsic":
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
"integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
"requires":
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.3"
,
"has":
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"requires":
"function-bind": "^1.1.1"
,
"has-symbols":
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
,
"http-errors":
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
"requires":
"depd": "2.0.0",
"inherits": "2.0.4",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"toidentifier": "1.0.1"
,
"iconv-lite":
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"requires":
"safer-buffer": ">= 2.1.2 < 3"
,
"inherits":
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
,
"ipaddr.js":
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
,
"media-typer":
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
,
"merge-descriptors":
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
"integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
,
"methods":
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
,
"mime":
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
,
"mime-db":
"version": "1.52.0",
"resolved"物联网服务NodeJs-5天学习第一天篇① —— 第一次认识NodeJs
物联网服务NodeJs-5天学习第一天篇③ —— VsCode上运行第一个NodeJs 程序,配置自动重启插件 nodemon
物联网服务NodeJs-5天学习第三天实战篇② ——基于物联网的WiFi自动打卡考勤系统
物联网服务NodeJs-5天学习第四天存储篇② ——NodeJs连接操作mysql 8.0