当前位置: 首页 > 后端技术 > Node.js

Node与Node环境

时间:2023-04-03 16:20:45 Node.js

走在前端大道上),可以方便的在机器上安装和维护多个Node版本。那么为什么需要多个版本呢?场景有很多,比如:你可能同时在做两个项目,不同项目使用的node版本不一样;或者您想使用较新的版本来做一些实验。有需要的同学可以查看我之前总结的文章Windows下安装node版本控制工具nvm2.npm包镜像地址切换工具。nrmnrm是npmregistrymanager,也就是npm镜像源管理工具。有时候国外的资源太慢了,我们可以用这个来切换镜像源。$npminstall-gnrm使用nrmls查看我们可以切换的地址$nrmls*npm-----https://registry.npmjs.org/cnpm----http://r.cnpmjs.org/淘宝-https://registry.npm.taobao.org/nj------https://registry.nodejitsu.com/rednpm-http://registry.mirror.cqupt.edu.cnskimdb-https//skimdb.npmjs.com/registry提示:里面的*代表当前地址options][command]命令:ls列出所有注册表useChangeregistrytoregistryadd[home]添加一个自定义注册表del删除一个自定义注册表home[browser]打开带有可选浏览器测试的注册表主页[registry]显示一个或所有注册表的响应时间help打印此帮助选项:-h,--help输出使用信息-V,--version输出版本号Registriesnpmcnpmnodejitsutaobaorednpm3.npm包版本更新工具npm-check-updatesnpm-check-updates可以将package.json或bower.json中的依赖升级到最新版本安装npminstall-gnpm-check-updates显示当前目录中项目的所有新依赖项:$ncuexpress4.12.x→4.13.xmulter^0.1.8→^1.0.1react-bootstrap^0.22.6→^0.24.0react-a11y^0.1.1→^0.2.6webpack~1.9.10→~1.10.5升级项目的包文件:$ncu-uexpress4.12.x→4.13.x更多关于npm-check-updates4.npm更新$npmi-gnpm5.nodeprocessmanager刚开始Node.js开发的时候,我们想启动一个服务,使用node命令:nodemyapp但是node告诉我们server端的js代码只在node部分一旦被引用,就会被重新加载;如果node已经加载了某个文件,即使我们修改它,node也不会重新加载这个文件。那么,在开发过程中,我们如何才能像PHP一样修改某个文件呢?创建文件后,能不能直接刷新网页看看效果?方法有很多种,比如用Supervisor、pm2、forever等来管理。开发环境中的进程管理器Supervisor1是在开发过程中安装的。每次修改代码保存后,我们都需要手动重启程序才能查看修改的效果。使用supervisor可以解决这个繁琐的问题,全局安装supervisor。这里需要注意的一点是supervisor必须全局安装。如果不全局安装,错误的命令会提示全局安装。npm安装-gsupervisor2.最常见也是最快速的基本使用方式就是直接进入你的网站根目录执行:supervisormyapp这里需要说明的一点是无论你的网站服务启动文件在哪里,都必须在根目录下才能启动它。比如Express4.0中,启动文件位于./bin/www,那么我们启动的时候,必须在./:supervisorbin/www中执行,而不是进入bin目录下执行:supervisorwww。这种方式虽然可以启动,但是相当于把bin目录作为服务的根目录。一旦有涉及文件目录的操作,肯定会出错。另外,执行这条命令后,我们的网站服务就已经启动了;但需要注意的是,这种方式启动的服务默认会监听所有文件和文件夹的变化;一旦有变化,服务会在重启后出现一些问题:我们会在某些文件夹中存储一些日志文件,或者用户将附件上传到服务器;而这样的操作会导致服务器文件发生变化,必然导致节点服务器重启。试想一下,如果每次上传都重启一次,那么一旦用户操作变得频繁,服务器什么都不用做,每天重启就好了。因此,主管的这种工作方式只适用于调试阶段;甚至有些调试环境Neither都不合适(比如调试服务器在远程,网络状态不是很好的时候)。3、使用方法我们直接在命令行执行下面的命令,就会得到它的详细使用方法。如果主管不想监控某些文件夹,他可以使用-i参数。例如:如果我们要忽略根目录下的private文件夹,可以这样启动:supervisor-i./privatemyapp如果要忽略多个文件夹,用英文逗号隔开:supervisor-i./private,./otherdirmyapp生产环境中的进程管理器pm2,当我们的项目要部署到线上服务器时,不能简单的通过nodeindex或者supervisorindex来启动,因为我们断开SSH连接后服务就会终止,那么我们需要一个像pm2或forever这样的进程管理器。pm2是Node.js下的生产环境进程管理工具,也就是我们常说的进程守护工具,可以用于生产环境的自动重启、日志记录、错误警告等。pm2官方文档以pm2为例。全局安装pm2:首先需要安装pm2:npminstall-gpm2运行:pm2startwww.js或者修改package.json中的启动命令,然后运行npmstart通过pm2启动程序“scripts”:{"start":"pm2start./bin/www"}常用命令总结如下:installpm2npminstall-gpm2startapplicationpm2startapp.js列出所有应用程序pm2list查看资源消耗pm2monit查看某个应用程序statuspm2describe[appid]查看所有日志pm2logsrestartapplicationpm2restart[appid]stopapplicationpm2stop[appid]openapiaccesspm2web本节参考文章:1.pm22.详细版|使用Supervisor看守你的Node.js进程三、Supervisor和pm26.node基本介绍本章主要是学习Node.js概览-阮一峰的读书笔记,会根据自己的掌握情况简化描述,后续会补充其他书籍后续学习中没有提到的知识点。安装略6.1.1执行js脚本,比如当前目录下的demo.js。$nodedemo#或$nodedemo.js使用-e参数执行代码串。$node-e'console.log("HelloWorld")'HelloWorld6.1.2REPL环境在命令行中输入不带文件名的node命令,进入一个Node.jsREPL环境(Read–eval–print循环,“read-evaluate-output”循环),可以直接运行各种JavaScript命令。$node>1+12>REPL是Node.js与用户交互的shell。里面可以使用各种基本的shell功能,比如使用上下方向键遍历之前用过的命令。特殊变量下划线(_)表示上一条命令的返回结果。>1+12>_+136.1.3异步操作Node使用V8引擎处理JavaScript脚本。最大的特点是单线程运行,一次只能运行一个任务。这导致Node大量使用异步操作(asynchronousoption),即任务不是立即执行,而是插入到任务队列的尾部,待前面的任务运行完毕后再执行。由于这个特点,往往以回调函数(callback)的形式定义某个任务的后续操作。varisTrue=function(value,callback){if(value===true){callback(null,"Valuewastrue.");}else{callback(newError("值不正确!"));}}上面的代码将进一步的处理交给了回调函数callback。节点约定,如果一个函数需要回调函数作为参数,则回调函数是最后一个参数。另外,回调函数本身的第一个参数约定为上一步传入的错误对象。varcallback=function(error,value){if(error){returnconsole.log(error);}console.log(value);}上面代码中,callback的第一个参数是Error对象,第二个参数是真正的数据参数。这是因为回调函数主要用于异步操作。回调函数运行时,前面的操作已经结束,错误的执行栈早已消失。传统的错误捕获机制try...catch对于异步操作是不起作用的,所以只能将error交给回调函数处理。try{db.User.get(userId,function(err,user){if(err){throwerr}//...})}catch(e){console.log('哦不!');}在上面的代码中,db.User.get方法是一个异步操作。当抛出错误时,其所在的try...catch代码块可能已经运行完毕,会导致错误无法被捕获。所以,Node统一规定,一旦异步操作出错,就把error对象传递给回调函数。如果没有发生错误,则将null作为第一个参数传递给回调函数。这种写法有一个很大的好处,就是只要判断回调函数的第一个参数,就知道有没有错误。如果不为空,则一定有错误。此外,这允许错误通过层传播。if(err){//除了放过NoPermission错误外,其他错误都传递给下一个回调函数if(!err.noPermission){returnnext(err);}}6.1.4全局对象和全局变量Node提供了如下几个全局对象,所有模块都可以调用。global:表示Node所在的全局环境,类似于浏览器的window对象。需要注意的是,如果在浏览器中声明一个全局变量,实际上是在声明全局对象的一个??属性,比如varx=1相当于设置window.x=1,但是Node不是这样的,在至少在模块中不要这样(REPL环境的行为与浏览器一致)。在模块文件中声明varx=1,变量不是全局对象的属性,global.x等于undefined。这是因为模块的全局变量是模块私有的,不能被其他模块访问。process:该对象表示Node当前所在的进程,允许开发者与进程进行交互。console:指向Node内置的console模块,提供命令行环境下的标准输入和标准输出功能。Node还提供了一些全局函数setTimeout():用于在指定的毫秒数后运行回调函数。实际调用间隔还取决于系统因素。间隔的毫秒数在1毫秒到2,147,483,647毫秒之间(约24.8天)。如果超出这个范围,会自动改为1毫秒。此方法返回一个整数,表示新创建的计时器的编号。clearTimeout():用于终止由setTimeout方法创建的计时器。setInterval():用于每隔一定毫秒调用一次回调函数。由于系统因素,可能无法保证每次调用的间隔正好是指定的毫秒数,但只能大于这个间隔,绝不能小于它。指定的毫秒数必须是1到2,147,483,647(大约24.8天)之间的整数。如果超出这个范围,会自动改为1毫秒。此方法返回一个整数,表示新创建的计时器的编号。clearInterval():终止使用setInterval方法创建的计时器。require():用于加载模块。Buffer():用于操作二进制数据。Node提供了两个全局变量,都以两个下划线开头。__filename:指向当前运行的脚本文件名。__dirname:指向当前运行脚本所在的目录。此外,还有一些对象实际上是模块内部的局部变量。指向的对象因模块而异,但所有模块都适用,可以看作是伪全局变量,主要有module、module.exports、exports等。无法安装node-sass在安装node-sass的时候总会出现各种失败。正确姿势在项目目录下执行macOS系统,直接运行如下命令:SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/npminstallnode-sassWindows同学可以拆分成两条命令setSASS_BINARY_SITE=https://npm.taobao.org/mirror...npm安装node-sass